pax_global_header00006660000000000000000000000064151134340600014507gustar00rootroot0000000000000052 comment=a5e1c3d372e24c112fe2362056efdaf0f7609147 ruby-gnome-ruby-gnome-25972cb/000077500000000000000000000000001511343406000162145ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/.dir-locals.el000066400000000000000000000004321511343406000206440ustar00rootroot00000000000000((c-mode . ((c-file-style . "ruby") (indent-tabs-mode . nil) (show-trailing-whitespace . t))) (ruby-mode . ((show-trailing-whitespace . t))) (sh-mode . ((indent-tabs-mode . nil) (sh-indentation . 2) (sh-basic-offset . 2)))) ruby-gnome-ruby-gnome-25972cb/.dockerignore000066400000000000000000000000371511343406000206700ustar00rootroot00000000000000* !/Gemfile !/environment.yml ruby-gnome-ruby-gnome-25972cb/.env000066400000000000000000000014561511343406000170130ustar00rootroot00000000000000# Copyright (C) 2022 Ruby-GNOME 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 GITHUB_REPOSITORY=ruby-gnome/ruby-gnome ruby-gnome-ruby-gnome-25972cb/.github/000077500000000000000000000000001511343406000175545ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/.github/dependabot.yml000066400000000000000000000015771511343406000224160ustar00rootroot00000000000000# Copyright (C) 2023 Ruby-GNOME 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 version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" ruby-gnome-ruby-gnome-25972cb/.github/workflows/000077500000000000000000000000001511343406000216115ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/.github/workflows/doc.yml000066400000000000000000000032241511343406000231020ustar00rootroot00000000000000name: Document on: push: branches: - '**' - '!dependabot/**' tags: - '**' pull_request: jobs: build: name: Build runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 - uses: ruby/setup-ruby@v1 with: ruby-version: ruby bundler-cache: true - name: Install requirements run: | bundle exec ruby extconf.rb make -j$(nproc) make install - name: Generate document run: | GI_GIR_PATH=/usr/share/gir-1.0 \ bundle exec rake -m doc:generate find yard_docs \ -name '*.html' \ -exec sed -i -e 's/Generated on .* by/Generated by/g' '{}' ';' case ${GITHUB_REF} in refs/tags/*) version=${GITHUB_REF##refs/tags} ;; *) version=dev ;; esac mkdir -p public/doc rm -rf public/doc/${version} mv yard_docs public/doc/${version} if [ "${version}" != "dev" ]; then rm -rf public/doc/latest cp -a public/doc/${version} public/doc/latest fi - name: Publish Documentation on GitHub Pages if: github.event_name == 'push' && github.ref_name == 'main' uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./public keep_files: true # We can use this with v4 # force_orphan: true user_name: 'github-actions[bot]' user_email: 'github-actions[bot]@users.noreply.github.com' ruby-gnome-ruby-gnome-25972cb/.github/workflows/linux.yml000066400000000000000000000040671511343406000235020ustar00rootroot00000000000000name: Linux on: - push - pull_request jobs: test: name: Test strategy: fail-fast: false matrix: service: - almalinux-8 - almalinux-9 - almalinux-10 - alpine-linux - apache-arrow - arch-linux - conda # - fedora-arm32v7-rawhide - fedora-rawhide - ruby-3.1 - ruby-3.2 - ruby-3.3 - ruby-3.4 - ubuntu-22.04 - ubuntu-24.04 include: - service: apache-arrow timeout-minutes: 60 runs-on: ubuntu-latest timeout-minutes: ${{ matrix.timeout-minutes || 15 }} steps: - uses: actions/checkout@v6 - uses: docker/login-action@v3 if: | github.event_name == 'push' with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Pull Docker images run: | docker compose pull --ignore-pull-failures ${{ matrix.service }}-base || : docker compose pull --ignore-pull-failures ${{ matrix.service }} || : - name: Build Docker image run: | docker compose build ${{ matrix.service }} - name: Push Docker images if: | github.event_name == 'push' run: | docker compose push --ignore-push-failures ${{ matrix.service }} || : - name: Cache ccache if: | matrix.service == 'apache-arrow' uses: actions/cache@v4 with: path: .ccache key: arrow-ccache-docker-${{ matrix.service }}-${{ github.sha }} restore-keys: arrow-ccache-docker-${{ matrix.service }}- - name: Adjust permission for cache if: | matrix.service == 'apache-arrow' run: | mkdir -p .ccache chmod -R a+rwx .ccache - name: Register problem matchers run: | echo ::add-matcher::dockerfiles/problem-matchers.json - name: Run run: | docker compose run --rm ${{ matrix.service }} ruby-gnome-ruby-gnome-25972cb/.github/workflows/mac-os.yml000066400000000000000000000074111511343406000235160ustar00rootroot00000000000000name: macOS on: - push - pull_request jobs: test: name: Test runs-on: macOS-latest timeout-minutes: 30 steps: - uses: actions/checkout@v6 - uses: ruby/setup-ruby@v1 with: ruby-version: ruby - name: Install dependencies run: | brew install pkg-config bundle install - name: Build run: | bundle exec rake build # TODO: Fix stuck # - name: Test # run: | # bundle exec rake # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. apache-arrow: runs-on: macOS-latest timeout-minutes: 60 env: ARROW_BUILD_STATIC: OFF ARROW_BUILD_TESTS: OFF ARROW_BUILD_UTILITIES: OFF ARROW_AZURE: ON ARROW_DATASET: ON ARROW_FLIGHT: ON ARROW_FLIGHT_SQL: ON ARROW_GANDIVA: ON ARROW_GCS: ON ARROW_GLIB_GTK_DOC: true ARROW_GLIB_WERROR: true ARROW_HOME: /tmp/local ARROW_JEMALLOC: OFF ARROW_ORC: OFF ARROW_PARQUET: ON ARROW_S3: ON ARROW_WITH_BROTLI: ON ARROW_WITH_LZ4: ON ARROW_WITH_SNAPPY: ON ARROW_WITH_ZLIB: ON ARROW_WITH_ZSTD: ON steps: - uses: actions/checkout@v6 - name: Build run: | brew install pkg-config for package in glib2 gobject-introspection gio2; do pushd ${package} rake gem gem install pkg/*.gem popd done - uses: actions/checkout@v6 with: repository: apache/arrow path: arrow fetch-depth: 0 submodules: recursive - name: Install Homebrew Dependencies shell: bash run: | brew bundle --file=arrow/cpp/Brewfile brew bundle --file=arrow/c_glib/Brewfile - name: Install Ruby Dependencies run: | export MAKEFLAGS="-j$(sysctl -n hw.ncpu)" bundle install --gemfile arrow/c_glib/Gemfile bundle install --gemfile arrow/ruby/Gemfile for ruby_package_gemfile in arrow/ruby/*/Gemfile; do \ bundle install --gemfile ${ruby_package_gemfile} done - name: Setup ccache run: | arrow/ci/scripts/ccache_setup.sh - name: ccache info run: | echo "CACHE_DIR=$(ccache --get-config cache_dir)" >> $GITHUB_ENV - name: Cache ccache uses: actions/cache@v4 with: path: ${{ env.CACHE_DIR }} key: arrow-ccache-macos-${{ hashFiles('arrow/cpp/**') }} restore-keys: arrow-ccache-macos- - name: Build C++ run: | arrow/ci/scripts/cpp_build.sh $(pwd)/arrow $(pwd)/arrow/build - name: Build GLib run: | arrow/ci/scripts/c_glib_build.sh $(pwd)/arrow $(pwd)/arrow/build - name: Test GLib shell: bash run: | arrow/ci/scripts/c_glib_test.sh $(pwd)/arrow $(pwd)/arrow/build - name: Test Ruby shell: bash run: | arrow/ci/scripts/ruby_test.sh $(pwd)/arrow $(pwd)/arrow/build ruby-gnome-ruby-gnome-25972cb/.github/workflows/release.yml000066400000000000000000000022351511343406000237560ustar00rootroot00000000000000name: Release on: push: tags: - "*" jobs: github: name: GitHub runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 - name: Release run: | ruby \ -e 'print("## "); puts(ARGF.read.split(/^## /)[1])' \ NEWS.md > release-note.md title="$(head -n 1 release-note.md | sed -e 's/^## //')" tail -n +2 release-note.md > release-note-without-version.md gh release create \ ${GITHUB_REF_NAME} \ --discussion-category Releases \ --notes-file release-note-without-version.md \ --title "${title}" env: GH_TOKEN: ${{ github.token }} rubygems: name: RubyGems runs-on: ubuntu-latest timeout-minutes: 10 permissions: id-token: write environment: release steps: - uses: actions/checkout@v6 - uses: ruby/setup-ruby@v1 with: ruby-version: ruby - name: Build gems run: | rake gem:build - uses: rubygems/configure-rubygems-credentials@v1.0.0 - name: Push gems run: | rake gem:push ruby-gnome-ruby-gnome-25972cb/.github/workflows/windows.yml000066400000000000000000000023721511343406000240320ustar00rootroot00000000000000name: Windows on: - push - pull_request jobs: test: name: Test strategy: fail-fast: false matrix: ruby-version: - "3.2" - "3.3" - "3.4" runs-on: windows-latest env: RUBY_GNOME_CLUTTER_ENABLE: "no" RUBY_GNOME_CLUTTER_GDK_ENABLE: "no" RUBY_GNOME_CLUTTER_GSTREAMER_ENABLE: "no" RUBY_GNOME_CLUTTER_GTK_ENABLE: "no" RUBY_GNOME_GNUMERIC_ENABLE: "no" RUBY_GNOME_GOFFICE_ENABLE: "no" RUBY_GNOME_VTE3_ENABLE: "no" RUBY_GNOME_VTE4_ENABLE: "no" RUBY_GNOME_WEBKIT2_GTK_ENABLE: "no" RUBY_GNOME_WEBKIT_GTK_ENABLE: "no" RUBY_GNOME_WNCK3_ENABLE: "no" timeout-minutes: 45 steps: - uses: actions/checkout@v6 - uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby-version }} - name: Install dependencies run: | gem install erb rubygems-requirements-system test-unit - name: Install run: | ruby -rdevkit -S rake gem:install - name: "Test: glib2" run: | cd glib2 ruby -rdevkit test/run-test.rb - name: "Test: gobject-introspection" run: | cd gobject-introspection ruby -rdevkit test/run-test.rb ruby-gnome-ruby-gnome-25972cb/.gitignore000066400000000000000000000031021511343406000202000ustar00rootroot00000000000000# Copyright (C) 2011-2024 Ruby-GNOME 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 *.a *.bundle *.o *.pc *.so *.swp .RUBYARCHDIR.time .RUBYLIBDIR*.time .emacs.desktop .emacs.desktop.lock .gdb_history /*.tar.gz /*/.yardoc/ /*/ext/*/Makefile /*/ext/*/Makefile.lib /*/ext/*/mkmf.log /*/pkg/ /*/tmp/ /*/yard_docs/ /.ccache/ /Gemfile.local /Gemfile.lock /gdk3/ext/gdk3/rbgdkkeysyms.h /gio2/test/fixture/resource/ruby-gio2.gresource /gio2/test/fixture/schema/*/gschemas.compiled /glib2/ext/glib2/glib-enum-types.c /glib2/ext/glib2/glib-enum-types.h /gobject-introspection/ext/gobject-introspection/gobject-introspection-enum-types.c /gobject-introspection/ext/gobject-introspection/gobject-introspection-enum-types.h /gobject-introspection/ext/gobject-introspection/rbgiversion.h /gtk3/test/fixture/*.gresource /gtksourceview3/ext/gtksourceview3/rbgtksourceview3version.h /poppler/test/tmp/ /tmp/ /yard_docs/ ruby-gnome-ruby-gnome-25972cb/AUTHORS000066400000000000000000000070341511343406000172700ustar00rootroot00000000000000The Ruby-GNOME2 Project Team (in alphabetical order, M:Maintainer) ------------------------------------------------------------------------ Chikara Takamatsu Japanese Website, Website Guillaume Cottenceau Ruby/GLib, Ruby/GTK, Website. Dario Linsky German Website(M). Franz Burgmann German Website, Website, Provides some binary packages. Hiroshi IGARASHI rbbr, Technical advisor. Geoff Youngs Ruby/GTK, Ruby/GdkPixbuf, Ruby/GtkSourceView, Ruby/Pango, Ruby/GLib. Ruby-GNOME2 Icon, Website. Joachim Glauche Releases(M), since 0.17.0 Joao Pedrosa Portuguese-BR Website(M), Website, Ruby/GTK. Joshua Keith Tutorial, Website, Ruby-GNOME2 Icon. Junichiro Kita Ruby/GTK Tutorial(Japanese) (M) KATO Kazuyoshi Ruby/GTK(mainly gtk-demo), Ruby/GdkPixbuf, Ruby/GLib, Ruby/Libart. Kouhei Sutou Ruby/GnomePrint(M), Ruby/GnomePrintUI(M), Ruby/RSVG(M), Ruby/GdkPixbuf, Ruby/GnomeCanvas, Ruby/GTK, Ruby/Libart, Ruby/Pango, Ruby/GtkGLExt, Ruby/GLib. KUBO Takehiro Ruby/GNOME, Ruby/GnomeCanvas, Ruby/Libart, Ruby/GTK, Ruby/GLib. Laurent Sansonetti Ruby/GStreamer(M), Ruby/Libgda(M), Ruby/GtkSourceView(M), Ruby/GLib, Ruby/GTK, French Website, Website, Tutorials. Malte Milatz German Website. Martin Povolný Ruby/GtkHtml2(M). Ruby/GTK, Masahiro Sakai Ruby/GLib and almost of the important design of Ruby-GNOME2. Porting to Win32 platform. Masao Mutoh Chief maintainer. Ruby/ATK(M), Ruby/GTK(M), Ruby/GdkPixbuf(M), Ruby/Libglade(M), Ruby/Pango(M), Ruby/PanelApplet(M), Ruby/rbbr(M), Website(M), Others. Project management. Matthew Berg Ruby/GTK TreeView Tutorial(M), Website, Ruby/GTK. Mirko Maischberger Ruby/GtkMozEmbed(M), Ruby/GTK, Ruby/Pango, Ruby/GdkPixbuf, Ruby/GNOME, Website. Nikolai :: lone-star :: Weibull Ruby/GConf, Ruby/GnomeVFS(M), Ruby/GTK. Nobuyoshi Nakada Technical advisor. OGASAWARA, Takeshi Ruby/GTK. Pascal Terjan Ruby/GLib, Ruby/GTK, Ruby/GtkSourceView, Ruby/Pango, Ruby/GnomeVFS, Ruby/GConf. Sam Stephenson Website. Sjoerd Simons Ruby/GLib, Ruby/GTK. TAMURA.Kenichi Ruby/GLib. Vincent Isambart Ruby/GtkGLExt(M), Ruby/GnomeCanvas, Ruby/ATK, Ruby/Pango, Ruby/GLib, Ruby/GTK, Ruby/GtkHtml2, Ruby/Libart, Ruby/Libglade, French Website, Website. All members of Ruby-GNOME2 Mailing lists. And many others who have contributed patches, reported bugs. Thanks! ---------------------------------------- Ruby-GNOME Maintainers. (current) Kouhei Sutou (up to Ruby-GNOME2 ver. 0.16) Masao Mutoh (up to Ruby-GNOME ver. 0.27) Neil Conway (up to Ruby-GNOME ver. 0.25) Hiroshi IGARASHI (up to Ruby-GNOME ver. 0.18) by Dai.K. charset = UTF-8. ruby-gnome-ruby-gnome-25972cb/COPYING.GFDL000066400000000000000000000546621511343406000177770ustar00rootroot00000000000000 GNU Free Documentation License Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. ruby-gnome-ruby-gnome-25972cb/COPYING.LIB000066400000000000000000000636421511343406000176670ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/Gemfile000066400000000000000000000025651511343406000175170ustar00rootroot00000000000000# Copyright (C) 2012-2025 Ruby-GNOME 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 source "https://rubygems.org/" plugin "rubygems-requirements-system" require_relative "helper" Helper.sorted_all_packages.each do |package| gemspec path: File.join(__dir__, package) end group :development, :docs, :test do gem "bundler" gem "erb" gem "rake" end group :docs do gem "commonmarker" gem "rdoc" gem "yard" gem "yard-gobject-introspection", github: "ruby-gnome/yard-gobject-introspection" end group :test do gem "test-unit" gem "webrick" end local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") if File.exist?(local_gemfile) eval_gemfile(local_gemfile) end ruby-gnome-ruby-gnome-25972cb/Gemfile.local.sample000066400000000000000000000014561511343406000220660ustar00rootroot00000000000000# Copyright (C) 2014 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 gem "rake-compiler" gem "mechanize" ruby-gnome-ruby-gnome-25972cb/NEWS.md000066400000000000000000000566251511343406000173300ustar00rootroot00000000000000# NEWS ## Ruby-GNOME 4.3.4: 2025-12-02 This is a MSYS2 Ruby support release. ### Changes #### All * Improvements * MSYS2: Added system package information * [GH-1691](https://github.com/ruby-gnome/ruby-gnome/issues/1691) * [GH-1692](https://github.com/ruby-gnome/ruby-gnome/issues/1692) * Patch by takuya kodama. #### Ruby/GLib2 * Fixes * Fixed a GC problem of a GObject property in GObject defined by Ruby. * [GH-1688](https://github.com/ruby-gnome/ruby-gnome/issues/1688) * Reported by ppibburr. ### Thanks * ppibburr * takuya kodama ## Ruby-GNOME 4.3.3: 2025-08-17 This is a graphene1 `require` path fix release. ### Changes #### Ruby/Graphene1 * Improvements * Improved `Graphene::Size` API. * Fixes * Renamed `require` path to `graphene1` from `graphene`. #### Ruby/GSK4 * Improvements * Improved `Gsk::RoundedRect` API. #### Ruby/GObjectIntrospection * Improvements * Added support for `try_convert` protocol for no `GTyped` structs. ## Ruby-GNOME 4.3.2: 2025-08-15 This is a graphene1 rename release. ### Changes #### Ruby/Graphene1 * Renamed from Ruby/Graphene because "graphene" gem already exists. ## Ruby-GNOME 4.3.1: 2025-08-15 This is a GSK support release. ### Changes #### Ruby/Graphene * Added #### Ruby/GSK4 * Added #### Ruby/GTK4 * Improvements * Added `Gtk::Snapshot#save(&block)` * Added `Gtk::Image#intialize(paintable:)` ## Ruby-GNOME 4.3.0: 2025-07-14 This is a bug fix release. ### Changes #### Ruby/GLib2 * Improvements * Added `GLib::VariantType.try_convert`. * Added string representation to `GLib::VariantType#inspect`. #### Ruby/GIO2 * Improvements * Changed `Gio::Action#change_state` to accept raw Ruby objects. * Stopped overwriting existing `Gio::MenuItem` setters. * Changed `Gio::BytesIcon#initialize` to keep the given `GLib::Bytes` to prevent from GC. #### Ruby/GdkPixbuf * Fixes * Updated Debian package name. #### Ruby/GTK3 * Improvements * Made `Gtk::Popover#pointing_to` Rubyish. #### Ruby/GDK4 * Fixes * Fixed wrong Homebrew package name. #### Ruby/GTK4 * Improvements * Made `Gtk::Popover#pointing_to` Rubyish. * Added a demo for `Gtk::FileDialog`. * [GH-1642](https://github.com/ruby-gnome/ruby-gnome/issues/1642) * Patch by Eric Cunningham. * Marked event controllers in `Gtk::Widget` automatically. ### Thanks * Eric Cunningham ## Ruby-GNOME 4.2.9: 2025-03-22 This is a release that adds support for rubygems-requirements-system. ### Changes #### All * Improvements * Added support for rubygems-requirements-system. ## Ruby-GNOME 4.2.8: 2025-03-20 This is a release that adds support for Alpine Linux. ### Changes #### All * Improvements * Added support for Alpine Linux. #### Ruby/GLib2 * Fixes * Fixed a GC related crash bug. * [GH-1664](https://github.com/ruby-gnome/ruby-gnome/issues/1664) * Reported by Mamoru TASAKA. #### Ruby/Poppler * Improvements * Added support for `POPPLER_RENDER_ANNOTS_3D`. * [GH-1666](https://github.com/ruby-gnome/ruby-gnome/issues/1666) * Patch by Mamoru TASAKA. #### Ruby/WNCK3 * Improvements * Added support for `WNCK_PAGER_SCROLL_2D` and `WNCK_PAGER_SCROLL_1D`. #### Ruby/VLC * Fixes * `VLC::Media#parse`: Fixed the number of arguments. ### Thanks * Mamoru TASAKA ## Ruby-GNOME 4.2.7: 2025-01-29 This is a Ruby 2.5 on AlmaLinux 8 support release. ### Changes #### Ruby/GLib2 * Improvements * Added support for Ruby 2.5 on AlmaLinux 8 again. ## Ruby-GNOME 4.2.6: 2025-01-25 This is a C23 support release. This includes ABI incompatible changes but API is still compatible. If your gem uses `RG_DEF_METHOD()`/`RG_DEF_SMETHOD()`/`RG_DEF_PRIVATE_METHOD()` directly instead of using GObjectIntrospection, you need to reinstall them. ### Changes #### Ruby/GLib2 * Improvements * Added `GLib::Value.try_convert` for auto conversion. * Added support for instantiating `GTypeInstance` objects. * GH-1647 * Reported by ppibburr * Added support for properties that uses `GTypeInstance`. * GH-1651 * Reported by ppibburr * `GLib::{Variant,Object,Param}`: Changed parent class to `GLib::Instantiatable`. * Added support for `GValue` * GH-1654 * GH-1655 * GH-1656 * Patch by ppibburr * `GLib::Instantiatable#inspect` * GH-1652 * GH-1653 * Patch by ppibburr * Added support for C23. * `rbg_define_singleton_method()`: Removed because it's not C23 compatible. * `rbg_define_method()`: Removed because it's not C23 compatible. * `rbg_define_private_method()`: Removed because it's not C23 compatible. * GH-1660 * Reported by Mamoru TASAKA * Removed `Data_Get_Struct()` fallback. We assume that all users migrated to `TypedData` from `Data`. * Fixes * `GLib.setenv`: Fixed a bug that the third argument can't be passed. #### Ruby/GObjectIntrospection * Improvements * Added support for `(transfer full)` of boolean/number return. * Added support for `ref`/`unref` for `GTypeInstance` * GH-1657 * GH-1659 * Patch by ppibburr #### Ruby/GTK4 * Fixes * Fixed a bug that `Gtk::TextBuffer#get_iter_at(:line)` returns `Array`. * GH-1649 * Reported by Eric Cunningham #### Ruby/GStreamer * Improvements * `Gst::AudioLoader`: Added. * GH-1634 * GH-1641 * Patch by KITAITI Makoto * `Gst::Caps#set_int_value`: Added. It's a convenient `Gst::Caps#set_value` for a `GLib::Type::INT` value. * `Gst::Caps#[]=`: Added. It's a convenient `Gst::Caps#set_value` wrapper. * `Gst::Structure#[]`: Added. It's a convenient `Gst::Structure#get_value` wrapper. #### Thanks * KITAITI Makoto * ppibburr * Eric Cunningham ## Ruby-GNOME 4.2.5: 2024-12-15 This is a minor bug fix release. ### Changes #### Ruby/GLib2 * Fixes * Windows: Fixed a bug that `GType` conversion may be failed. * GH-1621 * Reported by Eric Cunningham #### Ruby/GObjectIntrospection * Improvements * Added support for transfer everything struct C array. * Added support for converting fixed size number array to `Array`. #### Ruby/GTK4 * Improvements * `Gtk::GestureStylus#backlog`: Improved API. ### Thanks * Eric Cunningham ## Ruby-GNOME 4.2.4: 2024-09-24 This is a WebKitGTK support improvement release. ### Changes #### Ruby/WebKitGTK * Improvements * Changed to require GTK 4 and `webkitgtk-6.0`/`WebKit-6.0`. #### Ruby/WebKit2GTK * Improvements * Added support for WebKitGTK 2.44.0 or later. ## Ruby-GNOME 4.2.3: 2024-09-19 This is a GTK 4 support improvement release. ### Changes #### All * Improvements * Update project website URL. * GH-1611 * GH-1615 * Patch by Kazuhiro NISHIYAMA * Dropped support for CentOS 7. #### Ruby/GLib2 * Improvements * Added `GLib::VariantDict`. * Added `GLib::OptionArg`. * Added `GLib::OptionFlags`. * Added `GLib.get_os_info`. * `GLib::Param::*.new`: Added support for flag names. * `GLib::Param::*.new`: Added support for `nil` name and blurb. #### Ruby/GObjectIntrospection * Improvements * Added support auto setter generation for class methods. * Added support auto setter generation for base module methods. * Added support for `nullable` of callback return value. * Added support for `nullable` `GHashTable`. #### Ruby/GIO2 * Improvements * Made `Gio::ListModel` enumerable. * Added `Gio::ListModel#[]`. #### Ruby/GdkPixbuf2 * Improvements * Removed tests that use XPM. * GH-1614 * Reported by Mamoru TASAKA #### Ruby/GTK4 * Improvements * Renamed `Gtk::License::0BSD` to `Gtk::License::BSD_0`. * GH-1618 * Reported by rubyFeedback * Reported by kojix2 * `Gtk::TextBuffer#begin_irreversible_action`: Added support for block. ### Thanks * Mamoru TASAKA * Kazuhiro NISHIYAMA * rubyFeedback * kojix2 ## Ruby-GNOME 4.2.2: 2024-04-02 This is a GLib 2.80 support improvement release. ### Changes #### Ruby/GIO2 * Improvements * Fixed a load error with GLib 2.80. * GH-1610 * Reported by Dmitry Vorotilin #### Ruby/GTK4 * Improvements * `Gtk::CssProvider#load(string:)`: Added. * GH-1608 * Reported by Sami Sieranoja * `Gtk::CssProvider#load(bytes:)`: Added. * GH-1608 * Reported by Sami Sieranoja ### Thanks * Sami Sieranoja * Dmitry Vorotilin ## Ruby-GNOME 4.2.1: 2024-02-23 This is a minor bug fix release. ### Changes #### Ruby/GLib2 * Improvements * Added support for showing `GType` name for anonymous `GType` based classes. * GH-1577 * Reported by Sami Sieranoja * Added `RG_DEF_SALIAS()`. * Stopped providing unusable signal related methods to not signal ready objects such as `GLib::Instantiatable`. * GH-1589 * Reported by Sami Sieranoja * Added `GLib::Type::INVALID`. `GLib::Type[nil]` is also accepted. * GH-1594 * Reported by Sami Sieranoja * Added `GLib::TimeZone#identifier`. * Added `GLib::TimeZone.try_convert`. #### Ruby/GObjectIntrospection * Improvements * Ignored `.hash(some_arguments)` methods. It may break something. * Ignored fundamental `GType`. * GH-1580 * Reported by Sami Sieranoja * Added support for returning sized `GType` array. #### Ruby/GDK4 * Fixes * Fixed a GC related bug of `Gdk::MemoryTexture.new`. * GH-1596 * Reported by HuBandiT * Fixed a GC related bug of `Gdk::Picture`. * GH-1596 * Reported by HuBandiT #### Ruby/GTK4 * Improvements * Added a menu bar sample. * GH-1581 * GH-1582 * GH-1584 * Patch by Sami Sieranoja * Added support for `Gtk::DropTarget.new([type, ...], actions)`. * GH-1594 * Reported by Sami Sieranoja * Fixes * Fixed deprecation message of `Gtk::Button.new`. * GH-1587 * Reported by Sami Sieranoja * Fixed a GC related bug of `Gtk::Image`. * Fixed a GC related bug of `Gtk::ColumnView`. * GH-1600 * Reported by HuBandiT * Fixed a GC related bug of `Gtk::SingleSelection`. * GH-1600 * Reported by HuBandiT #### Ruby/GStreamer * Improvements * Added a missing GC guard for `Gst::Element#bus`. * GH-1586 * Reported by Sami Sieranoja ### Thanks * Sami Sieranoja * HuBandiT ## Ruby-GNOME 4.2.0: 2023-08-19 This is a minor bug fix release. ### Changes #### Ruby/GTK3 * Fixes * Suppressed a build time warning. ## Ruby-GNOME 4.1.9: 2023-08-11 This is a vte4 added release. ### Changes #### Ruby/GObjectIntrospection * Improvements * Changed to use GLib memory allocation functions instead of Ruby's one when calling callbacks. Because callbacks may be called in out of the main Ruby thread. #### Ruby/VTE3 * Improvements * Ensured using GTK3. #### Ruby/VTE4 * Improvements * Added. ## Ruby-GNOME 4.1.8: 2023-06-25 This is a conda support release. ### Changes #### All * Improvements * Added support for installing conda packages automatically. ## Ruby-GNOME 4.1.7: 2023-05-31 This is a minor improvement release for 4.1.6. ### Changes #### Ruby/GLib2 * Improvements * Added support for writer barrier. #### Ruby/CairoGObject * Improvements * Added support for specifying rcairo's source directory by `RCAIRO_SOURCE_DIR`. ## Ruby-GNOME 4.1.6: 2023-05-21 This is a minor improvement release for 4.1.5. ### Changes #### Ruby/GLib2 * Improvements * Avoided closure related `TypeError` in GC at exit. [Reported by Matijs van Zuijlen] ### Thanks * Matijs van Zuijlen ## Ruby-GNOME 4.1.5: 2023-05-11 This is a bug fix release for 4.1.4. ### Changes #### Ruby/GLib2 * Improvements * Ignored `gmodule.h` explicitly for MacPorts. [Reported by Akira Ouchi] ### Thanks * Akira Ouchi ## Ruby-GNOME 4.1.4: 2023-05-04 This is a bug fix release for 4.1.3. ### Changes #### Ruby/GObjectIntrospection * Improvements * Hid internal `INVOKERS` constant to improve backward compatibility. GH-1551 [Reported by Mamoru TASAKA] ### Thanks * Mamoru TASAKA ## Ruby-GNOME 4.1.3: 2023-04-28 This is a bug fix release for 4.1.2. ### Changes #### Ruby/GObjectIntrospection * Improvements * Added support for methods and functions for enum and flags. * Improved internal `GObjectIntrospection::Loader` APIs but some libraries may use these APIs. So this may be a backward incompatible change. * Fixes * Fixed a bug for nullable argument support. #### Ruby/GTK4 * Improvements * Added examples: * GH-1551 * GH-1552 * GH-1553 * GH-1554 * GH-1555 * GH-1556 * GH-1557 * GH-1558 [Patch by Toshio Sekiya] ### Thanks * Toshio Sekiya ## Ruby-GNOME 4.1.2: 2023-02-24 This is a release to improve support for the latest GNOME related libraries. ### Changes #### Ruby/GLib2 * Improvements * Added support for GLib 2.75 or later. [GH-1547] [Reported by Mamoru TASAKA] #### Ruby/GObjectIntrospection * Improvements * Improved wrong arguments error message for `#initialize`. [GH-1545] [Reported by D-W-L] #### Ruby/GTK4 * Improvements * Added support for GTK 4.9.3 or later. [GH-1548] [Reported by Mamoru TASAKA] * Added an example. [GH-1549] [Patch by Toshio Sekiya] ### Thanks * D-W-L * Mamoru TASAKA * Toshio Sekiya ## Ruby-GNOME 4.1.1: 2023-02-09 This is a release to improve callback. ### Changes #### Ruby/GLib2 * Improvements * Added missing error check in `GLib::Object.type_register`. [GH-1543] [Reported by D-W-L] * Added support for `try_convert` protocol on converting a Ruby object to boxed value. #### Ruby/GObjectIntrospection * Improvements * Relaxed return values from callback. Non `Array` value is accepted for callback that needs multiple return values. Missing return values are processed as `nil`. * Suppressed a warning that is reported when returning `nil` for boxed value. ### Thanks * D-W-L ## Ruby-GNOME 4.1.0: 2023-01-31 This is a bug fix release of 4.0.9. ### Changes #### Ruby/GLib2 * Fixes * Fixed a memory leak introduced in 4.0.9. #### Ruby/Handy * Improvements * Renamed gem name to `libhandy` from `handy` because `handy` gem already exists. ## Ruby-GNOME 4.0.9: 2023-01-31 This is a bug fix release of 4.0.8. ### Changes #### Ruby/GLib2 * Fixes * Fixed a crash bug that is related to closure and GC. ## Ruby-GNOME 4.0.8: 2023-01-15 This is a bug fix release of 4.0.7. ### Changes #### Ruby/GLib2 * Fixes * Fixed a bug that gems that depend on glib2 gem can't find `glib-enum-types.h`. ## Ruby-GNOME 4.0.7: 2023-01-15 This is a release for Ruby 3.2 on Windows again. ### Changes #### Ruby/GLib2 * Improvements * Really added support for Ruby 3.2 on Windows. [GH-1535] [Reported by dsisnero] ### Thanks * dsisnero ## Ruby-GNOME 4.0.6: 2023-01-08 This is a release for Ruby 3.2 on Windows. ### Changes #### Ruby/GLib2 * Improvements * Added support for Ruby 3.2 on Windows. [GH-1533] [Reported by dsisnero] ### Thanks * dsisnero ## Ruby-GNOME 4.0.5: 2022-12-12 This is a bug fix release of 4.0.4. ### Changes #### Ruby/GObjectIntrospection * Fixes * Fixed a memory leak that `GDestroyNotify` argument's metadata isn't freed. For example, this is happen with `GLib::Timeout.add`. ## Ruby-GNOME 4.0.4: 2022-12-09 This is a release that adds more new libraries: Ruby/Adwaita, Ruby/GtkSourceView3 and Ruby/Handy. ### Changes #### Documents * Improvements * Added gdk4 and gtk4. [[GitHub#1514](https://github.com/ruby-gnome/ruby-gnome/issues/1514)] [Reported by codart] #### All * Improvements * Added support for macOS 12/Xcode 14. [[GitHub#1516](https://github.com/ruby-gnome/ruby-gnome/issues/1516)] [Reported by Apoorv Sohal] #### Ruby/GLib2 * Improvements * Added support for instantiating `GLib::Pointer` and getting address of it. * Renamed `gnome2/` to `gnome/` in internal library path. * Suppressed `connected_closures` isn't initialized warning. * Re-added `GLib::ValueArray` because GStreamer still uses it without replacement. [[GitHub#1520](https://github.com/ruby-gnome/ruby-gnome/issues/1520)] [Reported by Matt Palmer] * Set missing `rb_data_type_t::wrap_struct_name`. [[GitHub#1522](https://github.com/ruby-gnome/ruby-gnome/issues/1522)] [Patch by Peter Zhu] * Added support for more `GSpawnFlags`. * Fixes * Fixed a bug that `GLib::Pointer.gtype` and `GLib::Pointer#gtype` use the wrong number of arguments. * Fixed a memory leak in `GLib::Object` based classes. [[GitHub#1523](https://github.com/ruby-gnome/ruby-gnome/issues/1523)] [Patch by Peter Zhu] #### Ruby/GObjectIntrospection * Improvements * Added support for `length` in field. [[GitHub#1524](https://github.com/ruby-gnome/ruby-gnome/issues/1524)] [Reported by jvmf1] #### Ruby/GIO2 * Improvements * Added support for getting `GLib::Mount` by `Gio::Volume#mount`. [[GitHub#604](https://github.com/ruby-gnome/ruby-gnome/issues/604)] #### Ruby/GTK4 * Improvements * [sample] Updated. [[GitHub#1512](https://github.com/ruby-gnome/ruby-gnome/issues/1512)] [[GitHub#1515](https://github.com/ruby-gnome/ruby-gnome/issues/1515)] [Patch by kojix2] [[GitHub#1526](https://github.com/ruby-gnome/ruby-gnome/issues/1526)] [[GitHub#1527](https://github.com/ruby-gnome/ruby-gnome/issues/1527)] [Patch by Daniel Mircea] * Fixes * Fixed a bug that `Gtk::ScrolledWindow` can't be created. [[GitHub#1504](https://github.com/ruby-gnome/ruby-gnome/issues/1504)] [Reported by rubyFeedback] * Fixed a typo in `Gtk::Image.new`. [[GitHub#1504](https://github.com/ruby-gnome/ruby-gnome/issues/1504)] [Reported by rubyFeedback] * Fixed a bug that `Gtk::CellRendereText` may be GC-ed. [[GitHub#1518](https://github.com/ruby-gnome/ruby-gnome/issues/1518)] [Reported by galtgenod] * Fixed a crash bug that is caused when GLib based class defined by Ruby is used. [[GitHub#1444](https://github.com/ruby-gnome/ruby-gnome/issues/1444)] [Reported by HuBandiT] #### Ruby/libsecret * Fixes * Fixed wrong MSYS2 package name. #### Ruby/GtkSourceView4 * Fixes * Fixed package ID. [[GitHub#1525](https://github.com/ruby-gnome/ruby-gnome/issues/1525)] [Reported by Daniel Mircea] #### Ruby/GtkSourceView5 * Added. [[GitHub#1511](https://github.com/ruby-gnome/ruby-gnome/issues/1511)] [Reported by galtgendo] #### Ruby/Adwaita * Added. [[GitHub#1510](https://github.com/ruby-gnome/ruby-gnome/issues/1510)] [Reported by rubyFeedback] #### Ruby/Handy * Added. [[GitHub#1434](https://github.com/ruby-gnome/ruby-gnome/issues/1434)] [Reported by Jacob Michalskie] ### Thanks * rubyFeedback * kojix2 * codart * Apoorv Sohal * galtgendo * Matt Palmer * Peter Zhu * HuBandiT * jvmf1 * Daniel Mircea * Jacob Michalskie ## Ruby-GNOME 4.0.3: 2022-09-13 This is a bug fix release of 4.0.2. ### Changes #### Ruby/GTK4 * Fixes * Fixed a bug that `ext/**/*.*` aren't included in `.gem`. [GitHub#1498][Reported by Anatol Pomozov] ### Thanks * Anatol Pomozov ## Ruby-GNOME 4.0.2: 2022-09-05 This is a bug fix release of 4.0.1. ### Changes #### Ruby/GLib2 * Fixes * Fixed a bug that closure may be GC-ed. [GitHub#1495][Reported by Matijs van Zuijlen] #### Ruby/GObjectIntrospection * Fixes * Fixed a bug that callback doesn't work with GObject Introspection 1.72.0 or later. [GitHub#1496][Reported by Mamoru TASAKA] ### Thanks * Mamoru TASAKA * Matijs van Zuijlen ## Ruby-GNOME 4.0.1: 2022-09-02 This is a bug fix release of 4.0.0. ### Changes #### Ruby/GLib2 * Fixes * Fixed wrong false constant value. ## Ruby-GNOME 4.0.0: 2022-09-01 This is a release that supports GTK 4. ### Changes #### All * windows: Removed a needless workaround for old libintl-8.dll. * doc: Added support for generating API documents. [GitHub#1468][Patch by kojix2] * doc: Added Rake tasks to generate documents. [GitHub#1482][Patch by Sean Champ] * Use Bundler API to load (({Gemfile.local})). [GitHub#1483][Patch by Sean Champ] #### Ruby/GLib2 * Improvements * Changed to use `g_warning()` from `rb_warn()` for already destroyed closure warning. * Dropped support for GLib 2.48 or earlier. * Added `GLib::DateTime#format_iso8601`. * Added `rbg_mGLib()`. * Added `rbg_mGLibObject()`. * Deprecated `mGLib`. * Added support for auto native package installation on Gentoo Linux. * Added `GLib.malloc`. * Added `GLib.malloc0`. * Added `GLib.free`. * Added `GLib::Variant#to_s`. [GitHub#1491][Reported by Sean Champ] * Added `GLib::Variant#inspect`. * Added `GLib::Variant.parse`. [GitHub#1491][Reported by Sean Champ] * Fixes * closure: Fixed a reference count problem. #### Ruby/GObjectIntrospection * Improvements * Don't raise an exception for `object == nil`. [GitHub#1472][Reported by Hirokazu SUZUKI] * Added support for returning a fixed size C array of `GObject`. [GitHub#1481][Reported by Sean Champ] * Added support for GObject Introspection 1.72.0 or later. * Added support for returning `GClosure` from virtual method. * Added support for `transfer full` boxed type returned by closure. * Fixes * Fixed a bug that `gpointer` to `VALUE` conversion is broken on 32bit environment. [GitHub#1462][Reported by Mamoru TASAKA] * Fixed a wrong `GHashTable` value conversion in Ruby -> `GHashTable`. [GitHub#1481][Reported by Sean Champ] * Fixed a memory leak of `GObjectIntrospection::CallableInfo#return_type`. * Fixed a memory leak for async callback. #### Ruby/GTK3 * Improvements * Required GTK+ 3.22 or later. * Added support for `Gtk::AccelMap.each(filter: true)`. [GitHub#1487][Reported by Sean Champ] * Fixes * Fixed wrong {`Gtk::RadioToolButton.new` usage in demo. [GitHub#1475][Reported by Sami Sieranoja] * Fixed a GC related bug of `Gtk::Widget#insert_action_group`. [GitHub#1490][Reported by Sean Champ] #### Ruby/GDK4 * Re-implemented based on the current Ruby/GDK3. #### Ruby/GTK4 * Re-implemented based on the current Ruby/GTK4. #### Ruby/Poppler * Improvements * Added support for `Poppler::Document.new(GLib::Bytes)`. #### Ruby/RSVG2 * Fixes * doc: Fixed a link. [GitHub#1469][Patch by Blake Gearin] #### Ruby/GStreamer * Fixes * example: Updated to work with the latest GStreamer. [GitHub#1478][Patch by kojix2] #### Ruby/libsecret * Improvements * Added support for `Secret::Schema#attributes`. #### Ruby/VTE3 * Improvements * Removed needless `Vte::Terminal#feed_child` wrapper. [GitHub#1484][Patch by Sean Champ] ### Thanks * Mamoru TASAKA * kojix2 * Blake Gearin * Hirokazu SUZUKI * Sami Sieranoja * Sean Champ ## Old news See [NEWS.rd](NEWS.rd). ruby-gnome-ruby-gnome-25972cb/NEWS.rd000066400000000000000000006231351511343406000173310ustar00rootroot00000000000000# -*- RD -*- = NEWS == Ruby-GNOME 3.5.1: 2022-01-17 This is a release for Windows. === Changes ==== All * windows: Added workaround for mingw-w64-x86_64-gettext-0.21-1 or later. Dummy (({DllMain()})) is defined. ==== Ruby/GdkPixbuf2 * Improvements * Suppressed method redefining warnings. ==== Ruby/Pango * Fixes * Fixed a bug that can't be started. [GitHub#1456][Reported by Akira Ouchi] ==== Ruby/GObjectIntrospection * Fixes * Fixed a bug that (({NoMethodError})) is raised on invalid signature for constructor. === Thanks * Akira Ouchi == Ruby-GNOME 3.5.0: 2022-01-11 This is a release that adds support for Ractor. Ruby/GObjectIntrospection has some backward incompatibilities for Ractor support. If you have any problem, please report it to https://github.com/ruby-gnome/ruby-gnome/issues . === Changes ==== Ruby/GLib2 * Improvements * Added support for Ractor. * Added support for signal handlers and virtual methods in included module. * Added support for (({try_convert})) protocol for property setter. * Added support for converting tuple (({GVariant})) to Ruby. ==== Ruby/GIO2 * Improvements * Added support for GIO 2.70. * Added (({Gio::RubyInputStream})) to use Ruby objects as (({Gio::InputStream})). * Added (({Gio::RubyOutputStream})) to use Ruby objects as (({Gio::OutputStream})). ==== Ruby/GObjectIntrospection * Improvements * Added support for Ractor. This introduced some backward incompatiblities. * Added support for "transfer full" for out (({GError})). [GitHub#1437][Reported by mcclumpherty] * Added support for changing whether GVL is unlocked per object by the following APIs. * (({GObjectIntrospection::FunctionInfo#set_lock_gvl_default})) * (({GObjectIntrospection::FunctionInfo#add_lock_gvl_predicate})) * (({GObjectIntrospection::Loader#prepare_function_info_lock_gvl})) * Added support for converting from raw argument to enum. * Added support for (({GList})) return value. * Added support for reporting an error in callback. * Fixes * Fixed a bug that virtual functions of grandparent class can't be implemented. [GitHub#1433][Patch by shibafu] ==== Ruby/Pango * Improvements * Added support for Ruby 3.2. ==== Ruby/GTK3 * Improvements * Improved documentation. [GitHub#1454][Patch by Andy Maleh] * Added support for Ruby 3.2. ==== Ruby/GDK4 * Improvements * Updated pkg-config ID. [GitHub#1435][Patch by Sasi Olin] ==== Ruby/GTK4 * Improvements * Removed needless rsvg2 dependency on Windows. [GitHub#1440][Reported by HuBandiT] * Fixes * Fixed typos in warning messages. [GitHub#1442][Patch by HuBandiT] [GitHub#1415][Reported by rubyFeedback] === Thanks * shibafu * Sasi Olin * mcclumpherty * HuBandiT * rubyFeedback * Andy Maleh == Ruby-GNOME 3.4.9: 2021-08-10 This is a bug fix release of 3.4.8. === Changes ==== Ruby/GObjectIntrospection * Fixes * Fixed a bug that (({gpointer})) to Ruby conversion breaks a value when pointer value is (({2 ** 32})) or larger. == Ruby-GNOME 3.4.8: 2021-08-09 This is a bug fix release of 3.4.7. === Changes ==== Ruby/GObjectIntrospection * Fixes * Fixed a bug that (({gpointer})) to Ruby conversion breaks a value when pointer value is (({2 ** 32})) or larger. == Ruby-GNOME 3.4.7: 2021-07-30 This is a release that improves virtual function support. === Changes ==== Ruby/GLib2 * Improvements * (({GLib::Error})): Added support for setting (({code})) and (({domain})) automatically. ==== Ruby/GObjectIntrospection * Improvements * Added support for returning object from callback. * Fixes * Fixed a bug that (({GError})) detection doesn't work. == Ruby-GNOME 3.4.6: 2021-07-17 This is a bug fix release for macOS. === Changes ==== Ruby/Pango * Fixes * Fixed a bug that (({require "pango"})) is failed on environment that has multiple font types. [GitHub#1429][Reported by Cameron Gose] === Thanks * Cameron Gose == Ruby-GNOME 3.4.5: 2021-07-07 This is a release that supports implementing virtual functions in Ruby. === Changes ==== Ruby/GLib2 * Improvements * Added (({GError})) domain and code for Ruby. ==== Ruby/GObjectIntrospection * Improvements * (({GObjectIntrospection::BaseInfo#container})): Added. * (({GObjectIntrospection::ObjectInfo#class_struct})): Added. * (({GObjectIntrospection::StructInfo#find_field})): Added. * (({RVAL2GI_VFUNC_INFO()})): Added. * Added support for implementing virtual functions in Ruby. [GitHub#1386][Based on patch by Yuto Tokunaga] You need to define (({virtual_do_#{virtual_function_name}})) method in (({type_register}))-ed class. * Added support for implementing virtual functions of interface in Ruby. [GitHub#985][Reported by Matijs van Zuijlen] [GitHub#1938][Reported by Yuto Tokunaga] * Added support for "transfer everything" UTF-8 return/output value. * Changed to accepted one character for (({gunichar})). [GitHub#1426][Reported by rubyFeedback] * (({GObjectIntrospection::CallableInfo#can_throw_gerror?})): Added. * Added support for (({GError **})) in callback. * Added support for returning (({GList})) from callback. * Changed to return (({[]})) for (({NULL})) list. * Fixes * Fixed a bug that wrong type information is used for output arguments. ==== Ruby/Pango * Added support for (({PangoFT2})). * Added support for (({PangoFc})). * Added support for (({PangoOT})). * Added support for (({PangoCairoFontMaps})). * Updated gem metadata. [GitHub#1428][Patch by Gabriel Mazetto] === Thanks * Yuto Tokunaga * Matijs van Zuijlen * rubyFeedback * Gabriel Mazetto == Ruby-GNOME 3.4.4: 2021-04-22 This is a bug fix release for Windows. === Changes ==== All * Dropped support for CentOS 6. * Dropped support for Ubuntu 16.04. * Dropped support for Ruby 2.4. * Dropped support for Ruby 2.5. * Added support for Ruby 3.0. ==== Document * Improvements * Improved how to use on Heroku. [GitHub#1414][Patch by Juan D Lopez] * Improved README. [Patch by kojix2] ==== Ruby/GLib * Improvements * Added (({RVAL2POINTER()})). * Added (({POINTER2RVAL()})). * Changed to use (({rb_cObject})) instead of (({rb_cData})) as a parent class of typed data. * Changed to use typed data instead of data for all data types. * Added support for Ractor partially. * Required GLib 2.48 or later. * (({GLib::UniChar.compose})): Added. * (({GLib::UniChar.decompose})): Added. * (({GLib::UniChar.canonical_decomposition})): Deprecated. Use (({GLib::UniChar.decompose})) instead. * (({GLib.format_size_for_display})): Deprecated. Use (({GLib.format_size})) instead. * Fixes * Fixed wrong conversions between (({VALUE})) and (({GType})). [GitHub#1386][Patch by Yuto Tokunaga] ==== Ruby/GObjectIntrospection * Improvements * Removed needless transfer check for struct. [GitHub#1396][Reported by Konrad Narewski] * Added support freeing (({GArray})) of raw struct out parameter. [GitHub#1356][Reported by aycabta] ==== Ruby/Pango * Improvements * Added (({Pango::Render::PART_*})) to keep backward compatibility. [GitHub#1311][Reported by rubyFeedback] ==== Ruby/GStreamer * Improvements * Removed needless workaround for (({Gst::ElementFactory#static_pad_templates})). [GitHub#1400][Reported by Justin Weiss] ==== Ruby/Gnumeric * Improvements * Added support for the latest Gnumeric. ==== Ruby/GTK3 * Improvements * (({Gtk::Widget#set_size_request})): Added support for (({width:})) and (({height:})). [GitHub#1406][Reported by rubyFeedback] * (({Gtk::Dialog#set_default_response})): Added support for (({Symbol})). [GitHub#1418][Reported by rubyFeedback] ==== Ruby/GDK4 * Added. ==== Ruby/GTK4 * Added. ==== Ruby/VTE3 * Improvements * Improved description. [GitHub#1406][Reported by rubyFeedback] ==== Ruby/GTK2 * Removed. ==== Ruby/GtkSourceView2 * Removed. ==== Ruby/WebKitGtk2 * Removed. ==== Ruby/VTE * Removed. === Thanks * Konrad Narewski * aycabta * rubyFeedback * Justin Weiss * Yuto Tokunaga * Juan D Lopez * kojix2 == Ruby-GNOME 3.4.3: 2020-05-11 This is a follow-up release of 3.4.2. === Changes ==== Ruby/GLib2 * Fixes * Windows: Fixed a link errors. == Ruby-GNOME 3.4.2: 2020-05-02 This is a follow-up release of 3.4.1. === Changes ==== Ruby/GLib2 * Improvements * Added support for Ruby 2.8. ==== Ruby/GTK3 * Improvements * (({Gtk::Widget#style_get_property})): Added a validation. * Updated examples. [GitHub#1318][GitHub#1319][GitHub#1320][GitHub#1321][GitHub#1322] [GitHub#1323][GitHub#1324][GitHub#1325][GitHub#1326][GitHub#1327] [GitHub#1328][GitHub#1329][GitHub#1330][GitHub#1331][GitHub#1332] [GitHub#1353][GitHub#1354][GitHub#1355][GitHub#1391] [Patch by kojix2] * Fixes * Fixed a typo. [GitHub#1307][Patch by İsmail Arılık] ==== Ruby/GObjectIntrospection * Improvements * Changed to accept (({nil})) as a false value for boolean. [GitHub#1305][Reported by Matijs van Zuijlen] * Added support for UTF-8 (({GHashTable})) value. * Added workaround for (({rsvg_handle_set_stylesheet()})). * Fixes * Fixed a bug that pointer struct isn't allocated correctly. [GitHub#1315][Reported by Konrad Narewski] ==== Ruby/GtkSourceView4 * Improvements * Added support for auto native package install on Ubuntu. [GitHub#1309][Patch by İsmail Arılık] * Added support for auto native package install on Debian GNU/Linux. ==== Ruby/VTE3 * Improvements * (({Vte::Terminal#spawn})): Made options optional. [GitHub#1333][Patch by kojix2] * Updated README. [GitHub#1335][Patch by kojix2] ==== Ruby/GdkPixbuf2 * Improvements * Updated examples. [GitHub#1336][GitHub#1337][GitHub#1338][GitHub#1339][GitHub#1340] [GitHub#1341][GitHub#1342][GitHub#1343][GitHub#1344][GitHub#1347] [GitHub#1348][GitHub#1349] [Patch by kojix2] * Updated README. [GitHub#1346][Patch by kojix2] ==== Ruby/WebKit2GTK * Fixes * Fixed dependency check. [GitHub#1351][Patch by kojix2] ==== Ruby/RSVG2 * Improvements * Updated examples. [GitHub#1357][Patch by kojix2] [GitHub#1393][Patch by Jean-Christophe Le Lann] === Thanks * Matijs van Zuijlen * İsmail Arılık * Konrad Narewski * kojix2 * Jean-Christophe Le Lann == Ruby-GNOME 3.4.1: 2019-10-16 This is a follow-up release of 3.4.0. === Changes ==== Ruby/GDK3 * Improvements * Added support for (({String})) and (({Symbol})) as (({Gdk::Color})). [GitHub#1286][Reported by rubyFeedback] * Added support for (({String})) and (({Symbol})) as (({Gdk::RGBA})). ==== Ruby/GObjectIntrospection * Improvements * Added support for (({GBytes **})). === Thanks * rubyFeedback == Ruby-GNOME 3.4.0: 2019-10-10 This is a bug fix release of 3.3.9. === Changes ==== Ruby/ATK * Fixes * Fixed a typo. [GitHub#1302][Reported by kojix2] === Thanks * kojix2 == Ruby-GNOME 3.3.9: 2019-10-10 This is a full GLib 2.62.0 support release. === Changes ==== Ruby/GLib2 * Improvements * Deprecated (({GLib::Param::PRIVATE})). Use (({GLib::Param::STATIC_NAME})) instead. * Deprecated (({GLib::Param#private?})). Use (({GLib::Param#static_name?})) instead. * Added new flags: * (({GLib::Param::STATIC_NICK})) * (({GLib::Param::STATIC_BLURB})) * (({GLib::Param::EXPLICIT_NOTIFY})) * (({GLib::Param::DEPRECATED})) * Added new predicates: * (({GLib::Param#static_nick?})) * (({GLib::Param#static_blurb?})) * (({GLib::Param#explicit_notify?})) * (({GLib::Param#deprecated?})) * Deprecated (({ruby_gnome2_version})) in `mkmf-gnome`. Use (({ruby_gnome_version})) instead. * Added (({rbgobj_gtype_from_ruby()})). * Added (({rbg_is_object()})). * Added (({rbg_is_value()})). * Added (({rbg_is_bytes()})). * Removed needless const from the return value of (({rbg_rval2strv()})). * Removed needless const from the return value of (({rbg_rval2strv_accept_nil()})). * Added (({rbg_rval2filenamev()})). * Added (({rbg_rval2filenamev_accept_nil()})). * Stopped to define (({GType})) for (({GPollFD})). ==== Ruby/GObjectIntrospection * Improvements * Added support for conversion from (({GLib::Bytes})) to (({[gint8]})) and (({[guint8]})). * Added more information to inspected result. ==== Ruby/GIO2 * Improvements * Added support for GLib 2.62.0 or later. [GitHub#1296][Reported by Mamoru TASAKA] ==== Ruby/GTK3 * Improvements * Added (({Gtk::TreeModelSort.new})). [GitHub#1298][Reported by LutzLue] (({[gint8]})) and (({[guint8]})). ==== Ruby/GStreamer * Improvements * Removed all custom callbacks. * (({Gst::TagList#each})): Changed to yield tag name and tag values. === Thanks * LutzLue * Mamoru TASAKA == Ruby-GNOME 3.3.8: 2019-09-10 This is a partially GLib 2.62.0 support release. === Changes ==== All * Improvements * Changed our project name to Ruby-GNOME from Ruby-GNOME2. [GitHub#1277][Suggested by kojix2] [GitHub#1291][Patch by kojix2] * Stopped to release (({.tar.gz})) because they are no longer used. ==== Ruby/GLib2 * Improvements * (({GLib.convert})): Changed to set correct encoding. * (({GLib::FILENAME_ENCODING})): Added. * Changed to use the same enum object for the same enum value. * (({GLib::Enum.find})): Added. * (({GLib::Bytes#initialize})): Changed to reuse (({String})) data even if the given (({String})) isn't frozen. * (({GLib::Bytes.try_convert})): Added. * (({GLib::Enum.try_convert})): Added. * (({GLib::Flags.try_convert})): Added. * (({GLib::Type.try_convert})): Added. * (({GLib::MkEnums.create})): Added support for flags to enum definition. [GitHub#1295][Patch by Mamoru TASAKA] ==== Ruby/GIO2 * Fixes * Renamed to (({Gio::Icon#hash})) from (({Gio::Icon.hash})). [GitHub#1293][Reported by Erik Czumadewski] ==== Ruby/GObjectIntrospection * Improvements * Introduced (({try_convert})) protocol. ==== Ruby/CairoGObject * Improvements * (({Cairo::Context.try_convert})): Added. * (({Cairo::Device.try_convert})): Added. * (({Cairo::Pattern.try_convert})): Added. * (({Cairo::Surface.try_convert})): Added. * (({Cairo::ScaledFont.try_convert})): Added. * (({Cairo::FontFace.try_convert})): Added. * (({Cairo::FontOptions.try_convert})): Added. * (({Cairo::Region.try_convert})): Added. === Thanks * kojix2 * Erik Czumadewski * Mamoru TASAKA == Ruby-GNOME2 3.3.7: 2019-08-17 This is the bug fix release of 3.3.6. === Changes ==== Ruby/Pango * Improvements * (({Pango::AttrList#each})): Added. * (({Pango::AttrType})): Added support for (({PANGO_ATTR_FONT_DESC})). ==== Ruby/GObjectIntrospection * Improvements * Added support for (({GHashTable})). * Added support for GObject Introspection 1.60.0. ==== Ruby/Pango * Improvements * Added support for Pango 1.44. [GitHub#1288][Reported by Toshiaki Asai] ==== Ruby/GTK3 * Fixes * Fixed document markup. [GitHub#1280][GitHub#1281][GitHub#1282][Patch by İsmail Arılık] ==== Ruby/WNCK3 * Added. [GitHub#1284][Reported by Christopher L. Ramsey] ==== Ruby/libsecret * Added. === Thanks * İsmail Arılık * Christopher L. Ramsey * Toshiaki Asai == Ruby-GNOME2 3.3.6: 2019-03-21 This is a follow-up release of 3.3.5. === Changes ==== Ruby/GIO2 * Improvements * (({Gio::File#read})): Added support for block. * (({Gio::File.open})): Added support for (({Pathname})). * (({Gio::InputStream.open})): Added support for block. ==== Ruby/CairoGObject * Fixes * Fixed a bug that old cairo may be used. ==== Ruby/GObjectIntrospection * Fixes * Fixed a bug that 64bit integer conversion may be failed for large integer. * Fixed typos. == Ruby-GNOME2 3.3.5: 2019-03-10 This is a follow-up release of 3.3.4. === Changes ==== Ruby/GObjectIntrospection * Improvements * Ignored no (({GType})) interface. == Ruby-GNOME2 3.3.4: 2019-03-09 This is a real release to support GLib 2.60. === Changes ==== Ruby/GObjectIntrospection * Improvements * Ignored no (({GType})) interface. == Ruby-GNOME2 3.3.3: 2019-03-09 This is a release to support GLib 2.60. === Changes ==== Ruby/GLib2 * Improvements * Made tests more robust. [GitHub#1272][Reported by Jeremy Bicha] * Required pkg-config 1.3.5 or later. * Added support for GLib 2.60. * Windows: Removed support for static compilation. * Fixes * (({GLib::PollFD#fd=})): Fixed wrong conversion. ==== Ruby/GObjectIntrospection * Improvements * Improved auto (({#==}))/(({#!=})) implementations. They returns (({true}))/(({false})) for invalid argument instead of raising an error. ==== Ruby/GTK2 * Improvements * Made tests more robust. [GitHub#1275][Reported by Jeremy Bicha] ==== Ruby/RSVG2 * Improvements * Made tests more robust. [GitHub#1273][Reported by Mamoru TASAKA] ==== Ruby/Poppler * Improvements * (({Poppler::Document.new(data:)})): Added support for (({Encoding.default_internal})). * (({Poppler::Document.new})): Added support for (({#to_path})) objects as path. === Thanks * Jeremy Bicha * Mamoru TASAKA == Ruby-GNOME2 3.3.2: 2019-02-03 This is a bug fix release of 3.3.1. === Changes ==== Ruby/GObjectIntrospection * Fixed * Fixed wrong nil check. [GitHub#1270][Patch by moveccr] * Fixed a memory leak when module function is used with block. [GitHub#1270][Reported by Izumi Tsutsui] ==== Ruby/GTK3 * Improvements * Add backward compatibility APIs: * (({Gtk::Screen#add_style_provider})) * (({Gtk::Screen#remove_style_provider})) * (({Gtk::StyleContext.add_provider_for_screen})) * (({Gtk::StyleContext#add_provider})) === Thanks * moveccr * Izumi Tsutsui == Ruby-GNOME2 3.3.1: 2019-01-09 This is a release that improves GObject Introspection support. === Changes ==== Ruby/GLib2 * Improvements * (({rbgobj_remove_relative()})): Added support for removing a relative added by (({rbgobj_add_relative()})). * Stopped to use raw (({Hash})) to guard objects from GC. * (({GLib::Idle.remove})): Deprecated. Use (({GLib::Source.remove})) instead. * Fixes * Fixed typos in samples. [GitHub#1267][Patch by kojix2] ==== Ruby/CairoGObject * Improvements * Started to require cairo gem 1.16.2 or later. ==== Ruby/GObjectIntrospection * Improvements * Added support for input object validation. * Added support for callback with module function such as (({Gdk.threads_add_idle})). [GitHub#1256][Reported by xetum] * Added support for converting (({GHash})). * Added support for transfer full (({GHash})). * Added support for freeing array of primitive types. [GitHub#1266][Patch by Yosuke Shiro] * Improved suitable method detection for array and list. * Added support for converting an array of (({GObject})). * Added support for renaming compare operations: * (({not_equal})): (({!=})) * (({less_than})): (({<})) * (({less_than_or_equal})): (({<=})) * (({greater_than})): (({>})) * (({greater_than_or_equal})): (({>=})) ==== Ruby/GdkPixbuf2 * Fixes * Fixed markup. [GitHub#1250][Patch by kojix2] * Fixed a bug that data passed to (({GdkPixbuf::Pixbuf.new(data: array)})) is corrupt by GC. ==== Ruby/Pango * Improvements * (({Pango::Layout#get_pixel_extents})): Added for backward compatibility. * (({Pango::Rectangle#ascent})): Added for backward compatibility. * (({Pango::Rectangle#descent})): Added for backward compatibility. * (({Pango::Rectangle#lbearing})): Added for backward compatibility. * (({Pango::Rectangle#rbearing})): Added for backward compatibility. * (({Pango::Rectangle#left_bearing})): Added. * (({Pango::Rectangle#right_bearing})): Added. ==== Ruby/GTK2 * Fixes * Fixed typos in samples. [GitHub#1268][Patch by kojix2] ==== Ruby/GTK3 * Improvements * Updated sample to work on HiDPI environment. [GitHub#1246][Patch by noanoa07] * Updated samples. [GitHub#1258][GitHub#1259][GitHub#1260][Patch by kojix2] ==== Ruby/RSVG2 * Fixes * Fixed typos. [GitHub#1253][Patch by kojix2] * Removed needless rsvg2 gem dependency for Windows. [GitHub#1261][Reported by noanoa07] ==== Ruby/GEGL * Fixes * Fixed a typo in README. [GitHub#1263][Patch by kojix2] === Thanks * noanoa07 * kojix2 * xetum * Yosuke Shiro == Ruby-GNOME2 3.3.0: 2018-10-31 This is a release for fixing memory leak bugs of cairo-gobject, improving macOS support and adding support for GEGL. We stopped to provide fat gems for Windows. You can use normal gems with MSYS2 packages. === Changes ==== All * Improvements * Windows: Stopped to provide fat gems. You can use normal gems with MSYS2 packages. ==== Ruby/GLib2 * Improvements * Added support for the same constant name and class name for error. * Fixes * Fixed wrong constant values: * (({GLib2::MINLONG})) * (({GLib2::MAXLONG})) * (({GLib2::MAXULONG})) * (({GLib2::MINUINT64})) * (({GLib2::MAXSIZE})) * (({GLib2::MINFLOAT})) * (({GLib2::MINDOUBLE})) [GitHub#1244][Reported by cobodo] ==== Ruby/CairoGObject * Fixes * Fixed a memory leak. [GitHub#1232][Reported by Jean-Christophe Le Lann] * Stopped to increase needless reference. [GitHub#1079][Reported by noanoa07] ==== Ruby/GObjectIntrospection * Improvements * Added support for transfer full output parameter. * Fixes * Fixed a bug that class method closure doesn't work. [GitHub#1245][Reported by kojix2] ==== Ruby/GdkPixbuf2 * Improvements * (({GdkPixbuf::Pixbuf.new})): Added support for auto row stride detection for (({[Integer]})) data. ==== Ruby/Pango * Improvements * Made test more robust. [GitHub#1239][Reported by Michael Hudson-Doyle] ==== Ruby/GTK3 * Improvements * Improved backward compatibility for (({Gtk::ListStore#set_column_types})). [GitHub#1240][Reported by Edward Hennessy] * Fixes * Fixed wrong size used bug on HiDPI. [GitHub#1079][Reported by noanoa07] ==== Ruby/Poppler * Improvements * Added support for Popper 0.70.0. ==== Ruby/GEGL * Improvements * Added. === Thanks * Jean-Christophe Le Lann * Michael Hudson-Doyle * Edward Hennessy * cobodo * kojix2 * noanoa07 == Ruby-GNOME2 3.2.9: 2018-08-08 This is a packaging bug fix release of 3.2.8. === Changes ==== All * Fixes * Fixed wrong gem content. [GitHub#1236][Reported by Izumi Tsutsui] ==== Ruby/GtkSourceView4 * Improvements * Added. === Thanks * Izumi Tsutsui == Ruby-GNOME2 3.2.8: 2018-08-06 This is an installation improvement release of 3.2.7. === Changes ==== All * Improvements * Added support for static gemspec. [Patch by cedlemo] * Added support for msys2_mingw_dependencies. [GitHub#1194] ==== Ruby/GLib2 * Improvements * test: Removed a needless assertion. [GitHub#1235][Patch by Iain Lane] ==== Ruby/GObjectIntrospection * Improvements * Improved setter method detection. [GitHub#1233][Patch by yosuke shiro] * Fixes * Fixed a memory leak for callback method. [GitHub#1230][GitHub#1231][Reported by Izumi Tsutsui] ==== Ruby/GTK3 * Fixes * demo: Fix a crash bug. [GitHub#1193][Reported by kojix2] === Thanks * cedlemo * kojix2 * Izumi Tsutsui * yosuke shiro * Iain Lane == Ruby-GNOME2 3.2.7: 2018-06-07 This is a packaging bug fix release of 3.2.6. === Changes ==== All * Improvements * Added support for using unreleased version with Bundler. [Patch by cedlemo] * Fixes * Fixed a packaging bug that dependencies are missing. == Ruby-GNOME2 3.2.6: 2018-06-06 This is a bug fix release of 3.2.5. === Changes ==== Document * Improvements * Updated project URL. [GitHub#1174][Patch by okkez] ==== All * Improvements * Added support for using unreleased version with Bundler. [Patch by cedlemo] * Windows: Upgraded bundled library versions. ==== Ruby/GLib2 * Improvements * (({GLib::Object.define_signal})): Added. (({GLib::Object.signal_new})) is deprecated. * (({GLib::Object.signal_new})): Changed to accept (({Symbol})) as flags. * (({GLib::Signal})): Migrated to (({TypedData})). * (({GLib::Enum})): Migrated to (({TypedData})). * (({GLib::Flags})): Migrated to (({TypedData})). * (({GLib::Boxed})): Migrated to (({TypedData})). * (({GLib::Param})): Migrated to (({TypedData})). * (({rbgobj_signal_new()})): Added. (({rbgobj_signal_wrap()})) is deprecated. * Dropped GLib < 2.28 support. * (({GLib::Variant.new})): Changed to accept (({String})) as variant type. * (({rbg_variant_type_from_ruby()})): Added. * (({rbg_gc_guard()})): Added. * (({rbg_gc_unguard()})): Added. * Fixes * Fixed a bug that signal created by (({GLib::Object.signal_new})) may be GC-ed. [GitHub#1166][Reported by Izumi Tsutsui] ==== Ruby/GObjectIntrospection * Improvements * (({GObjectIntrospection::Struct})): Migrated to (({TypedData})). * Improved better function detection. * Added heuristic callback data detection. * Added support for getting flags field value. * (({RBGICallbackData})): Hidden details. * (({rb_gi_callback_data_get_metadata()})): Added. * (({rb_gi_callback_data_get_rb_callback()})): Added. * Added (({to_integer})) to (({to_i})) mapping. [GitHub#1191][Patch by yosuke shiro] ==== Ruby/CairoGObject * Improvements * Added (({gtype})) class methods. ==== Ruby/GIO2 * Improvements * (({Gio::MenuItem#set_attribute_value})): Improved argument conversion. Callers don't need to create (({GLib::Variant})). * (({Gio::Settings.new})): Added support for keyword (({Hash})). [GitHub#1187][Patch by cedlemo] ==== Ruby/Pango * Improvements * (({Pango::Attribute})): Migrated to (({GLib::Boxed})). * (({Pango::Rectangle#dup})): Added. * (({rbpango_attribute_from_ruby()})): Added. * Fixes * Fixed a bug that wrong (({Pango::Attribute})) conversion. [GitHub#1188][Reported by kojix2] ==== Ruby/GdkPixbuf2 * Improvements * (({GdkPixbuf::Pixbuf#subpixbuf})): Added. (({GdkPixbuf::Pixbuf#new_subpixbuf})) is deprecated. * (({GdkPixbuf::Pixbuf#new})): Improved the default (({row_stride})) value. ==== Ruby/GDK3 * Improvements * (({Gdk::Cursor.new})): Added multiple calls with the same value. [GitHub#1195][Reported by kojix2] ==== Ruby/GTK3 * Improvements * Removed needless custom callback handlers. * Dropped GTK+ 3.10 support. * (({Gtk::Application.new})): Changed to all arguments are omittable. * (({Gtk::TextBuffer#insert})): Changed to raise an exception for unknown tag. * Fixes * Fixed a bug that (({Gtk::Version.or_later?})) requires the 3rd argument. * Fixed demo. * [GitHub#1175][GitHub#1176][GitHub#1177][GitHub#1178][GitHub#1183] [GitHub#1184][GitHub#1185] [Reported by kojix2] * [GitHub#1181][GitHub#1186][GitHub#1197][GitHub#1210] [Patch by kojix2] ==== Ruby/Poppler * Improvements * (({Cairo::Context#show_poppler_page})): Added for consistency. ==== Ruby/RSVG2 * Improvements * (({Cairo::Context#show_rsvg_handle})): Added for consistency. ==== Ruby/GStreamer * Improvements * (({Gst::Element.[]})): Added as a shortcut of (({Gst::ElementFactory.make})). * (({Gst::Bus#poll})): Made all arguments omittable. === Thanks * Izumi Tsutsui * okkez * kojix2 * cedlemo * yosuke shiro == Ruby-GNOME2 3.2.5: 2018-05-02 This is a bug fix release of 3.2.4. === Changes ==== Document * Fixes * Fixed typos. [GitHub#1158][Patch by kojix2] [GitHub#1160][Patch by kojix2] ==== Ruby/GLib2 * Fixes * Fixed a GC related crash bug. [GitHub#1162][Reported by Izumi Tsutsui] ==== Ruby/GObjectIntrospection * Improvements * Disabled NULL check for GObject Introspection < 1.42. Because GObject Introspection < 1.42 doesn't support "(nullable)" annotation yet. ==== Ruby/GdkPixbuf2 * Improvements * (({GdkPixbuf::Pixbuf#composite})): Suppressed wrong warning. [GitHub#1156][Reported by Chaistrin] [GitHub#1157][Patch by cedlemo] * Fixes * Added a missing white space into message. [GitHub#1155][Reported by Robert A. Heiler] * (({GdkPixbuf::Pixbuf#composite})): Fixed a bug that width and height are ignored. [Patch by cedlemo] ==== Ruby/GTK3 * Improvements * (({Gtk::TextBuffer#initialize})): Accepted "property-name" form. [GitHub#1161][Reported by kojix2] ==== Ruby/Poppler * Improvements * Added a workaround for poppler-glib 0.63 bug. [GitHub#1159][Reported by HIGUCHI Daisuke] === Thanks * Robert A. Heiler * Chaistrin * cedlemo * kojix2 * Izumi Tsutsui * HIGUCHI Daisuke == Ruby-GNOME2 3.2.4: 2018-04-09 This is a bug fix release of 3.2.3. === Changes ==== Ruby/GLib2 * Fixes * Fixed a bug that some constants aren't defined. If a content name is the same constant name at the top level such as (({Gtk::Object})), the constant isn't defined. [GitHub#1154][Debian#894816][mikutter#1199] [Reported by Akira Ouchi][Forwarded by HIGUCHI Daisuke] ==== Ruby/Rsvg2 * Improvements * Windows: Upgraded bundled librsvg to 2.42.3. === Thanks * Akira Ouchi * HIGUCHI Daisuke == Ruby-GNOME2 3.2.3: 2018-04-03 This is a bug fix release of 3.2.2. === Changes ==== Ruby/GObjectIntrospection * Fixes * Fixed a crash bug when (({GLib::Bytes})) is passed as an argument. == Ruby-GNOME2 3.2.2: 2018-04-02 This is a release to support Ruby 2.5 on Windows. === Changes ==== All * Windows: Added Ruby 2.5 support. [GitHub#1148][Reported by Andy Meneely] * Red Hat: Use (({pkgconfig(name)})) style. [GitHub#1117][Patch by Mamoru TASAKA] ==== Ruby/GLib2 * Improvements * (({GLib::Bytes#to_s})): Changed to return a frozen string to reduce data copy. * Migrated to (({TypedData})) from (({Data})). ==== Ruby/GObjectIntrospection * Improvements * Added (({nil})) argument check. * (({GObjectIntrospection::Loader#rubyish_method_name})): Added (({:n_in_args_offset})) option. * Suppressed a needless copy of (({GLib::Bytes})). * Added filename array support. [GitHub#1151][Patch by cedlemo] * Fixes * Fixed a overflow bug on 32bit. [Debian#766020][Reported by Mario Lang] [GitHub#1137][Forwarded by HIGUCHI Daisuke] ==== Ruby/GTK2 * Fixes * Fix the wrong number of arguments. [GitHub#1133][Reported by Mamoru TASAKA] ==== Ruby/GDK3 * Improvements * Ensured loading GDK 3. [GitHub#1126][Patch by cedlemo] * Fixes * (({Gdk::Screen.default})): Fixed a GC related crash. * (({Gtk::Widget#style_context})): Fixed a GC related crash. [GitHub#1149][Reported by Valentin Pelloin] ==== Ruby/GTK3 * Improvements * Added a tool palette demo. [GitHub#1116][Patch by cedlemo] * Added a shortcut demo. [GitHub#1120][Patch by cedlemo] * Updated demo. [Reported by Titouan Teyssier] [GitHub#1139][Patch by Titouan Teyssier] * Updated README. [GitHub#1127][Patch by cedlemo] * Fixes * (({Gtk::Container#add_child(child)})): Made workable again. ==== Ruby/Poppler * Fixes * (({Poppler::Page#thumbnail_size})): Fixed return value. [GitHub:rcairo/rcairo#51][Reported by Mamoru TASAKA] ==== Ruby/Gnumeric * Improvements * Improved .typelib for Gnumeric detection. [GitHub#1118][Reported by cedlemo] === Thanks * cedlemo * Mamoru TASAKA * Titouan Teyssier * Mario Lang * HIGUCHI Daisuke * Andy Meneely * Valentin Pelloin == Ruby-GNOME2 3.2.1: 2017-11-19 This is a memory related bug fix release. === Changes ==== Ruby/GLib2 * Improvements * (({GLib::Bytes#initialize})): Stopped to copy data for frozen (({String})). ==== Ruby/GObjectIntrospection * Fixes * Fixed memory leaks for output parameters. [GitHub#1113][Reported by Will Bryant] ==== Ruby/GIO2 * Improvements * (({Gio::InputStream#read_all})): Made workable. [GitHub#1110][Reported by Paul van Tilburg] * (({Gio::InputStream#read})): If the given size is (({nil})), read until EOF or error. It's compatible with Ruby's IO objects. ==== Ruby/GTK3 * Improvements * Marked top-level windows automatically. [GitHub#1103][Reported by cedlemo] === Thanks * Paul van Tilburg * cedlemo * Will Bryant == Ruby-GNOME2 3.2.0: 2017-11-07 This is a bug fix release for Ruby/Poppler. === Changes ==== Ruby/GLib * Improvements * (({GLib::IOChannel#create_watch})): Supported. [GitHub#1106][Reported by kspt-johs] * (({GLib::IOChannel#create_watch})): Supported. ==== Ruby/GTK3 * Improvements * Added a sample. [GitHub#1109][Patch by cedlemo] ==== Ruby/Poppler * Improvements * (({Poppler#Document#size})): Added again. * (({Poppler#Document#pages})): Added again. * Fixes * Updated dependencies. [GitHub#1107][Reported by OBATA Akio] * (({Poppler#Document#initialize(:data => data)})): Added workaround. It should be fixed in upstream. === Thanks * kspt-johs * OBATA Akio * cedlemo == Ruby-GNOME2 3.1.9: 2017-10-16 This is a release that includes GObject Introspection migrated Ruby/Poppler. === Changes ==== All * Improvements * Added (({Makefile})) existence check before running (({make})). [GitHub#1065][Patch by HIGUCHI Daisuke] * Fixes * Fixed shebang paths. [GitHub#1066][Patch by HIGUCHI Daisuke] ==== Ruby/GLib * Improvements * Windows: Updated required cairo gem dependency. ==== Ruby/GObjectIntrospection * Improvements * (({GObjectIntrospection::Loader.register_object_class_converter})): Added. * Added (({gboolean *})) output support. * Added (({[GBoxed]})) output support. * Added (({[gboolean]})) input support. ==== Ruby/GDK3 * Improvements * (({Gdk::Window#origin})): Ignored garbage return value. ==== Ruby/GTK3 * Improvements * Added more demos. [GitHub#1096][GitHub#1098][GitHub#1099][GitHub#1103] [Patch by cedlemo] * (({Gtk::Container#add_child})): Added. [GitHub#1101][Reported by Robert A. Heiler] * (({Gtk::Container#remove_child})): Added. [GitHub#1101][Reported by Robert A. Heiler] ==== Ruby/Poppler * Improvements * Migrated to GObject Introspection bindings. [Patch by cedlemo] ==== Ruby/WebKit2GTK * Improvements * Reduced fragile test failure. [GitHub#1067][Patch by HIGUCHI Daisuke] * Followed upstream fix for (({webkit_web_view_new_with_related_view})). [GitHub#1095][Reported by Jeremy Bicha] * Relaxed test to support the latest WebKit2GTK+. [GitHub#1095][Reported by Jeremy Bicha] ==== Ruby/Rsvg2 * Improvements * Added document how to install on Heroku. [GitHub#1071][Patch by Ciocanel Razvan] ==== Ruby/VTE3 * Improvements * (({Vte::Regex})): Added. [GitHub#1087][Patch by cedlemo] === Thanks * HIGUCHI Daisuke * cedlemo * Ciocanel Razvan * Jeremy Bicha * Robert A. Heiler == Ruby-GNOME2 3.1.8: 2017-07-15 This is a bug fix release for macOS install. === Changes ==== Ruby/GLib2 * Improvements * Supported (({--enable-debug})) for C++ sources. * Fixes * Fixed auto libffi detection for Homebrew. [GitHub#1058][Reported by Andy Meneely] ==== Ruby/Pango * Improvements * (({Pango::Rectangle#to_a})): Added. ==== Ruby/GObjectIntrospection * Improvements * Supported non-pointer struct field reader. [GitHub#1042][Reported by cedlemo] * Supported (({GHashTable})). ==== Ruby/CairoGObject * Improvements * CentOS 7: Supported auto native package install. ==== Ruby/GDK3 * Improvements * CentOS 7: Supported auto native package install. ==== Ruby/GTK3 * Improvements * Made more demos workable. ==== Ruby/WebKit2GTK * Improvements * Added a sample that uses proxy. ==== Ruby/GtkSourceView3 * Improvements * CentOS 7: Supported auto native package install. === Thanks * cedlemo * Andy Meneely == Ruby-GNOME2 3.1.7: 2017-07-10 === Changes ==== All * Improvements * Windows: Supported running commands in bundled packages. ==== Ruby/GLib * Improvements * (({GLib::Bytes#size})): Added. * (({GLib::Bytes#length})): Added. * (({GLib::Bytes#pointer})): Added. * Made stable glib-mkenums output. [GitHub#1054][Patch by dai] * Supported GError in callback argument. * Windows: Upgraded bundled GLib to 2.52.3. * Windows: Upgraded bundled Libtasn1 to 4.12. ==== Ruby/GObjectIntrospection * Improvements * Supported freeing GSList. * Supported not GObject Introspection based bindings object for receiver. * Supported int16 array output. * Supported uint16 array output. * Supported uint32 array output. * Supported uint64 array output. * Supported float array output. * Supported double array output. * Supported auto (({#inspect})) defining. * Homebrew: Supported Homebrew not installed at /usr/local. ==== Ruby/Pango * Improvements * Supported attribute again. [GItHub#1033][Reported by Mamoru TASAKA] * Supported (({Pango::Scale})) again. [GItHub#1048][Reported by cedlemo] * Added missing backward compatibility constants. * Windows: Upgraded bundled Pango to 1.40.6. ==== Ruby/GDK3 * Improvements * Windows: Upgraded bundled GTK+ to 3.22.16. ==== Ruby/GTK3 * Improvements * Updated demo. [GitHub#1038][GitHub#1039][GitHub#1040][GitHub#1044][GitHub#1045] [GitHub#1046][GitHub#1047][GitHub#1049][GitHub#1050][GitHub#1051] [GitHub#1052] [Patch by cedlemo] * Supported working on environment that has GTK+ 4. [GitHub#1041][Reported by cedlemo] * (({Gtk::TextTag#weight=})) accepts (({Pango::Weight})). * (({Gtk::TextBuffer#insert_markup})) stops to require length. * (({Gtk::TextTag#scale=})) accepts scale name such as (({:x_small})). * Supported (({GLib::Bytes})) as text buffer input. * (({Gtk::CssProvider#load_from_data})) accepts (({GLib::Bytes})). * Fixes * Fixed a crash bug in demo. [GitHub#1036][Reported by Mamoru TASAKA] ==== Ruby/Rsvg2 * Improvements * Added samples again. * Fixes * Added missing Ruby/CairoGObject dependency. [GitHub#1035][Reported by peret] ==== Ruby/Clutter * Improvements * Windows: Built GDK backend again. [GitHub:#1034][Reported by Alanzote] * Windows: Upgraded bundled Clutter to 1.26.2. ==== Ruby/WebKit2GTK * Improvements * Added a sample that saves screenshot. * Supported (({WebKit2Gtk::WebContext.new(ephemeral: true)})). ==== Ruby/GStreamer * Improvements * Windows: Upgraded bundled libsoup to 2.58.1. * Windows: Upgraded bundled GStreamer to 1.12.1. ==== Ruby/GtkSourceView3 * Improvements * Windows: Upgraded bundled GtkSourceView to 3.24.3. ==== Ruby/VTE3 * Improvements * Windows: Upgraded bundled VTE to 0.48.3. === Thanks * Alanzote * peret * cedlemo * Mamoru TASAKA * dai == Ruby-GNOME2 3.1.6: 2017-06-03 === Changes This is a bug fix release for Windows packages. ==== All * Fixes * Added a missing path existence check on Windows. == Ruby-GNOME2 3.1.5: 2017-06-03 === Changes This is a bug fix release for Windows packages. ==== All * Improvements * Supported RubyInstaller2. ==== Ruby/Pango * Improvements * Add backward compatibility APIs: * (({Pango::FontDescription::WEIGHT_*})) * (({Pango::FontDescription::STYLE_*})) == Ruby-GNOME2 3.1.4: 2017-05-30 === Changes This is a release that supports Ruby 2.4 on Windows. ==== All * Improvements * Supported MSYS2. ==== Ruby/GLib2 * Improvements * Added (({GLib::Object#floating?})) for debugging. ==== Ruby/GIO2 * Improvements * Added (({Gio::File.open})). The followings are deprecated. * (({Gio::File.commandline_arg})) * (({Gio::File.path})) * (({Gio::File.uri})) ==== Ruby/GObjectIntrospection * Improvements * Relaxed expected test result for 32bit environment. [GitHub#1026][Reported by Mamoru TASAKA] * Added tests for (({GObjectIntrospection::ConstantInfo})). [GitHub#1027][Patch by cedlemo] * Supported floating "transfer full" GObject. ==== Ruby/GDK3 * Improvements * Supported (({Cairo::Surface#to_pixbuf(options={})})). (({Cairo::Surface#to_pixbuf(src_x, src_y, width, height)})) is deprecated. ==== Ruby/Rsvg2 * Improvements * Migrated to GObject Introspection bindings. * Renamed to (({Rsvg})) from (({RSVG})). (({RSVG})) is still usable but it's deprecated. [GitHub#1030][Patch by cedlemo] * Supported (({Cairo::Context#render_rsvg_handle(handle, :id => ...)})). ==== Ruby/WebKit2GTK * Improvements * (({WebKit3Gtk::WebView#initialize})): Supported (({Hash})) options. [GitHub#1028][Patch by Matijs van Zuijlen] === Thanks * Mamoru TASAKA * cedlemo * Matijs van Zuijlen == Ruby-GNOME2 3.1.3: 2017-04-27 === Changes This is a release that improve backward compatibility for Ruby/Pango. ==== Ruby/Pango * Improvements * Defined constants under (({Pango})) again for backward compatibility. [GitHub#1022][Reported by Andy Meneely] * Defined constants under (({Pango::Layout})) again for backward compatibility. [GitHub#1022][Reported by Andy Meneely] * (({Pango.pixels})): Added again. * (({Pango::AttrShape#data})): Supported again. * Fixes * (({Pango::Layout#text=})): Fixed a bug that wrong bytesize is used for multibyte string. * (({Pango::Layout#markup=})): Fixed a bug that wrong bytesize is used for multibyte string. === Thanks * Andy Meneely == Ruby-GNOME2 3.1.2: 2017-04-26 There is an incompatible change. (({GBytes})) to (({String})) conversion is changed to (({GBytes})) to (({GLib::Bytes})) conversion. You can get (({String})) by (({GLib::Bytes#to_s})). Other incompatible changes are bugs. Please report them to us. === Changes ==== All * Improvements * Supported auto depended package install for GObject Introspection based bindings. ==== Ruby/GLib2 * Improvements * Supported overriding (({alloc_func})) in super class. * Extracted native package installer code as native-package-installer gem. * (({GLib::Bytes})): Added. * Supported pkg-config 1.1.9 or later. * Fixes * Fixed a build error on CentOS 6 and Ubuntu 12.04. They use GLib < 2.34. [GitHub#1012][Reported by Scot] * Fixed a bug that (({GLib::TypePlugin})) can't be included. [GitHub#1019][Patch by Matijs van Zuijlen] ==== Ruby/GIO2 * Fixes * Fixed a path in test. [GitHub#990][Reported by Mamoru TASAKA] ==== Ruby/GObjectIntrospection * Improvements * Supported getting interface, union and boxed type as a field value. * Supported setting an interface as a field. * Supported more struct types. * Supported cairo-gobject types. * Supported outputting an array of interfaces. [GitHub#1006][Reported by cedlemo] * Supported Rubyish method name conversion for (({list_XXX})) methods that return an array. * Supported customizing field reader method name. * Supported auto (({int})) to boolean conversion for field value. * (({GObjectIntrospection::Repository.default})): Added a GC guard. * Supported inputting (({unichar})). * Supported inputting (({gint64})) C array. * Supported inputting (({gint8})) C array. * Added tests for (({GObjectIntrospection::UnionInfo})). [GitHub#1016][Patch by cedlemo] * Stopped auto (({GBytes})) to (({String})) conversion. (({GBytes})) is converted to (({GLib::Bytes})). It's for efficient byte sequence handling in Ruby. It's an incompatible change. You can use (({GLib::Bytes#to_s})) to get (({String})). * Fixes * (({GObjectIntrospection::RepositoryError})): Fixed parent class. * Fixed a typo. [GitHub#1002][Reported by cedlemo] ==== Ruby/ATK * Improvements * Migrated to GObject Introspection bindings. [GitHub#998][Patch by cedlemo] ==== Ruby/CairoGObject * Fixes * Fixed a double free bug. ==== Ruby/Pango * Improvements * Migrated to GObject Introspection bindings. [GitHub#1007][GitHub#1008][GitHub#1009][GitHub#1010] [GitHub#1011][Patch by cedlemo] [GitHub#1013][GitHub#1014][Patch by Detlef Wagner] ==== Ruby/GdkPixbuf2 * Improvements * Supported GdkPixbuf 2.31.6 on CentOS 7 again. ==== Ruby/GDK3 * Improvements * (({Gdk::Event})) and subclasses: Supported again. * Supported old GDK 3 again. * Supported X11 related features. [GitHub#999][Reported by johnlane] ==== Ruby/GTK3 * Improvements * (({Gtk::Widget#click})): Added. * (({Gtk::Widget#send_key})): Added. * (({Gtk::Widget#wait_for_draw})): Added. * (({Gtk::WiAccelGroup.activate})): Added. * Updated samples. [GitHub#1002][GitHub#1003] [Patch by cedlemo] * (({Gtk::IconTheme#choose_icon})): Changed the default flags to (({0})) from (({:generic_fallback})). * (({Gtk::IconTheme#lookup_icon})): Changed the default flags to (({0})) from (({:generic_fallback})). * Supported GTK+ < 3.20 again. * Fixes * Updated signal name in document. [GitHub#995][Patch by Arnaud Meuret] ==== Ruby/ClutterGdk * Fixes * Ensured initializing GDK. [GitHub#1000][Reported by cedlemo] ==== Ruby/GOffice * Improvements * (({GOffice::Version})): Added. === Thanks * Mamoru TASAKA * Arnaud Meuret * cedlemo * johnlane * Scot * Detlef Wagner * Matijs van Zuijlen == Ruby-GNOME2 3.1.1: 2017-01-26 === Changes ==== All * Improvements * Windows: Supported Ruby 2.4. ==== Ruby/GLib2 * Improvements * (({GLib::DateTime})): Added. [GitHub#961][GitHub#965] [Patch by cedlemo] * (({GLib::TimeZone})): Added. [GitHub#963][Patch by cedlemo] * Stopped to show "message", "info" and "debug" level logs by default. You can enable them by (({$DEBUG = true})). [GitHub#981][Reported by PeterWAWood] * Windows: Updated bundled PCRE to 8.40. ==== Ruby/GObjectIntrospection * Improvements * Supported outputting (({guint8})) array. * Supported converting (({equal})) method to (({==})) method. * Supported auto (({Enumerable})) inclusion for classes and modules that have (({each})) method. ==== Ruby/GIO2 * Improvements * (({Gio::Settings#initialize})): Added backward compatible API again. * Fixes * Supported GIO 2.38 or earlier again. ==== Ruby/Pango * Fixes * (({Pango::LayoutLine#x_to_index})): Fixed a crash bug. * Windows: Updated bundled HarfBuzz to 1.4.1. * Windows: Updated bundled ICU to 58.2. ==== Ruby/GdkPixbuf2 * Improvements * (({GdkPixbuf::Pixbuf#save_to_buffer})): Supported again but it's deprecated. Use (({GdkPixbuf::Pixbuf#save})) instead. * Windows: Updated bundled gdk-pixbuf to 2.36.4. ==== Ruby/GDK3 * Improvements * Windows: Updated bundled GTK+ to 3.22.7. ==== Ruby/GTK3 * Improvements * (({Gtk::TreeViewColumn#initialize})): Supported option Hash. [GitHub#958][Patch by Detlef Wagner] * Updated samples. [Patch by cedlemo] * (({Gtk::Dialog#get_widget_for_response_id})): Supported (({Symbol})) as response ID. [GitHub#978][Patch by Detlef Wagner] * (({Gtk::Container#add})): Changed to return (({self})) again. * Windows: u ==== Ruby/Poppler * Fixes * (({Poppler::IndexIter})): Fixed a crash bug. * (({Poppler::IndexIter#child})): Added a missing (({NULL})) check. * Fixed types of action classes. They must be (({GLib::Boxed})). ==== Ruby/GStreamer * Improvements * Windows: Updated bundled GStreamer to 1.10.2. ==== Ruby/ClutterGStreamer * Improvements * Windows: Updated bundled Clutter-GStreamer to 3.0.22. ==== Ruby/GtkSourceView3 * Improvements * Windows: Updated bundled GtkSourceView to 3.22.2. ==== Ruby/GSF * Improvements * Windows: Updated bundled GSF to 1.14.41. === Thanks * Detlef Wagner * cedlemo * PeterWAWood == Ruby-GNOME2 3.1.0: 2016-11-13 === Changes ==== All * Improvements * update README. [Patch by cedlemo] * fix format in README. * use pthread version of MinGW in build-windows.sh. * improve main Rakefile. * windows : update bundled versions. * Fixes * fix path in gem:windows:push in main Rakefile. * fix markup in NEWS file. * use Win32 thread again in build-windows.sh. * libmount is required for GLib on Linux. * install libgtk-3-dev explicitly. ==== Ruby/GIO2 * Improvements * make (({Gio::SettingsSchemaSource#list_schemas})) Rubyish. * make (({Gio::Settings#set_value})) Rubyish. * support array like API for (({Gio::Settings})). * (({Gio::ActionMap#add_action})) accepts :state * simplify, load (({Gio::File})) with GObject-Introspection loader. * simplify (({Gio::ContentType})) implementation. * Fixes * add missing required argument in test-settings-schema-source.rb. * add version check in Gio tests. * increase required version. * fix typo in action-map.rb. [Path by cedlemo] ==== Ruby/GLIB2 * Improvements * New implementation of GRClosure with new APIS: * RGClosureCallData * RGClosureCallFunc * rbgobj_set_signal_call_func() * rbgobj_get_signal_call_func() * g_rclosure_new_call() * support exit_application error message when no backtrace. * improve rbg_scan_options() performance * show all backtrace on GLib log. [GitHub#935][Suggested by Matijs van Zuijlen] * Fixes * windows: * Fix indent in windows-binary-build-task.rb. * Export glib2_binary_base_dir. * Remove needless "windows_" in methods name in windows-binary-build-task.rb. * add a debug argument for make command. * add GNOME2::Rake::WindowsBinaryBuildTask#binary_base_dir * fix a bug that SIGUSR1 breaks main loop. [GitHub#933][Reported by Vegard Sandengen] * fix error messages typo [Patch by dai-vr] * fix typo in rbgutil.c. [Patch by Kazuhiro NISHIYAMA] * fix style in rbglib_messages.c * remove needless check in rbglib_messages.c and extconf.rb ==== Ruby/GStreamer * Improvements * Fixes * fix text_color_example.rb demo. [Patch by cedlemo] ==== Ruby/GObjectIntrospection * Improvements * support GVariant string array to Ruby [Patch by Konstantinos Natsakis] * use g_variant_iter_init () to reduce dynamic memory allocation * support omitting allow-null arguments in middle of arguments * improve performance in callable-info.rb. * reduce needless method calls. * simplify invoke arguments in rb-gi-method-info.c, it improves performance. * support "can_be_" as predicate prefix. * improve performance calling a method. It catches data from info. * add GI.load shortcut for fast load. * Fixes * use short for 16bit Integer. * accept Array of numbers for gint8/guint8 array * wrong condition in function info arguments management. * use suitable type macros in ruby to C code from rb-gi-argument.c. * assign temporary Ruby object to local variable to guard from GC. * fix name conflict in rb-gi-argument.c. [Reported by kitone] * touch unrefed object in rb-gi-argument.c. * support array of UTF-8. * fill from last omitted arguments in function arguments loader. * add a missing all required case check in function arguments loader. * use rbg_variant_to_ruby in rb-gi-argument.c. * define unlock_gvl as info method. * fix typo in rb-gi-function-info.c. * don't fill missing arguments when given N arguments is less. * sink created GObject based object by default. * fix wrong default argument fill condition. * fix limit when loading arguments infos. [GitHub#895][Reported by cedlemo] * fix libffi return value handling. [GitHub#758][Reported by Mamoru TASAKA] * do not try to run a gtk demo when the user provide a bad demo name. [Patch by cedlemo] * focus on the related line in the TreeView when running demo from command line. [Patch by cedlemo] * do nothing for void type return type. [GitHub#952][Reported by cedlemo] * return value is return type is void but pointer. * windows : update patch support-external-g-ir-scanner.diff. ==== Ruby/GDK * Improvements * make (({Gdk::EventFocus#in})) rubyish. * add init hook as Gdk.on_init * Fixes * backport a patch to fix build error. ==== Ruby/GdkPixbuf2 * Improvements * support loading from file. * Fixes * fix dependency in Rakefile. [GitHub#862][Reported by Mamoru TASAKA] * add missing gio2 dependency in tests. * add missing variable in tests. * omit a test that failed by float error on i386 [GitHub#898][Reported by Mamoru TASAKA] ==== Ruby/GTK3 * Improvements * support for (({Gtk::SpinButton::input})) signal. [GitHub#855][Reported cedlemo] * new gtk demo spinbutton. [Patch by cedlemo] * add demo search_entry.rb [Patch by cedlemo] * update gtk demos to use class form instead of module form. [Patches by cedlemo] * add listbox gtk demo. [Patch by cedlemo] * update editable_cells demo. [Patch by cedlemo] * add glarea demo. [Patch by cedlemo] * update transparent demo. [Patch by Arjun Menon] * update theming_style_classes demo. [Patch by Arjun Menon] * update textscroll demo. [Patch by Arjun Menon] * update stack demo. [Patch by Arjun Menon] * update spinbutton demo. [Patch by Arjun Menon] * create (({Gtk::TreeModel#create_filter})) as an alias of #filter_new. * Fixes * load demos as classes instead of modules in main.rb. [Patch by cedlemo] * enable Gtk::Rc deprecation. * fix treemodelfilter sample issue. * force LC_NUMERIC to C when gtk3 is initialized. [Patch by cedlemo] ==== Ruby/WebKitGTK * Improvements * Fixes * windows : * update dependencies in Rakefile and patches. * use Ubuntu 16.04 as build environment. * install jsmin ==== Ruby/WebKit2GTK * Improvements * Fixes * windows : * update Rakefile and patches. * support auto latest version detection. ==== Ruby/ClutterGdk * Improvements * Fixes * add init hook as Clutter.on_init. * add Clutter and Gdk integration API. ==== Ruby/ClutterGtk * Improvements * add clutter-gdk dependency. * Fixes * window-test.rb sample : use icons only included in the default theme. * remove needless pack method usage in test.rb sample. * follow improved API in event.rb sample. ==== Ruby/ClutterGdk * Improvements * create a GObject-Introspection loader. [Patch by cedlemo] * Fixes * update description in README and in Rakefile. * remove needless code in Rakefile. * remove needless code in GObject-Introspection loader. ClutterGdk is part of Clutter. ==== Ruby/GStreamer * Improvements * add (({Gst::Bin#each})). [GitHub#927][Reported by cedlemo] * add only_gstreamer_version method. * Fixes * use post_load in order to use require_libraries. ==== Ruby/Pango * Fixes * pango windows: remove needless patch. ==== Thanks * Arjun Menon * cedlemo * dai-vr * Kazuhiro NISHIYAMA * kitone * Konstantinos Natsakis * Mamoru TASAKA * Matijs van Zuijlen * Vegard Sandengen == 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. === Changes ==== All * Droped Ruby 2.0.0 support. * Travis: use Trusty beta image. [Patch by Hiroshi Hatake] * Added AltLinux to supported OSes. [Patch by Malo Skrylevo] ==== Ruby/GLib2 * Improvements * Added (({RVAL2CSTR_PTR_ACCEPT_NIL})). * Added (({RVAL2CSTR_RAW})). * Added (({RVAL2CSTR_RAW_ACCEPT_NIL})). * Supported (({GLib::Variant.new(value, type)})). * Added (({GLib::Regex})) class. [Patch by cedlemo] * Supported more variant types in (({rbg_variant_to_ruby})). [Patch by Aurélien Jacobs] * Supported array in (({rg_ruby_to_variant})). [Patch by Aurélien Jacobs] * Added (({GLib::Regex#split})). [Patch by cedlemo] * Added (({GLib::Regex#match})). [Patch by cedlemo] * Added (({GLib::MatchInfo})) class. [Patch by cedlemo] * Added (({GLib::Regex#max_backref})). [Patch by cedlemo] * Added (({GLib::Regex#capture_count})). [Patch by cedlemo] * Added (({GLib::Regex#has_cr_or_lf?})). [Patch by cedlemo] * Added (({GLib::Regex#max_lookbehind})). [Patch by cedlemo] * Added (({GLib::Regex#string_number})). [Patch by cedlemo] * Added (({GLib::Regex.escape_string})). [Patch by cedlemo] * Added (({GLib::Regex#match?})). [Patch by cedlemo] * Added (({GLib::Regex#match_all})). [Patch by cedlemo] * Added (({GLib::Regex#split})). [Patch by cedlemo] * Added (({GLib::Regex#replace})). [Patch by cedlemo] * Added (({GLib::Regex#check_replacement})). [Patch by cedlemo] * Added (({GLib::Regex#replace_eval})). [Patch by cedlemo] * Added (({GLib::MatchInfo#partial_match})). [Patch by cedlemo] * Added (({GLib::MatchInfo#fetch})). [Patch by cedlemo] * Added (({GLib::MatchInfo#[]})). * Added (({GLib::MatchInfo#fetch_pos})). [Patch by cedlemo] * Added (({GLib::MatchInfo#fetch_position})). * Added (({GLib::MatchInfo#fetch_all})). [Patch by cedlemo] * Added (({GLib::MatchInfo#next})). [Patch by cedlemo] * Fixes * Fixed a bug that raw string is converted to UTF-8. * Fixed handling of 64 bits (({FIXNUM})) variant initialization. ==== Ruby/GObjectIntrospection * Improvements * Supported allocated output parameter. * Supported dynamic callback. * Supported enum as output value. * Added function type name in error message. * Added (({RB_ZALLOC})). * Supported freeing GType-ed union. [GitHub#700][Reported by cedlemo] * Added (({GI::Repository#get_version})). * Fixes * Fixed a bug that block is always ignored in singleton method. [ruby-gnome2-devel-ja][Reported by Yuuki Harano] ==== Ruby/GIO2 * Improvements * Supported (({Gio::Application.new(:arguments => [...]})). [GitHub#519][Reported by Mamoru TASAKA] * Started to use dynamic callback. ==== Ruby/GTK3 * Improvements * Supported (({Gtk::Clipboard#request_text})). [ruby-gnome2-devel-en][Reported by Detlef Reichl] * Supported (({Gtk::Clipboard#request_contents})). * Supported (({Gtk::Clipboard#request_image})). * Supported (({Gtk::Clipboard#request_targets})). * Supported (({Gtk::Clipboard#request_rich_text})). * Supported (({Gtk::Clipboard#request_uris})). * Updated main demo application. [Patch by cedlemo] * Updated and finished sample tutorial. [Patch by cedlemo] * Supported (({Gtk::TreeModel#set_sort_func})). [GitHub#596][Reported by Christopher L. Ramsey] * Supported (({Gtk::Box#set_child_packing})). [GitHub#602][Reported by Ibrahim Tencer] * Updated stack demo. [Patch by cedlemo] * Added scale demo. [Patch by cedlemo] * Updated theming style classes demo. [Patch by cedlemo] * Created entry buffer demo. [Patch by cedlemo] * Made (({Gtk::EntryBuffer#new more rubyish})). [Patch by cedlemo] * Added markup demo. [Patch by cedlemo] * Added headerbar demo. [Patch by cedlemo] * Updated css accordion demo. [Patch by cedlemo] * Added pickers demo. [Patch by cedlemo] * Updated links demo. [Patch by cedlemo] * Added overlay demo. [Patch by cedlemo] * Added textmask demo. [Patch by cedlemo] * Added sidebar demo. [Patch by cedlemo] * Updated spinner demo. [Patch by cedlemo] * Updated entry completion demo. [Patch by cedlemo] * Added revealer demo. [Patch by cedlemo] * Updated expander demo. [Patch by cedlemo] * Added overlay2 demo. [Patch by cedlemo] * Updated colorsel demo. [Patch by cedlemo] * (({rbgobj_gc_mark_instance})) has to be called for the (({Gtk::TreeSelection})). [Patch by Hiroyuki Ito] * Updated css basics demo. [Patch by cedlemo] * Made (({Gtk::TreeModel#iter_nth_child})) and (({Gtk::TreeModel#iter_children})) work like (({#get_value})). * Added methods to Gtk::TreeIter: * (({Gtk::TreeIter#previous!})) * (({Gtk::TreeIter#has_child?})) * (({Gtk::TreeIter#n_children})) * (({Gtk::TreeIter#nth_child})) * (({Gtk::TreeIter#children})). [Patch by Hiroyuki Ito] * Added support for (({Gtk::TreeSelection})). [Patch by dutchhome] * Updated builder demo. [Patch by cedlemo] * Updated css pixbufs demo. [Patch by cedlemo] * Updated button box demo. [Patch by cedlemo] * Created css shadows demo. [Patch by cedlemo] * Updated infobar demo. [Patch by cedlemo] * Added support for MenuPositionFunc in (({Gtk::Menu#popup})). [GitHub#61][Reported by Abby Archer] * Made (({Gtk::Widget#translate_coordinates})) more rubyish. [Patch by cedlemo] * Added support for (({EntryCompletionMatchFunc})). [Patch by Hiroyuki Ito] * Updated iconview edit demo. [Patch by cedlemo] * Updated sizegroup demo. [Patch by cedlemo] * Updated cursors demo. [Patch by cedlemo] * Made (({Gtk::MenuItem#new})) like (({Gtk::CheckMenuItem#new})). [Patch by Hiroyuki Ito] * Move the (({#set_values})) implementation to (({Gtk::TreeModel})) instead of (({Gtk::ListStore})). [GitHub#659][Reported by detlef] * Updated search entry2 demo. [Patch by cedlemo] * Updated menus demo. [Patch by cedlemo] * Updated css multiplebgs demo. [Patch by cedlemo] * Added auto generated callback for AssistantPageFunc. * Added auto generated callback for BuilderConnectFunc. * Updated model button demo. [Patch by cedlemo] * Updated dialog demo. [Patch by cedlemo] * Added another example sample for (({Gtk::TreeStore})). [Patch by cedlemo] * Added the methods: * (({Gtk::TreePath#next!})) * (({Gtk::TreePath#prev!})) * (({Gtk::TreePath#up!})) * (({Gtk::TreePath#down!})). [Patch by cedlemo] * Added (({Gtk::TreeIter#first_child})). [Patch by cedlemo] * Updated filtermodel demo. [Patch by cedlemo] * Updated popover demo. [Patch by cedlemo] * Supported (({Gtk::Builder#connect_signals})). * Added new sample icons-theme-viewer.rb. [Patch by cedlemo] * Added new sample menus_from_resources.rb. [Patch by cedlemo] * Updated printing demo. [Patch by cedlemo] * Updated assistant demo. [Patch by cedlemo] * Updated panes demo. [Patch by cedlemo] * Updated font features demo. [Patch by cedlemo] * Fixes: * Fixed a bug that (({Gtk::Widget.set_connect_func})) doesn't work. [GitHub#703][Reported by cedlemo] ==== Ruby/Poppler * Improvements: * Removed needless (({POPPLER_TYPE_ORIENTATION})) binding. [GiHub#653][Reported by Rob Brackett] ==== Ruby/WebKit2GTK * Improvements: * Supported old WebKit2GTK+. === Thanks * Detlef Reichl * Mamoru TASAKA * cedlemo * Christopher L. Ramsey * Hiroyuki Ito * dutchhome Jon Raiford * Rob Brackett * Abby Archer * Yuuki Harano * detlef * Aurélien Jacobs * Hiroshi Hatake * Malo Skrylevo == Ruby-GNOME2 3.0.7: 2015-10-06 It is a bug fix release of 3.0.6. === Changes ==== Ruby/GLib2 * Fixes * Fixed a bug that `xxx_yyy` enum name isn't accepted. [ruby-gnome2-devel-en][Reported by Detlef Reichl] * Fixed a bug that internal Ruby API is used. [ruby-gnome2-devel-en][Reported by Detlef Reichl] ==== Ruby/GTK3 * Improvements * Added backward compatibility API to (({Gtk::TreeView#insert_column})). [ruby-gnome2-devel-en][Reported by Detlef Reichl] === Thanks * Detlef Reichl == Ruby-GNOME2 3.0.6: 2015-10-04 It is a bug fix release of 3.0.5. === Changes ==== Ruby/GLib2 * Improvements * Supported (({GLib.format_size})) on 32bit. [GitHub#565][Reported by Mamoru TASAKA] * Supported (({GLib.format_size_for_display})) on 32bit. [GitHub#565][Reported by Mamoru TASAKA] * Added (({GLib::Version.or_later?})). [GitHub#570][Patch by cedlemo] ==== Ruby/GObjectIntrospection * Improvements * Added (({GObjectIntrospection::Version.or_later?})). [GitHub#572][Patch by cedlemo] * Supported (({GSList})) for filename. [ruby-gnome2-devel-en][Reported by Stefan Salewski] ==== Ruby/GIO2 * Improvements * Added (({Gio::Version.or_later?})). [GitHub#571][Patch by cedlemo] * Made (({Gio::APplicationCommandLine#attributes})) Rubyish. ==== Ruby/Pango * Improvements * Added (({Pango::Version.or_later?})). [GitHub#576][Patch by cedlemo] ==== Ruby/GTK2 * Improvements * Added (({Gtk::Version.or_later?})). [GitHub#574][Patch by cedlemo] ==== Ruby/GTK3 * Improvements * Supported (({Gtk::CellLayout#set_cell_data_func})). [ruby-gnome2-devel-en][Reported by Stefan Salewski] * Supported (({Gtk::Container#add})) with child properties. [ruby-gnome2-devel-en][Reported by Stefan Salewski] * Added (({Gtk::StockItem#[]})) for backward compatibility. [ruby-gnome2-devel-en][Reported by Stefan Salewski] * Added (({Gtk::IconSize::IconSize})) for backward compatibility. [ruby-gnome2-devel-en][Reported by Stefan Salewski] * Supported marking cell renderers in (({Gtk::CellLayout})) for GC. [ruby-gnome2-devel-en][Reported by Stefan Salewski] * Supported (({nil})) for (({Gtk::TreeIter#set_value})). * Supported marking columns in (({Gtk::TreeView})) for GC. [ruby-gnome2-devel-en][Reported by Stefan Salewski] * Updated tutorial samples. [GitHub#567][GitHub#568][GitHub#587][Patch by cedlemo] * Supported marking records in (({Gtk::TreeModel})) for GC. [ruby-gnome2-devel-en][Reported by Stefan Salewski] * Started updating gtk-demo with (({Gtk::Application})). [GitHub#583][GitHub#586][GitHub#588][Patch by cedlemo] * Supported option style API by (({Gtk::Builder#add})). * Supported (({:object_ids})) by (({Gtk::Builder#add})). [GitHub#585][Patch by cedlemo] * Added backward compatible API to (({Gtk.show_uri})). ==== Ruby/GStreamer * Improvements * Added (({Gst::Version.or_later?})). [GitHub#573][Patch by cedlemo] ==== Ruby/Poppler * Improvements * Added (({Poppler::Version.or_later?})). [GitHub#577][Patch by cedlemo] ==== Ruby/RSVG2 * Improvements * Added (({RSVG::Version.or_later?})). [GitHub#578][Patch by cedlemo] ==== Ruby/VTE3 * Improvements * Stopped to run tests for old VTE with new VTE. [GitHub#566][Reported by Mamoru TASAKA] ==== Ruby/WebKitGTK * Improvements * Added (({WebKitGtk::Version.or_later?})). === Thanks * Stefan Salewski * Mamoru TASAKA * cedlemo == Ruby-GNOME2 3.0.5: 2015-09-22 It is a bug fix release for mikutter. === Changes ==== Ruby/GTK2 * Fixes * Fixed a bug that (({g_object_ref_sink()})) isn't called for instance of (({type_register}))ed class. [http://dev.mikutter.hachune.net/issues/771#note-3] [Reported by toshi_a] === Thanks * toshi_a == Ruby-GNOME2 3.0.4: 2015-09-21 It is a build fix release for 32bit Windows. === Changes ==== All * Improvements * Supported auto native package installation on Arch Linux. [GitHub#553][GitHub#563] [Patch by lilole] ==== Ruby/GObjctIntrospection * Fixes * 32bit Windows: Fixed strut field accessors access wrong address. ==== Ruby/ATK * Improvements * Added (({Atk::Version.or_later?})) [GitHub#552] [Patch by cedlemo] ==== Ruby/GdkPixbuf2 * Improvements * Added (({Gdk::Pixbuf::Version.or_later?})). [GitHub#561] [Patch by cedlemo] ==== Ruby/GDK3 * Improvements * Supported GTK+ 3.17.9. [GitHub#558] [Reported by Mamoru TASAKA] ==== Ruby/GTK3 * Improvements * Updated examples. [GitHub#550] [Patch by cedlemo] ==== Ruby/ClutterGstreamer * Improvements * Added (({ClutterGst.load_version})). * Added (({ClutterGst.load_version=})). * Added (({ClutterGst::Version.or_later?})). [GitHub#556] [Patch by cedlemo] === Thanks * cedlemo * lilole * Mamoru TASAKA == Ruby-GNOME2 3.0.3: 2015-09-16 It is a compatibility improvement release of 3.0.2. === Changes ==== All * Improvements * Removed test-unit-notify gem from development dependencies. [GitHub#547] [Patch by cedlemo] ==== Ruby/GObjectIntrospection * Improvements * Supported (({GObjectIntrospection::Repository.prepend_search_path})). * Supported (({GObjectIntrospection::Repository.search_path})). * Windows: Supported requiring library after one (({GObjectIntrospection::Loader#load})). [GitHub#546] [Reported by Abby Archer] ==== Ruby/GTK3 * Improvements * Supported (({Gtk::IconSize.lookup})). [GitHub#544] [Reported by Masafumi Yokoyama] * Supported size name as argument of (({Gtk::Widget#render_icon_pixbuf})). [GitHub#544] [Reported by Masafumi Yokoyama] * Supported (({Gio::Icon})) in (({Gtk::IconTheme#lookup_icon})). [GitHub#544] [Reported by Masafumi Yokoyama] * Supported (({Gtk::TreeModel#iter_parent})). * Supported (({Gtk::TreeIter#parent})). * Updated examples. [GitHub#548] [Patch by cedlemo] * Fixes * Fixed a bug that (({Gtk::Widget.bind_template_child})) is required. [GitHub#549] [Reported by cedlemo] * Fixed a bug that default (({x_option})) and (({y_option})) values of (({Gtk::Table#attach})) is wrong. [GitHub#546] [Reported by Abby Archer] * Windows: Fixed a bug that Ruby/RSVG2 isn't required automatically. [GitHub#546] [Reported by Abby Archer] === Thanks * Masafumi Yokoyama * cedlemo * Abby Archer == Ruby-GNOME2 3.0.2: 2015-09-13 It is a compatibility improvement release of 3.0.1. === Changes ==== Ruby/GObjectIntrospection * Improvements * Supported void pointer. [GitHub#540] [Reported by Abby Archer] * Added (({GObjectIntrospection::Loader.instantiate_gobject_pointer})). ==== Ruby/GDK3 * Improvements * Supported (({Gdk::Window#user_data})). [GitHub#540] [Reported by Abby Archer] * compatibility: (({Cairo::Context#set_source_rgba})) accepts (({nil})) as alpha value. [GitHub#540] [Reported by Abby Archer] * compatibility: Added fallback feature for deprecated (({Gdk::EventScroll::Direction})). * Windows: Added hicolor-icon-theme as fallback theme. ==== Ruby/GTK3 * Improvements * compatibility: (({Gtk::Window#icon=})) accepts icon file name. [GitHub#540] [Reported by Abby Archer] * compatibility: (({Gtk::Dialog#add_button})) accepts (({Symbol})) as response ID. [GitHub#540] [Reported by Abby Archer] * Deprecated (({Gtk::ColorSelectionDialog})). * compatibility: Added fallback feature for deprecated (({Gtk::TextTag::WrapMode})). * compatibility: Added fallback feature for deprecated (({Gtk::TextBuffer#insert(iter, target, *tags)})) usage. * compatibility: Added fallback feature for deprecated (({Gtk::ButtonBox::Style})). * compatibility: Added fallback feature for deprecated (({Gtk::MessageDialog::ButtonsType})). * compatibility: Supported creating an empty image by (({Gtk::Image.new})). * compatibility: Added fallback feature for deprecated (({Gtk::ImageMenuItem.new})) usage. * Supported (({Gtk::TreeIter#next!})). * Supported (({Gtk::TreeModel#get_value})). * compatibility: Added fallback feature for deprecated (({Gtk::Alignment::Align})). * compatibility: Added fallback feature for deprecated (({Gtk::Widget#get_size_request})). * compatibility: Added fallback feature for deprecated (({Gtk::Table.new})). * compatibility: Added fallback feature for deprecated (({Gtk::Table#column_spaces})). * compatibility: Added fallback feature for deprecated (({Gtk::Table#column_spaces=})). * compatibility: Added fallback feature for deprecated (({Gtk::Table#attach})). * compatibility: Added fallback feature for deprecated (({Gtk::ToggleButton.new})). * Windows: Added missing Ruby/RSVG2 dependency. * compatibility: Added fallback feature for deprecated (({Gtk::Container#each_forall})). * Supported (({nil})) as (({size})) for (({Gtk::Image.new})). * compatibility: Added fallback feature for deprecated (({Gtk::Image.new(pixbuf)})). * compatibility: Added fallback feature for deprecated (({Gtk::Toolbar::Style})). * Supported Rubyish (({Gtk::CheckMenuItem.new})). * Fixes * Fixed samples. [GitHub#536][GitHub#541] [Patch by cedlemo] [GitHub#540] [Reported by Abby Archer] * Fixed a bug that (({Gtk::Calendar#date})) returns (({0-11})) range month value. ==== Ruby/RSVG2 * Improvements * Windows: Added missing Ruby/Pango dependency. * Windows: Updated loaders.cache for gdk-pixbuf automatically. ==== Ruby/GStreamer * Improvements * compatibility: (({Gst::TypeFindFactory#extensions})) always returns (({Array})). === Thanks * cedlemo * Abby Archer == Ruby-GNOME2 3.0.1: 2015-09-11 It is a bug fix release of 3.0.0. === Changes ==== Ruby/GLib2 * Fixes * Windows: Fixed a bug that large number flag value isn't usable. [GitHub#538] [Reported by Abby Archer] ==== Ruby/GTK3 * Improvements * Updated tutorials. [GitHub#534][GitHub#537] [Patch by cedlemo] ==== Ruby/VTE3 * Improvements * Added (({Vte::Version.or_later?})). [GitHub#535] [Patch by cedlemo] === Thanks * cedlemo * Abby Archer == Ruby-GNOME2 3.0.0: 2015-09-10 It is a GTK+ 3.16 support release. To GTK+ 3.16 support, many people helped us. Especially, cedlemo did great works. Very thanks all!!! === Changes ==== All * Improvements * Added install instruction for GitHub master branch. [GitHub#425][Patch by Hiroyuki Sato] ==== Ruby/GLib2 * Improvements * Added new APIs: * (({RVAL2GOBJGLIST})) * (({RVAL2GOBJGSLIST})) * (({rbg_rval2glist})) * (({rbg_rval2gslist})) * (({RVAL2CSTR_PTR})) * (({rbg_name_to_nick})) * (({rbgobj_class_init_func})) * (({rbgobj_register_type})) * Changed (({RVAL2CSTR})) to return (({NULL})) terminated string. If you want to get raw string that may not be terminated by (({NULL})), use (({RVAL2CSTR_PTR})). * Supported (({Symbol})) as flag value. * Added (({windows_platform?})) * Supported (({GLib::Value.new})) without value. * Supported array of flag value as (({GLib::Flags.new})) input. * Supported name, nick and (({GLib::Enum})) as (({GLib::Enum.new})) input. * Migrated to Markdown for README markup. [GitHub#484][Patch by prpr_man] * Supported (({GVariantType})). * Supported (({GVariant})). * Supported (({GBinding})). [GitHub#524][Reported by cedlemo] * Fixes * Fixed a bug that (({GLib.format_size})) doesn't work 32bit over integer value. [GitHub#413][Reported by eumario] ==== Ruby/GObjectIntrospection * Improvements * Supported non GObject struct as return value. [GitHub#286][Reported by Christopher L. Ramsey] * Supported (({list_XXX})) method name. * Supported freeing (({GList})). * Supported array of struct as input argument. * Supported auto native package install on CentOS 7. * Supported (({can_XXX?})) predicate. * Supported the number of array as input argument. [Suggested by John Cupitt] * Supported array of (({GValue})) as input argument. * Supported array as return value. * Supported (({GClosure})) as input argument. * Supported (({GSList})) as input argument. * Supported (({GSList})) as output argument. [GitHub#324][Reported by cedlemo] * Supported union as input argument. * Supported array of (({guint8})) as input argument. * Supported array of (({gint32})) as input argument. * Supported class methods defined in (({XXXClass})). * Supported (({GList})) as output argument. [GitHub#389][Reported by eumario] * Supported (({GList})) as return value. [GitHub#501][Reported by Christopher L. Ramsey] * Supported (({GVariant})) as return value. [GitHub#502][Reported by kitone] * Fixes * Fixed a bug that (({GList})) return type method always returns nil. * Fixed a bug that not predicate is treated as predicate. * Fixed a bug that (({self})) is different. ==== Ruby/GIO2 * Improvements * Supported (({GAsyncReadyCallback})). [GitHub#302][Reported by Christopher L. Ramsey] * Added (({ActionMap#add_actions})). ==== Ruby/Pango * Improvements * Added (({Pango::Language#sample_string})). ==== Ruby/GDK3 * Improvements * Added backward compatibility APIs. [GitHub#284][Reported by Christopher L. Ramsey] * Added constants in (({Gdk::Selection})). [GitHub#254][Patch by Masafumi Yokoyama] * Added missing deprecations. [GitHub#291][Reported by Michel Boaventura] * Added (({RGBA.parse})). [GitHub#295][Reported by carlosjhr64] * Supported (({Gdk::Rectangle})). [GitHub#319][Reported by cedlemo] * Supported (({Gdk::Screen#get_setting})). [GitHub#376][Reported by cedlemo] * Added (({Gdk::Screen#get_monitor})). * Fixes * Fixed a bug that (({GDK_KEY_XXX})) raises an error. [ruby-gnome2-devel-en][Reported by Detlef Reichl] ==== Ruby/GTK3 * Improvements * Migrated to GObject Introspection based bindings from hand writing bindings. Now, all the latest API in GTK+ are supported. [Hiroshi Hatake][Detlef Reichl][cedlemo][John Cupitt] [Masafumi Yokoyama][eumario][PeterWAWood][Daiki Ueno] * Updated samples. [Patch by cedlemo] ==== Ruby/GtkSourceView3 * Improvements * Migrated to GObject Introspection based bindings from hand writing bindings. Now, all the latest API in GtkSourceView are supported. ==== Ruby/VTE3 * Improvements * Migrated to GObject Introspection based bindings from hand writing bindings. Now, all the latest API in VTE are supported. [cedlemo] ==== Ruby/GStreamer * Fixes * Fixed native package name on CentOS and Fedora. * Fixed shebang. [GitHub#507][Patch by Dmitry Marakasov] ==== Ruby/RSVG2 * Improvements * Added (({:file_name})), (({:data})) and (({:flags})) option to (({RSVG::Handle.new})). * Updated a sample. [GitHub#518][Patch by Robert A. Heiler]. * Fixes * Fixed a memory leak of (({RSVG::Handle.new_from_data})) and (({RSVG::Handle.new_from_file})). [GitHub#318][Reported by Kagetsuki] ==== Ruby/Clutter * Improvements * Added (({Clutter::Version.or_later?})). ==== Ruby/WebKit2GTK * Improvements * Added. === Thanks * Hiroshi Hatake * Christopher L. Ramsey * Masafumi Yokoyama * cedlemo * Detlef Reichl * Kagetsuki * eumario * PeterWAWood * Hiroyuki Sato * Daiki Ueno * prpr_mann * Dmitry Marakasov == Ruby-GNOME2 2.2.5: 2015-04-24 It is a GLib 2.44 support release. === Changes ==== Ruby/GLib2 * Improvements * Supported GLib 2.44. [GitHub#361][Reported by Benjamin Maisano] === Thanks * Benjamin Maisano == Ruby-GNOME2 2.2.4: 2014-12-23 It is a x64 Windows support release. === Changes ==== Ruby/GLib2 * Improvements * Stopped to call g_thread_init() for GLib 2.32.0 or later because g_thread_init() is called automatically. * Added GLib.format_size. * Added GLib::Source#name. * Added GLib::Source#name=. * Added GLib::Source#ready_time. * Added GLib::Source#ready_time=. * Added GLib::Source#destroy. * Fixes * Fixed a bug that wrong converter is used on bigendian environment. [GitHub#270][Reported by mtasaka] ==== Ruby/GIO2 * Improvements * Added Gio::DBus. * Fixes * Fixed a bug that Gio::ContentType#executable? isn't defined by correct name. ==== Ruby/GTK2 * Improvements * Gtk::AboutDialog#show: Supported license_type option. [ruby-gnome2-devel-ja][Patch by Hiroyuki Ito] * Fixes * Gtk::AboutDialog#show: Fixed a bug that wrap_license option doesn't work. [ruby-gnome2-devel-ja][Patch by Hiroyuki Ito] ==== Ruby/GObjectIntrospection * Improvements * Supported prefix removing from method name. * Supported GList of UTF-8. [ruby-gnome2-devel-en][Reported by Detlef Reichl] * Added documentation. [GitHub#267][Patch by Detlef Reichl] * Fixes * Fixed a bug that out only argument is required. [GitHub#268][Reported by mtasaka] ==== Ruby/GDK3 * Improvements * Gdk::Window: Added deprecated constants for backward compatibility. * Supported Gdk::Keyval module functions. [GitHub#265][Reported by Detlef Reichl] * Cairo::Context#set_source_rgba: Re-supported (({set_source_rgba(r, g, b, a)})) style. [GitHub#272][Patch by Detlef Reichl] * [windows] Bundled the new default GNOME icon theme. [GitHub#276][Reported by glurp] * Fixes * Gdk::Color.parse: Fixed unexpected API change. [GitHub#276][Reported by glurp] * Fixed a bug that Gdk::Event::Mask fallback doesn't work. [GitHub#276][Reported by glurp] ==== Ruby/GTK3 * Improvements * Gtk::AboutDialog#show: Supported license_type option. [ruby-gnome2-devel-ja][Patch by Hiroyuki Ito] * Gtk::ActionBar: Added. [GitHub#282][Suggested by Christopher L. Ramsey] * Fixes * Gtk::AboutDialog#show: Fixed a bug that wrap_license option doesn't work. [ruby-gnome2-devel-ja][Patch by Hiroyuki Ito] ==== Ruby/RSVG2 * Improvements * RSVG::Handle.new_from_file: Supported flags. You can open a large file with (({:flags => :unlimited})). [GitHub#263][Patch by Taro Matsuzawa] ==== Ruby/Clutter * Improvements * Added Clutter::Feature. * Fixes * Added missing require for Ruby/Pango. * Fixed initializing order. [GitHub#274][Reported by mtasaka] === Thanks * Detlef Reichl * Hiroyuki Ito * mtasaka * glurp * Taro Matsuzawa * Christopher L. Ramsey == Ruby-GNOME2 2.2.3: 2014-10-26 It is a bug fix release. It's recommended that you upgrade if your application uses thread and runs on Ruby 2.0 or later. === Changes ==== All * Improvements * Supported auto native package install on SuSE. ==== Ruby/GLib2 * Fixes * Fixed infinite loop bug on Ruby 2.0 or later. [ruby-gnome2-devel-ja] [Reported by Toshi Hatsune] ==== Ruby/GDK3 * Fixes * Added missing dependencies. [GitHub#258] [Reported by Luis Daniel Gonzalez Orozco] ==== Ruby/CairoGObject * Improvements * Supported auto required native package install by Homebrew. * Fixes * Fixed wrong package name on Debian. ==== Ruby/VTE3 * Improvements * Supported auto required native package install by Homebrew. ==== Ruby/Clutter * Improvements * Added Clutter.check_version?. === Thanks * Luis Daniel Gonzalez Orozco * Toshi Hatsune == Ruby-GNOME2 2.2.2: 2014-10-12 It is a Windows package fix release. == Ruby-GNOME2 2.2.1: 2014-10-12 It is a release that Ruby/GDK3 is migrated to Ruby/GObjectIntrospection based bindings. Some API changes in Ruby/GDK3 are expected but unexpected API changes may exist. If you find API change, please report it. If the API change provides non Rubyish API, it will be a bug. Ruby/GooCanvas is removed because we can't maintain it. === Changes ==== Ruby/GLib2 * Improvements * Added GObject#unref to free large object immediately. * Fixes * [windows] Added a missing exported symbol. ((({rbg_inspect}))) * Fixed a bug that signal handler doesn't work on Ruby 2.1. [ruby-gnome2-devel-en] [Reported by Carlo E. Prelz] * Fixed free function (free -> xfree). ==== Ruby/GObjectIntrospection * Improvements * Supported instantiating union. * Accepted 5 or more the number of signals. It may be increased for later GIO version. [GitHub#229] [Reported by cosmo0920] * Added "?" to boolean field value reader. * Supported mapping function info to method. * Don't handle MethodInfo as FunctionInfo. * Accepted not GType struct as an input argument. * Accepted getting a field value from not GType but GType descendant sruct. * Added Loader.register_constant_rename_map. * Supported in GType array. * Don't require needless array length argument. * Supported finding suitable method that has optional argument. * Fixes * Fixed wrong argument index for Ruby objects. * Fixed a bug that ArgInfo isn't passed. ==== Ruby/CairoGObject * Improvements * Suppressed a warning that instance variable gboxed not initialized. ==== Ruby/GIO2 * Improvements * Supported GLib 2.42.0. Annotation for GObject Introspection is added to g_pollable_input_stream_read_nonblocking() since GLib 2.42.0. See also: https://bugzilla.gnome.org/show_bug.cgi?id=730493 * Supported GLib <= 2.36.0. * Fixes * Fixed a bug that .pc isn't installed. [Reported by OBATA Akio] ==== Ruby/GDK3 * Improvements * Migrated to Ruby/GObjectIntrospection based bindings. * Gdk::Keyval::GDK_KEY_x style is deprecated. Use Gdk::Keyval::KEY_x style instead. * Accepted Gdk::RGBA for Cairo::Context#set_source_rgba. ==== Ruby/GTK3 * Improvements * Added Gtk::StackSwitcher. * Supported interrupt in Gtk.main. * Supported interrupt in Gtk::Dialog#run. [Reported by Carlo E. Prelz] * Added initialization with Gdk::RGBA value. [GitHub#231] [Patch by Detlef Reichl] * Added Gtk::Window#set_titlebar (enable the use of Gtk::HeaderBar). [GitHub#236] [Patch by tescorg] * Updated sample scripts. [Patch by kitachro] * Fixes * Fixed memory leak of Gtk::Image. [GitHub#252] [Reported by Michel Boaventura] ==== Ruby/GTK2 * Improvements * Fixed wrong property value on ppc64 and s390x. [GitHub#256] [Reported by mtasaka] ==== Ruby/GStreamer * Improvements * Added gstreamer.rb for Bundler's autoload. [GitHub#232] [Reported by saepia] * Added Caps.any and Caps.empty. * Supported property for Gst::ChildProxy. [GitHub#233] [Reported by saepia] * Fixes * Fixed a bug that Gst.init is failed. [GitHub#232] [Reported by saepia] ==== Ruby/Poppler * Improvements * Install Poppler with --with-glib option for Homebrew. [GitHub#237] [Reported by Colin Dean] * Removed needless `--with-glib` option. Now, it is the default. [rabbit-shocker/rabbit#24] [Reported by Kazuhiro NISHIYAMA] ==== Ruby/ClutterGStreamer * Improvements * Added clutter-gstreamer.rb to support Bundler's autoload. ==== Ruby/GooCanvas * Removed. === Thanks * OBATA Akio * Carlo E. Prelz * cosmo0920 * Detlef Reichl * saepia * tescorg * Colin Dean * Kazuhiro NISHIYAMA * kitachro * Michel Boaventura * mtasaka == Ruby-GNOME2 2.2.0: 2014-03-09 It is a release that Ruby/GIO2 is migrated to Ruby/GObjectIntrospection based bindings. Some API changes in Ruby/GIO2 are expected but unexpected API changes may exist. If you find API change, please report it. If the API change provides non Rubyish API, it will be a bug. === Changes ==== Ruby/GLib2 * Improvements * Stopped to use deprecated API internally in G_REPLACE_SET_PROPERTY. * Added RG_REPLACE_SET_PROPERTY. * Reduced locking on object creation. * Exported rbg_inspect(). * Created code level error. * Raised code level error instead of domain level error. * Fixes * Fixed a bug that wrong error code may be used. ==== Ruby/GTK2 * Improvements * Suppressed warnings on startup. * Fixes * [windows] Suppressed IME related warnings. [Reported by OBATA Akio] * [GitHub#222] Fixed a bug that Gdk::EventAny related methods aren't used by other Gdk::Event classes. [Reported by mtasaka] ==== Ruby/GDK3 * Improvements * Added Gdk::Display#device_manager. * Added Gdk::Window#display. * Suppressed warnings on startup. * Added Gdk::Event::PROPAGATE. * Added Gdk::Event::STOP. * Fixes * [windows] Suppressed IME related warnings. * Fixed a bug that Gdk::DeviceManager is wrong object. * [GitHub#222] Fixed a bug that Gdk::EventAny related methods aren't used by other Gdk::Event classes. [Reported by mtasaka] ==== Ruby/GTK3 * Improvements * Added Gtk::MenuButton. * [GitHub#219] Added Gtk::LevelBar. [Patch by cosmo0920] * Added Gtk::IconView. * [GitHub#206] Added Gtk::HeaderBar. [Reported by dark-yux] * [GitHub#223] Added Gtk::Stack. [Patch by cosmo0920] * Suppressed warnings on startup. * Added Gtk::Revealer. * Updated sample scripts. * [GitHub#227] Added Gtk::SearchBar. [patch by cosmo0920] ==== Ruby/GIO2 * Improvements * Migrated to Ruby/GObjectIntrospection based bindings. * [SF.net#187] Supported Gio::ContentType.guess. [Reported by neversleep1911] * Added Gio::Resources.lookup_data. * Added Gio::Resources.open_stream. * Added Gio::Resources.enumerate_children. * Added Gio::Resources.get_info. * Added Gio::Resources.register. * Added Gio::Resources.unregister. * Changes * Removed Gio::Socket#create_source. Use Gio::InputStream#create_source or Gio::OutputStream#create_source instead. * Removed Gio::InetAddress.new_from_string. Use Gio::InetAddress.new instead. * Removed Gio::InetAddress.new_any. Use Gio::InetAddress.any instead. * Removed Gio::InetAddress.new_l. Use Gio::InetAddress.any instead. * Fixes * [SF.net#186] Fixed a bug that Gio::ContentType module functions raises "no implicit conversion" error. [Reported by neversleep1911] ==== Ruby/Pango * Improvements * [ruby-gnome2-devel-en] Re-supported build on CentOS 5. [Reported by Grant Schoep] ==== Ruby/Poppler * Improvements * Suppressed a warning on startup. ==== Ruby/GtkSourceView2 * Improvements * [GitHub#226] Suppressed warnings. [Patch by cosmo0920] * Fixes * [GitHub#215] Fixed a return value for GtkSource#get_mark_category_background. [Reported by mtasaka] ==== Ruby/GObjectIntrospection * Improvements * [GitHub#216] Suppressed warnings on armv7hl. [Reported by mtasaka] * Supported freeing interface. * Supported freeing struct. * Supported String as void * value for value. * Supported freeing array of int8. * Supported freeing array of uint8. * Supported defining errors. * Improved guessing target method for overloaded method. * Supported array length. * Supported inout array. * Converted GBytes to String instead of wrapped GBytes. * Supported all exception types rather than GLib::Error. * Changes * Changed returned value of inout array to an array from an array and array length. * Fixes * [GitHub#216] Fixed test failures on i686 environment. [Reported by mtasaka] ==== Ruby/ClutterGTK * Improvements * Added duplicated Clutter.init check. === Thanks * OBATA Akio * mtasaka * cosmo0920 * Grant Schoep * dark-yux * neversleep1911 == Ruby-GNOME2 2.1.0: 2013-12-29 Ruby 2.1.0 support release! === Changes ==== All * Improvements * Set license information to gem. * Fixes * [windows] Added missing binaries for Ruby 2.1.0. [GitHub#123] [Patch by Masafumi Yokoyama] ==== Ruby/GDK3 * Improvements * [windows] Bundled hicolor-icon-theme. It may fix a problem that Windows theme is not applied. [ruby-gnome2-devel-en] [Reported by Regis d'Aubarede] === Thanks * Masafumi Yokoyama * Regis d'Aubarede == Ruby-GNOME2 2.0.3: 2013-12-29 It is RC release for 2.1.0. === Changes ==== All * Improvements * Removed Ruby 1.8 from supported Ruby in READMEs. [GitHub#166] [Reported by Markus Heiler] [Patch by Masafumi Yokoyama] * Supported Ruby 2.1.0. [GitHub#181] [cosmo0920][Masafumi Yokoyama] * Made rcairo optional to required because we dropped old GTK+ that doesn't use cairo. (Cairo isn't used library such as GLib doesn't require rcairo. But Ruby/GLib2 requires rcairo on Windows because it uses zlib bundled in rcairo.) [GitHub#193] [cosmo0920] * Updated LGPL 2.1 files. [GitHub#196] [Reported by ktdreyer] * Supported tests on Travis CI. [Masafumi Yokoyama][cosmo0920] * Supported rake-compiler 0.9.1. ==== Ruby/GLib2 * Improvements * Set UTF-8 encoding to exception message. * Added GLib::GetText.bindtextdomain. * Dropped GLib < 2.12 because CentOS 5 has GLib 2.12.3. [GitHub#190] [cosmo0920] * Added GValue#to_s. * [windows] Updated bundled GLib to 2.38.2 from 2.36.2. ==== Ruby/GObjectIntrospection * Improvements * Supported GList return type. * Supported freeing UTF-8 return type. * Supported freeing array return type. * Supported NULL as array return value. * Supported freeing GObject return value. * Supported freeing structure return value. * Supported NULL character for gint8 array. * Fixes * Fixed type conversion from VALUE to GType. [GitHub#186] [Patch by Hiroyuki Tanaka] ==== Ruby/ATK * Improvements * Dropped ATK < 1.12 support because CentOS 5 has GTK+ 1.12.2. [GitHub#191] [cosmo0920] * [windows] Updated bundled ATK to 2.10.0 from 2.8.0. ==== Ruby/Pango * Improvements * Supported cairo 1.6. [GitHub#172] [Patch by Grant Schoep] * Dropped Pango < 1.14 support because CentOS 5 has GTK+ 1.14.9. [GitHub#192] [cosmo0920] * Added Pango::Layout#height=. [GitHub#210] [Patch by Vasily Fedoseyev] * Added Pango::Layout#ellipsized?. [GitHub#210] [Patch by Vasily Fedoseyev] * [windows] Updated bundled Pango to 1.36.1 from 1.34.1. ==== Ruby/GdkPixbuf2 * Improvements * [windows] Added rcairo dependency on Windows for using libpng and zlib bundled in rcairo. * [windows] Updated bundled gdk-pixbuf to 2.30.2 from 2.28.1. ==== Ruby/GTK2 * Improvements * Dropped GTK+ < 2.10 support because CentOS 5 has GTK+ 2.10.4. [GitHub#182] [Patch by cosmo0920] * [windows] Updated bundled GTK+ to 2.24.22 from 2.24.18. ==== Ruby/GDK3 * Improvements * [test] Made more stable. [GitHub#178] [Reported by mtasaka] * Added Gdk::Device#ungrab. [cosmo0920] * Added Gdk::DeviceManager. [cosmo0920] * Added Gdk::Device#get_position. [cosmo0920] * Added Gdk::Device#warp. [cosmo0920] * Added Gdk::Device#grab. [cosmo0920] * Added Gdk::Window#get_device_position. [cosmo0920] * [windows] Updated bundled GTK+ to 3.10.6 from 3.8.2. ==== Ruby/GTK3 * Improvements * [sample] Updated for GTK+ 3. [Masafumi Yokoyama] * Removed Gtk::BindingSet#add_path. * Added Gtk.show_uri. * Fixes * Fixed a bug that Gtk::ActionGroup#add_radio_actions always fails. [ruby-gnome2-devel-ja] [Reported by S. Kitagawa] ==== Ruby/GStreamer * Improvements * Supported calling module functions of Gst module such as Gst.version before calling Gst.init. * Added Gst::Registry#plugins. * Added Gst::Registry#get_features. * Added Gst::ElementFactory#long_name. * Added Gst::ElementFactory#klass. * Added Gst::ElementFactory#author. * Added Gst::ElementFactory#static_pad_templates. * Added Gst::Caps#structures. * Added Gst::Structure#fields. * Gst::Element#flags returns flag object instead of raw integer value. Use Gst::Element#flags_raw for raw integer value. * Gst::PluginFeature#rank returns Gst::Rank instead of raw integer value. Use Gst::PluginFeature#rank for raw integer value. * Supported GstValueList. * [windows] Updated bundled GStreamer to 1.2.1 from 1.0.7. ==== Ruby/Clutter * Improvements * [sample] Updated for Clutter 1.12 or later. [Patch by Kentaro Fukuchi] * [windows] Updated bundled Clutter to 1.16.2 from 1.14.4. ==== Ruby/ClutterGStreamer * Improvements * [sample] Added. [Masafumi Yokoyama] * Fixed a typo in sample. [Reported by Toyo Abe] * [windows] Updated bundled Clutter-GStreamer to 2.0.8 from 2.0.2. ==== Ruby/Poppler * Improvements * Dropped Popper < 0.12 because CentOS has Poppler 0.12.4. [GitHub#212] [cosmo0920] * [windows] Bundled Poppler 0.24.4. ==== Ruby/RSVG * Improvements * [windows] Bundled librsvg 2.40.1. ==== Ruby/GtkSourceView3 * Improvements * Supported auto GtkSourceView install on OS X. [GitHub#177] [Masafumi Yokoyama] * [windows] Updated bundled GtkSourceView to 3.10.1 from 3.8.1. ==== Ruby/GooCanvas * Improvements * [sample] Followed changes caused by migrating to Ruby/GObjectIntrospection. [Masafumi Yokoyama] * Updated FSF address. [GitHub#201] [Reported by ktdreyer] * Fixes * Fixed wrong dependency. [ruby-gnomde2-devel-ja] [Reported by Masafumi Yokoyama] === Thanks * Kentaro Fukuchi * S. Kitagawa * Markus Heiler * Masafumi Yokoyama * Grant Schoep * Toyo Abe * mtasaka * cosmo0920 * Hiroyuki Tanaka * ktdreyer == Ruby-GNOME2 2.0.2: 2013-05-26 Windows XP re-supportted release! === Changes ==== Ruby/GLib2 * Improvements * Added rbgutil_key_equal() convenient function. It is used for comparing key that may be String or Symbol. ==== Ruby/Pango * Improvements * [windows] Forced to disable uniscribe backend of HarfBuzz. [ruby-list:49412] [Reported by Masafumi Yokoyama] * Don't define Pango::CairoFcFontMap and Pango::CairoWin32FontMap because they may cause crash on OS X. [shocker-ja:1119] [Reported by znz] * Updated samples. [GitHub#164] [Patch by Kentaro Fukuchi] * Fixes * Fixed wrong index access in Pango::GlyphString#glyphs. [ruby-gnome2-devel-ja] [Reported by Kentaro Fukuchi] === Thanks * Kentaro Fukuchi * Masafumi Yokoyama * znz == Ruby-GNOME2 2.0.1: 2013-05-25 Ruby 1.8 support is dropped release! === Changes ==== All * Improvements * Dropped Ruby 1.8 support. * Updated bundled binaries versions for Windows. ==== Ruby/Pango * Improvements * Added Pango::CairoFontMap.set_default. * Enabled fontconfig font on Windows. * Defined Pango::CairoFcFontMap on init if it is available. * Defined Pango::CairoWin32FontMap on init if it is available. ==== Ruby/GTK3 * Improvements * Added Gtk::Image#set_from_icon_set. [GitHub#150] [Patch by Detlef Reichl] * Added Gtk::Image#set_from_stock. [GitHub#150] [Patch by Detlef Reichl] * Added Gtk::Image#set_from_gicon. [GitHub#150] [Patch by Detlef Reichl] * Updated samples. [GitHUb#151] [Patch by Detlef Reichl] * Fixes * Fixed a GC related crash bug. [ruby-gnome2-devel-en] [Reported by Detlef Reichl] ==== Ruby/GObjectIntrospection * Improvements * Supported ownership transfer for some input argument types. (Struct and Object) * Supported "(out caller-allocates)" for boxed object. [ruby-gnome2-devel-ja] [Reported by Kentaro Fukuchi] * Supported gpointer in/out. [ruby-gnome2-devel-ja] [Reported by NAKAJIMA Takashi] * Fixes * Fixed missing argument. [GitHub#154] [Reported by Masafumi Yokoyama] ==== RubyGStreamer * Improvements * Supported methods that call callback [ruby-gnome2-devel-ja] [Reported by NAKAJIMA Takashi] * Updated samples. [GitHub#156][GitHub#159][GitHub#160][GitHub#161] [Patch by NAKAJIMA Takashi] * Supported Gst::Bus#set_handler. [ruby-gnome2-devel-ja] [Reported by NAKAJIMA Takashi] * Supported Gst::Controller [ruby-gnome2-devel-ja] [Suggested by NAKAJIMA Takashi] * Stopped to require Gst.init. * Fixes * Fixed out of index access bug. ==== Ruby/GooCanvas * Improvements * Migrated to Ruby/GObjectIntrospection based bindings. * Stopped to require Goo.init. * Fixes * Updated samples. [GitHub#152][GitHub#153][GitHub#155][GitHub#157] [Patch by Masafumi Yokoyama] ==== Ruby/Clutter * Improvements * Stopped to require Clutter.init. * Fixes * Fixed broken samples. [ruby-gnome2-devel-ja] [Patch by Kentaro Fukuchi] ==== Ruby/ClutterGtk * Improvements * Stopped to require ClutterGtk.init. ==== Ruby/ClutterGStreamer * Added. ==== Ruby/WebKitGtk * Improvements * Stopped to require WebKitGtk.init. ==== Ruby/WebKitGtk2 * Improvements * Stopped to require WebKitGtk2.init. === Thanks * Detlef Reichl * NAKAJIMA Takashi * Masafumi Yokoyama * Kentaro Fukuchi == Ruby-GNOME2 2.0.0: 2013-04-29 GObject Introspection based bindings on Windows support release! === Changes ==== NEWS * Fixes * Fixed a typo. [Reported by Masafumi Yokoyama] * FIxed a typo. [Reported by Toyo Abe] ==== Ruby/GLib2 * Improvements * Moved lib/gnome2-*.rb files to lib/gnome2/ directory. * Supported GLib 2.34. [Reported by OBATA Akio] ==== Ruby/GdkPixbuf2 * Fixes * [windows] Fixed PNG can't be handled problem. [ruby-gnoem2-devel-ja] [Reported by Masafumi Yokoyama] ==== Ruby/GDK3 * Improvements * [windows] Removed needless Greybird theme. [ruby-gnome2-devel-en] [Reported by Regis d'Aubarede] * Added Gdk::Window#create_cairo_context [ruby-gnome2-devel-en] [Reported by Detlef Reichl] ==== Ruby/GTK3 * Improvements * Updated samples. [GitHub #140][GitHub #141][GitHub #144] [Patch by Simon Arnaud] [GitHub #142][GitHub #143][GitHub #145][GitHub #146][GitHub #148] [Patch by Detlef Reichl] ==== Ruby/GObjectIntrospection * Improvements * [windows] Supported! ==== Ruby/GStreamer * Improvements * Supported GStreamer 1.0! * Migrated to GObject Introspection bindings! * Dropped GStreamer 0.10 support. ==== Ruby/Clutter * Improvements * [windows] Supported! ==== Ruby/ClutterGTK * Improvements * [windows] Supported! === Thanks * Masafumi Yokoyama * Toyo Abe * OBATA Akio * Regis d'Aubarede * Detlef Reichl * Simon Arnaud == Ruby-GNOME2 1.2.6: 2013-04-02 Broken Ruby/Poppler fix release! === Changes ==== Ruby/GLib2 * Improvements * Removed deprecated GLib::Completion. * Removed deprecated g_source_get_current_time() use. * [windows] Updated bundled GLib to 3.8.0. * [windows] Updated bundled glib-networking to 3.8.0. * [windows] Updated bundled GnuTLS to 3.1.10. ==== Ruby/ATK * Improvements * [windows] Updated bundled ATK to 2.8.0. ==== Ruby/GdkPixbuf2 * Improvements * [windows] Updated bundled gdk-pixbuf to 2.28.0. ==== Ruby/Pango * Improvements * [windows] Updated bundled Pango to 1.34.0. ==== Ruby/GDK3 * Improvements * [windows] Updated bundled GTK+ to 3.8.0. ==== Ruby/Poppler * Fixes * Fixed a bug that Poppler::Page#render is broken. [SF.net#184] [Reported by HARUYAMA Seigo] ==== Ruby/GooCanvas * Improvements * Added a Ruby/GObjectIntrospection based sample. [GitHub #139] [Patch by Masafumi Yokoyama] === Thanks * Masafumi Yokoyama * HARUYAMA Seigo == Ruby-GNOME2 1.2.5: 2013-03-28 Crash bug fix release! === Changes ==== All * Fixes * Fixed crash bugs. [GitHub #138] [Reported by Takuma Nakajima] === Thanks * Takuma Nakajima == Ruby-GNOME2 1.2.4: 2013-03-24 Ruby/WebKitGtk2 addition release! === Changes ==== All * Improvements * Start mswin64 support. (But it is not completed yet.) [GitHub #135] [Patch by usa] ==== Ruby/GLib2 * Improvements * Reduce needless GBoxed object copy. ==== Ruby/GdkPixbuf2 * Fixes * Fix build error by a typo. ==== Ruby/GtkSourceView2 * Improvements * Support auto RPM install on CentOS 6. ==== Ruby/GObjectIntrospection * Improvements * Add method name to arguments validation failure message. * Support specific version loading. ==== Ruby/GTK3 * Improvements * [windows] Add gschemas.compiled. [ruby-talk:406026] [Reported by Regis d'Aubarede] ==== Ruby/WebKitGtk2 * New! [GitHub #136] [Patch by eumario] === Thanks * usa * Regis d'Aubarede * eumario == Ruby-GNOME2 1.2.3: 2013-03-17 Clean up release! === Changes ==== Ruby/GTK2 * Remove needless signale handlers restore. ==== Ruby/GTK3 * Remove needless signale handlers restore. == Ruby-GNOME2 1.2.2: 2013-03-11 Ruby 2.0.0 support release! === Changes ==== Ruby/GLib2 * Improvements * Supported test on Ruby 2.0.0. [GitHub #134] [Reported by mtasaka] ==== Ruby/Poppler * Improvements * Removed deprecated GDK support. ==== Ruby/GDK3 * Improvements * Supported Ruby 2.0.0. [GitHub#129] [Reported by TOMITA Masahiro] ==== Ruby/GObjectIntrospection * Improvements * Supported not GType based flags. * Supported not GType based enum. * Supported custom callback function. * Supported .h install. * Supported .pc install. * More Rubyish method names are used. * Stopped to raise exception when there are two or more out parameters. * Added Loader.start_callback_dispatch_thread(). * Supported arguments validation. * Stopped to use array for just one return value. * Supported Enumerator. * Hide constructor methods. ==== Ruby/GtkSourceView3 * Fixes * Fixed wrong deb package name. ==== Ruby/Clutter * Fixes * Fixed wrong initialized check. * Stopped to override Clutter.init unexpectedly. ==== Ruby/ClutterGTK * Fixes * Fixed wrong initialized check. ==== Ruby/WebKitGTK * Fixes * Fixed wrong initialized check. === Thanks * Vincent Carmona (for unreleased GObjectIntrospection based GStreamer bindings) * TOMITA Masahiro * NAKAJIMA Takashi (for unreleased GObjectIntrospection based GStreamer bindings) * mtasaka == Ruby-GNOME2 1.2.1: 2013-01-30 GTK+ 3 support on Mac OS X release! === Changes ==== Ruby/GLib2 * Improvements * Supported custom sudo prompt on auto native package install. [GitHub:126] [Suggested by Yorick Peterse] * Started to support JRuby. (It is not completed yet.) [GitHub:125] [Reported by vpereira] * Accepted unsigned long int size GType. * Removed DL support. * Don't call deprecated g_type_init() for GLib >= 2.35.1. ==== Ruby/GTK2 * Fixes * Fixed a memory leak related Gtk::TreeIter. [GitHub:128] [Patch by Toshiaki Asai] ==== Ruby/GTK3 * Fixes * Fixed a memory leak related Gtk::TreeIter. [GitHub:128] [Patch by Toshiaki Asai] * Fixed a crash bug caused by symbol conflict with Ruby/GDK3 on Mac OS X. [GitHub:127] [Reported by Sergio Campama] [Helped by Watson] ==== Ruby/GDK3 * Improvements * [windows] Bundled Greybird theme. [Suggested by Regis d'Aubarede] ==== Ruby/GooCanvas * Improvements * Added Goo::Canvas#get_items_at [GitHub:124] [Patch by David Maciejak] ==== Ruby/WebKitGTK * Added ==== Ruby/GtkSourceView3 * Improvements * Supported Windows. === Thanks * David Maciejak * Yorick Peterse * vpereira * Toshiaki Asai * Sergio Campama * Watson * Regis d'Aubarede == Ruby-GNOME2 1.2.0: 2013-01-24 GTK+ 3 support release! === Changes ==== All * Added ruby-gtk3 package. Here is a list: * Ruby/GLib2 * Ruby/ATK * Ruby/Pango * Ruby/GdkPixbuf2 * Ruby/GDK3 * Ruby/GTK3 ==== Ruby/GLib2 * Improvements * Supported custom VALUE <-> GBoxed conversion * Supported VALUE <-> GBoxed conversion by RVAL2GOBJ * Added GLib::Source::REMOVE * Added GLib::Source::CONTINUE * Added rbgobj_make_boxed_raw() * Added GLib::Value for internal use * [windows] Updated to the latest GLib: 2.28.8-1 -> 2.34.3 * Changes * Removed deprecated GLib::Win32.get_package_installation_directory * Removed deprecated GLib::Win32.get_package_installation_subdirectory * Added user_data to RGConvertTable callbacks * rbgobj_convert_define() copies passed RGConvertTable * Removed deprecated G_DEF_FUNDAMENTAL. Use RG_DEF_CONVERSION instead ==== Ruby/GIO2 * Improvements * Installed headers ==== Ruby/ATK * Improvements * [windows] Updated to the latest ATK: 1.32.0 -> 2.6.0 ==== Ruby/Pango * Improvements * [windows] Updated to the latest Pango: 1.28.3 -> 1.32.6 ==== Ruby/GdkPixbuf2 * Improvements * [windows] Updated to the latest gdk-pixbuf: 2.24.0 -> 2.26.5 ==== Ruby/GTK2 * Improvements * Removed needless not copy flag from Allocation * [windows] Updated to the latest GTK+ 2: 2.24.8 -> 2.24.14 ==== Ruby/GDK3 * Improvements * [windows] Supported: 3.6.4 ==== Ruby/GTK3 * Improvements * Removed needless not copy flag from Allocation * [windows] Supported: 3.6.4 ==== Ruby/GObjectIntrospection * Improvements * Supported over loaded method * Supported over loaded constructor * Supported GBoxed object * Supported char * * Supported GInterface * Supported CallableInfo * Supported may be null * Supported union object * Supported not GBoxed struct * Supported out parameter * Supported C array * Added "?" suffix to predicate method name * Supported SourceFunc callback * Supported GValue * Added GObjectIntrospection::Loader.register_boxed_class_converter * Supported inout parameter * Supported binary data array * Changes * ArgInfo#[] -> ArgInfo#get_arg ==== Ruby/CairoGObject * Added ==== Ruby/Clutter * Added ==== Ruby/ClutterGtk * Added == Ruby-GNOME2 1.1.9: 2012-12-29 This is a experimental GObjectIntrospection support release. === Changes ==== Ruby/GLib2 * Improvements * Renamed G_DEF_CLASS4 to G_DEF_CLASS_WITH_PARENT. G_DEF_CLASS4 is still usable but it is deprecated. ==== Ruby/GObjectIntrospection * Added. It is still experimental. == Ruby-GNOME2 1.1.8: 2012-12-19 This is a bug fix release for Ruby 2.0.0. === Changes ==== All * Fixes * Fixed a bug that *.so isn't installed with Ruby 2.0.0. == Ruby-GNOME2 1.1.7: 2012-12-10 This is a package for Windows fix release. === Changes ==== Ruby/GTK2 * Fixes * Bundled GTK+ 2.24.8-1 instead of GTK+ 2.24.10-1. [Reported by Mahoro Shimura] === Thanks * Mahoro Shimura == Ruby-GNOME2 1.1.6: 2012-12-02 This is Ruby 2.0.0 support release! === Changes ==== All * Fixes * Fixed install error on Ruby 2.0.0. [ruby-gnome2-devel-en] Recent Ruby: 'depend' files must be changed [Reported by Carlo E. Prelz] ==== Ruby/GLib2 * Improvements * Improved portability a bit. '$,' is used instead of rb_output_fs. [GktHub:#117] [Reported by Marvin Gülker] ==== Ruby/GIO2 * Fixes * Fixed a crash bug on i386. [Reported by TAKATSU Tomonari] ==== Ruby/GTK2 * Improvements * Added Gtk::TreeModel#iter_root. [GitHub:121] [Patch by dmaciejak] * Added Gtk::TreeModel#iter_next. [GitHub:121] [Patch by dmaciejak] ==== Ruby/GdkPixbuf2 * Fixes * Fixed build errors with old gdk-pixbuf. ==== Ruby/Poppler * Improvements * Added missing required Poppler version. [Suggested by Grant Schoep] [ruby-gnome2-devel-en] poppler, build fails, incorrect required_pkg_config_package? * Fixes * Fixed a wrong package name on Red Hat and Fedora. [Reported by Grant Schoep] [ruby-gnome2-devel-en] poppler, build fails, incorrect required_pkg_config_package? * Changes * Disabled auto Poppler install for Homebrew. It requires --with-glib option but auto install with --with-glib option isn't supported yet. ==== Ruby/GooCanvas * Improvements * Added Goo::Canvas#update. [GitHub:119] [Patch by dmaciejak] * Added Goo::Canvas#request_update. [GitHub:119] [Patch by dmaciejak] * Added Goo::Canvas#convert_from_pixels. [GitHub:123] [Patch by dmaciejak] * Added Goo::Canvas#convert_to_pixels. [GitHub:123] [Patch by dmaciejak] * Added Goo::Canvas#get_item_at. [GitHub:123] [Patch by dmaciejak] * Added Goo::Canvas#bounds. [GitHub:123] [Patch by dmaciejak] ==== Ruby/GStreamer * Improvements * Don't pass -h and --help to GStreamer. [GitHub:#118] [Reported by dmaciejak] === Thanks * TAKATSU Tomonari * dmaciejak * Grant Schoep * Carlo E. Prelz * Marvin Gülker == Ruby-GNOME2 1.1.5: 2012-08-29 This is a network support improvement release! === Changes ==== Ruby/GLib2 * Improvements * windows: Bundled glib-networking. ==== Ruby/GIO2 * Improvements * Added Gio::TlsCertificate. * Added Gio::TlsCertificateFlags. ==== Ruby/GTK2 * Improvements * Added Gtk.show_uri. * Fixes * Gtk::TreeStore#reorder: Fixed wrong the number of reorder values check. [SF.net#3561748] [Reported by Nounou] === Thanks * Nounou == Ruby-GNOME2 1.1.4: 2012-07-21 This is a easy to install release! === Changes ==== All * Improvements * Supported automatic required native packages install. ==== Ruby/GLib2 * Improvements * mkenums: Supported "/* < flags > */" tag. * mkenums: Supported two or more upper case characters such as "IO". * Before: GIOStatus -> g_iostatus * After: GIOStatus -> g_io_status * GIOCondition: Changed to GLib::Boxed object from integer. * GLib::Source#attach doesn't require context. * Fixes * Fixed wrong type conversion for GIOCondition. ==== Ruby/GIO2 * Improvements * Gio::Socket#create_source: Supported callback. * Fixes * Fixed return values. * Fixed wrong type conversions. ==== Ruby/GTK2 * Improvements * Re-supported GTK+ 2.10.0. [GitHub:115] [Patch by Grant Schoep] * Fixes * Fixed a typo in test script. [GitHub:109] [Reported by kimura wataru] ==== Ruby/GStreamer * Fixes * Fixed a test failure with GStreamer 0.10.36. [GitHub:111] [Reported by mtasaka] === Thanks * kimura wataru * mtasaka * Grant Schoep == Ruby-GNOME2 1.1.3: 2012-04-08 This is a bug fix release of 1.1.2. === Changes ==== Ruby/GLib2 * Improvements * Added required Ruby version into gemspec. * [GitHub#106] glib-mkenums.rb supported macro lines in header. This change is required for building with GLib 2.31.20. [Reported by mtasaka] * [GitHub#107] Supported tests on PPC. [Reported by mtasaka] * Fixes * Fixed handler_id type. ==== Ruby/GTK2 * Improvements * Added Gtk::TreeViewColumn#set_sort_column_id and Gtk::TreeViewColumn#sort_column_id= for GTK+ < 2.18. [ruby-gnome2-devel-en] Gtk::TreeViewColumn [Reported by grant schoep] * Added Gtk::InfoBar. * Added Gtk::MessageType. * Added Gtk::ResponseType. * Fixes * Fixed build failure with GTK+ < 2.12. [ruby-gnome2-devel-en] compile problems gtk2, ruby-gnome2-all-1.1.2 [Reported by grant schoep] * Fixed require failure with GTK+ < 2.14. [ruby-gnome2-devel-en] NameError: undefined method `color_selection' for class `Gtk::ColorSelectionDialog' [Reported by grant schoep] ==== Ruby/Poppler * Improvements * [GitHub#97] Added Poppler::Page#text_layout. [Patch by Andrey Kutejko] * [SF.net#3495948] Removed needless poppler-cairo check. [Reported by Pino Toscano] * Fixes * [GitHub#96] Fixed valid state of child index iterator. [Patch by Andrey Kutejko] * [GitHub#97] Fixed parameter check of Poppler::Page#get_text. [Patch by Andrey Kutejko] ==== Ruby/VTE * Fixes * Fixed build failure with VTE < 0.24. ==== Ruby/GStreamer * Improvements * Added Gst::Element#seek_simple. * Fixes * [GitHub#95] Fixed async test. [Reported by mtasaka] === Thanks * mtasaka * grant schoep * Andrey Kutejko * Pino Toscano == Ruby-GNOME2 1.1.2: 2012-01-15 This is a bug fix release of 1.1.1. === Changes ==== Ruby/GLib2 * Fixes * [GitHub#94] install missing header files. [Reported by mtasaka] ==== Ruby/Pango * Fixes * [GitHub#94] install a missing header file. [Reported by mtasaka] ==== Ruby/GdkPixbuf2 * Fixes * [GitHub#94] install missing header files. [Reported by mtasaka] === Thanks * mtasaka == Ruby-GNOME2 1.1.1: 2012-01-14 This is a bug fix release of 1.1.0. === Changes ==== Ruby/GLib2 * Fixes * [ruby-list:48587] Re: [ANN] Ruby-GNOME2 1.1.0 fix wrong parent class for GLib::IOChannelWin32Socket. [Reported by ashbb] ==== Ruby/GTK2 * Fixes * Fixed a bug that Gtk::ActionGroup#add_radio_actions always fail. ==== Ruby/GStreamer * Improvements * [win32] Supported FLAC. === Thanks * ashbb == Ruby-GNOME2 1.1.0: 2012-01-05 This is a source cleanup release. === Changes ==== Ruby/GLib2 * Improvements * [GitHub#65] Supported GLib 2.31. [Reported by mtasaka] * Supported comparing between GLib::Enum/GLib::Flags and Symbol. * Fixes * [GitHub#1] Fix GLib::Spawn regression. [Patch by Geoff Youngs] * Plugged memory leaks. * Fixed a crash by GC on Ruby 1.9. * Changes * Remove optional Ruby-GetText-Package dependency. ==== Ruby/GTK2 * Improvements * [ruby-gnome2-devel-en] FileChooserDialog raising warnings on Windows: Added hicolor-icon-theme into gem on Windows. [Suggested by Nikolai Weibull] * Fixes * Fixed a crash by GC. * Plugged memory leaks. * Fixed Gdk::GC#colormap= uses wrong value. * Fixed Gtk::TextBuffer#serialize uses wrong value. ==== Ruby/Pango * Fixes * Plugged memory leaks. ==== Ruby/GdkPixbuf * Improvements * Gdk::Pixbuf.new supports hash argument. * Fixes * Plugged memory leaks. ==== Ruby/GStreamer * Improvements * Supported Windows gem. * Improved memory management. * Fixes * [GitHub#86] Gstreamer: test_caps test fails. [Reported by mtasaka] * [GitHub#87] GStreamer: test_span test fails. [Reported by mtasaka] * [GitHub#87] GStreamer: test_create_clock test fails. [Reported by mtasaka] * [GitHub#89] GStreamer: test_fraction_range_new test fails. [Reported by mtasaka] * [GitHub#91] GStreamer: test_state "sometimes" fails. [Reported by mtasaka] ==== Ruby/Poppler * Fixes * Fixed a wrong conversion in Poppler::Document#find_dest. [Reported by Chloé Desoutter] === Thanks * Geoff Youngs * mtasaka * Chloé Desoutter * Nikolai Weibull == Ruby-GNOME2 1.0.3: 2011-09-19 This is a bug fix release of 1.0.2. === Changes ==== Ruby/GLib2 * Fixes * [#3411234] Supported RubyGems 1.8.6. [Tobias Pfeiffer, Kouhei Sutou] === Thanks * Tobias Pfeiffer == Ruby-GNOME2 1.0.2: 2011-09-18 This is a bug fix release of 1.0.1. === Changes ==== Ruby/GLib2 * Fixes * [#3411204] Supported RubyGems 1.8.6. [Tobias Pfeiffer, Kouhei Sutou] ==== Ruby/GTK2 * Fixes * Fixed the default theme on Windows. [ashbb, Kouhei Sutou] === Thanks * Tobias Pfeiffer * ashbb == Ruby-GNOME2 1.0.1: 2011-09-18 This is a bug fix release of 1.0.0. === Changes ==== Ruby/GLib2 * Improvements * GLib::IOChannel.open supports Windows. [OBATA Akio, Kouhei Sutou] * Added RVAL2STRV_FREE(), CSTRFILENAME2RVAL(), RVAL2STRV, STRV2RVAL(), G_REPLACE_SET_PROPERTY(), G_REPLACE_GET_PROPERTY() and G_REPLACE_ACTION(). [Nikolai Weibull] * Fixes * GLib::IOChannelWin32Socket.new uses raw socket handle not file descriptor. [NAKAMURA Usaku, Kouhei Sutou] ==== Ruby/GTK2 * Fixes * [#3383158] removed non LANG=C characters to be buildable on LANG=C environment. [Antonio Terceiro, Kouhei Sutou] * Fixed Gtk::FileFilter#add_custom crash. [Jeff Moore, Kouhei Sutou] * Fixed initialization order. [ashbb, Kouhei Sutou] ==== Ruby/GooCanvas * Improvements * Supported binary bundled gem. [HAYASHI Kentaro] ==== Ruby/GtkSourceView2 * Fixes * Fixed bundled binary directory path on Windows. [HAYASHI Kentaro] ==== Ruby/GtkMozEmbed * Deprecated. === Thanks * Antonio Terceiro * OBATA Akio * NAKAMURA Usaku * HAYASHI Kentaro * Jeff Moore * ashbb * Nikolai Weibull == Ruby-GNOME2 1.0.0: 2011-07-13 This is the first major release!!! === Changes ==== Document * Fixes * updated deprecated list in README. [Michal Suchanek, Kouhei Sutou] ==== Ruby/GLib2 * Improvements * bind g_io_channel_win32_new_socket() as GLib::IOChannelWin32Socket. [Kouhei Sutou] * Fixes * [#3312572] added missing parentheses. [Evan Phoenix] === Thanks * Evan Phoenix * Michal Suchanek == Ruby-GNOME2 0.90.9: 2011-06-11 NOTE: 0.90.x releases are for 1.0.0 major release. This is the last release of 0.90.x series. The next release will be 1.0.0! === Changes ==== All * Fixes * Fix a bug in version numbers. [Grant Schoep, Vincent Carmona] * Support 'bundle install' . ==== Ruby/GLib2 * Improvements * Support GLib::IOChannel.new(fd) and GLib::IOChannel#fd on Windows. * GLib::IOChannel#write returns written byte not self. [backward incompatible] ==== Ruby/GTK2 * Fixes * fix misc/bindings.rb sample (ruby 1.9). [Vincent Carmona] * [#3305589] fix Gtk::Window#add_accel_group misses a reference to accel group. [Piotr Korzuszek, Kouhei Sutou] * Support cairo related samples in Ruby 1.9. [Jon, Kouhei Sutou] ==== Ruby/GStreamer * Improvements * add Gst::Registry.update method. [Vincent Carmona] ==== Ruby/VTE * Fixes * [#3199587] fix pc install. [OBATA Akio, Kouhei Sutou] ==== Ruby/Poppler * Fixes * [#3292118] don't run needless tests. [Mamoru Tasaka, Kouhei Sutou] ==== Ruby/GtkSourceView2 * Improvements * support Windows. [S.Kitagawa] === Thanks * OBATA Akio * Grant Schoep * Mamoru Tasaka * Piotr Korzuszek * S.Kitagawa * Jon == Ruby-GNOME2 0.90.8: 2011-03-04 NOTE: 0.90.x releases are for 1.0.0 major release. A bug fix release of 0.90.7. === Changes ==== All * Fixes * 'make distclean' does not removed pkg-config files. ==== Ruby/GLib2 * Fixes * fix non-gem rcairo detection. [#3178228] [OBATA Akio, Kouhei Sutou] ==== Ruby/Atk * Fixes * fix 'make distclean' cleans needed a file. [Vincent Carmona] ==== Ruby/Pango * Fixes * fix 'make distclean' cleans needed a file. [Vincent Carmona] ==== Ruby/GTK2 * Fixes * fix require order. [id:kenhys] * [#3046538] fix crash by GC at exit. [Vincent Carmona, Kouhei Sutou] * gtk-demo samples with ruby 1.9 (excepted cairo ones). [Vincent Carmona] ==== Ruby/GooCanvas * Fixes * fix pc install. [#3178294] [OBATA Akio, Kouhei Sutou] ==== Ruby/GStreamer * Improvements * improve missing message. [Vincent Carmona] * add Gst::InstallPlugins. [Vincent Carmona, Kouhei Sutou] * Fixes * fix pc install. [#3178294] [OBATA Akio, Kouhei Sutou] * don't use rbgprivate.h. [#3188442] [Mamoru Tasaka, Kouhei Sutou] ==== Ruby/GtkMozEmbed * Fixes * fix pc install. [#3178294] [OBATA Akio, Kouhei Sutou] ==== Ruby/GtkSourceView2 * Fixes * fix pc install. [#3178294] [OBATA Akio, Kouhei Sutou] === Thanks * OBATA Akio * Vincent Carmona * id:kenhys * Mamoru Tasaka == Ruby-GNOME2 0.90.7: 2011-02-02 NOTE: 0.90.x releases are for 1.0.0 major release. A package fix release of 0.90.6. === Changes ==== Ruby/GLib2 * Improvements * force remove "-Wl,--no-undefined" linker option because Ruby-GNOME2 packages doesn't support the option. [Dobai-Pataky Bálint, Kouhei Sutou] ==== Ruby/GTK2 * Improvements * use "MS-Windows" GTK+ theme by default on Windows. [ashbb, Kouhei Sutou] === Thanks * ashbb * Dobai-Pataky Bálint == Ruby-GNOME2 0.90.6: 2011-01-29 NOTE: 0.90.x releases are for 1.0.0 major release. Removed deprecated packages. All supported packages support RubyGems. All supported packages except Ruby/VTE, Ruby/GStreamer and Ruby/GtkMozEmbed support also Windows binary bundled gem. === Changes ==== All * remove all deprecated packages. [Masaaki Aoyagi] * all supported packages support RubyGems. [Masaaki Aoyagi] ==== Ruby/GLib2 * Imrpovements * add gnome2-raketask.rb that is a utility library to define Rake tasks for Ruby-GNOME2 packages. [Masaaki Aoyagi, Kouhei Sutou] * Fixes * fix GType conversion. [Kouhei Sutou] * fix rcairo installed by RubyGems detection. [Masaaki Aoyagi] ==== Ruby/GIO2 * Improvements * support GIO 2.26. [Nikolai Weibull] ==== Ruby/GStreamer * Improvements * add Gst::MissingURISourceMessage. [Vincent Carmona, Kouhei Sutou] * support RubyGems. [Masaaki Aoyagi] ==== Ruby/Pango * Fixes * rename Pango::LayoutIter#at_last_line! to at_last_line? because at_last_line is a predicate method. (at_last_line! still exists for backward compatibility.) [mrkn, Kouhei Sutou] ==== Ruby/GtkMozEmbed * Improvements * support RubyGems. [Masaaki Aoyagi] * Fixes * support "2.0b7" style module version. #3141244 [reandr, Kouhei Sutou] ==== Ruby/GooCanvas * Improvements * support RubyGems. [Masaaki Aoyagi] ==== Ruby/GtkSourceView2 * Improvements * support RubyGems. [Masaaki Aoyagi] ==== Ruby/VTE * Improvements * support RubyGems. [Masaaki Aoyagi] === Thanks * Vincent Carmona * mrkn * reandr * Nikolai Weibull * Masaaki Aoyagi == Ruby-GNOME2 0.90.5: 2010-10-28 NOTE: 0.90.x releases are for 1.0.0 major release. A build system improvements release. === Changes ==== All * Improvements * add --with-pkg-config-dir option to extconf.rb for *.pc. ==== Ruby/GLib2 * Improvements * glib-mkenums.rb can work with Ruby 1.9 on LANG=C. [Kouhei Sutou] * Bug fixes * fix pkg-config gem dependency. [Kouhei Sutou] == Ruby-GNOME2 0.90.4: 2010-10-24 NOTE: 0.90.x releases are for 1.0.0 major release. A bug fix release of 0.90.3. === Changes ==== Ruby/GLib2 * Bug fixes * add missing '*' for String type conversion. [#3093789] [tmtms, Kouhei Sutou] ==== Ruby/GIO2 * Bug fixes * Remove needless cairo dependency. [OBATA Akio, Kouhei Sutou] ==== Ruby/Libglade2 * Improvements * Don't install *.pc by default. [OBATA Akio, Kouhei Sutou] === Thanks * OBATA Akio * tmtms == Ruby-GNOME2 0.90.3: 2010-10-23 NOTE: 0.90.x releases are for 1.0.0 major release. * Support String encoding in Ruby 1.9. * RVAL2CSTR2 and CSTR2RVAL2 are deprecated. * Ruby/GIO2 is imported as an experimental library. === Changes ==== All * Support String encoding. [Guillaume Cottenceau, Neil Roberts, Kouhei Sutou] * Don't install *.pc by default. Set pkgconfigdir make varialbe like 'make pkgconfigdir=/usr/lib/pkgconfig'. ==== Ruby/GLib2 * Improvements: * declare argument types. [Nobuyoshi Nakada, Kouhei Sutou] ==== Ruby/GIO2 * Imported as an experimental library. [Nikolai Weibull] ==== Ruby/GTK2 * Improvements: * keep backward compatibility around GDK key symbols introduced at GTK+ 2.20. "[ruby-gnome2-devel-en] Constants names change in Gdk::KeyVal" [Vincent Carmona] * move gdk-pixbuf and cairo related methods from Ruby/GdkPixbuf2. "[ruby-gnome2-devel-en] gtk2 dependency to gdkpixbuf2" [Andrea Dallera, Kouhei Sutou] * Bug fixes: * fix GType conversion in Gtk::ItemFactory.new on 64bit platform. [Grant McLean, Steve Wills, Kouhei Sutou] ==== Ruby/GdkPixbuf2 * Improvements: * move gdk-pixbuf and cairo related methods to Ruby/GTK2. "[ruby-gnome2-devel-en] gtk2 dependency to gdkpixbuf2" [Andrea Dallera, Kouhei Sutou] * change .pc filename from ruby-gdkpixbuf2 to ruby-gdk-pixbuf2. ==== Ruby/RSVG2 * Bug fixes: * add missing libcroco dependency on Windows. [U.Nakamura, Kouhei Sutou] ==== Ruby/Poppler * Improvements: * support Popper 0.15.0. [#3079667] [Mamoru Tasaka, Kouhei Sutou] * Bug fixes: * add missing libjpeg dependency on Windows. [U.Nakamura, Kouhei Sutou] * fix installed Ruby/GLib2 gem can't be detected. [kdmsnr, Kouhei Sutou] === Thanks * U.Nakamura * kdmsnr * Mamoru Tasaka * Guillaume Cottenceau * Vincent Carmona * Grant McLean * Steve Wills * Andrea Dallera * Nobuyoshi Nakada * Neil Roberts == Ruby-GNOME2 0.90.2: 2010-09-26 NOTE: 0.90.x releases are for 1.0.0 major release. A RubyGems package fix release. === Changes ==== All * fix path. [kimura wataru, Kouhei Sutou] ==== Ruby/GTK2 * Bug fixes: * fix gtk2/base.rb is missing in gem. [S.Kitagawa, Kouhei Sutou] ==== Ruby/GIO2 * Bug fixes: * fix a typo in .pc name. [#3075619] [O01eg, Kouhei Sutou] ==== Ruby/RSVG2 * Bug fixes: * also check rb_cairo.h availability. [#3075617] [O01eg, Kouhei Sutou] === Thanks * S.Kitagawa * O01eg * kimura wataru == Ruby-GNOME2 0.90.1: 2010-09-23 NOTE: 0.90.x releases are for 1.0.0 major release. A install bug fix release of 0.90.0. === Changes ==== Ruby/ATK * Bug fixes: * fix .pc install path. [OBATA Akio, Kouhei Sutou] ==== Ruby/GTK2 * Bug fixes: * fix .pc install path. [OBATA Akio, Kouhei Sutou] ==== Ruby/Pango * Bug fixes: * fix .pc install path. [OBATA Akio, Kouhei Sutou] ==== Ruby/Poppler * Bug fixes: * fix .pc install path. [OBATA Akio, Kouhei Sutou] ==== Ruby/RSVG * Bug fixes: * fix .pc install path. [OBATA Akio, Kouhei Sutou] === Thanks * OBATA Akio == Ruby-GNOME2 0.90.0: 2010-09-23 NOTE: 0.90.x releases are for 1.0.0 major release. RubyGems support! === Changes ==== Ruby/GTK2 * Bug fixes: * [ruby-gnome2-devel-en] Gtk 2.20, Gtk::Builder and 'name' add Gtk::Buildable#builder_name/set_builder_name. [Simon Arnaud, Kouhei Sutou] === Thanks * Simon Arnaud == Ruby-GNOME2 0.19.4: 2011-04-17 NOTE: 0.19.x releases are development series. This release has many bug fixes and some improvements. The fixed bugs include a memory leak bug on GC. If your application live long time, you should upgrade. === Changes ==== Ruby/GLib2 * Bug fixes: * fixed type_register on Ruby 1.9. [Simon Arnaud, Kouhei Sutou] * fixed memory leak in GC. [Kouhei Sutou] ==== Ruby/GTK2 * Bug fixes: * [#2865895] support GdkWindow's cursor property. NOTE: GTK+ 2.18.0 is unsupported version. [Guillaume Cottenceau, Mamoru Tasaka] * Gtk::MenuItem.new accepts nil as a label. [Kazuhiro NISHIYAMA, Kouhei Sutou] * fixed wrong conversion in Gtk::TreePath#<=>. [Takeuchi Yusuke, Kouhei Sutou] * fix Gtk::RecentInfo#application_info's double free bug. [Kouhei Sutou] * Improvements: * Gdk::Window#invalidate accepts nil as 'area' argument. It means 'invalidates whole window'. [Hiroyuki Ito] * Gtk::Clipbord#request_text sets UTF-8 encoding in Ruby 1.9. [Rg Rg, Kouhei Sutou] * add Gtk::TreePath#==. [Takeuchi Yusuke, Kouhei Sutou] ==== Ruby/Pango * Improvements: * add Pango::Gravity. [Hiroyuki Ito, Kouhei Sutou] ==== Ruby/GdkPixbuf * add Gdk::Pixbuf#pixels=. [Michal Suchanek] ==== Ruby/GStreamer * Bug fixes: * [#2920997] fix argument type. [Johan Kiviniemi] * [#2924886] implement Gst::MessageTag#parse. [Vincent Carmona] ==== Ruby/GtkMozEmbed * Bug Fixes: * [#2924766] fix -Wl,-rpath syntax. [OBATA Akio] * [#2925285] Gtk::MozEmbed#chrome_mask fails. [tobi, Kouhei Sutou] * support XULRunner 1.9.2. [OBATA Akio] === Thanks * Guillaume Cottenceau * Mamoru Tasaka * Michal Suchanek * Simon Arnaud * Kazuhiro NISHIYAMA * Johan Kiviniemi * OBATA Akio * Hiroyuki Ito * Rg Rg * Vincent Carmona * tobi * Takeuchi Yusuke == Ruby-GNOME2 0.19.3: 2009-09-24 NOTE: 0.19.x releases are development series. This release is a bug fix release of 0.19.2. === Changes ==== Ruby/GLib2 * Bug fix: * really fix 'empty $(vendorarchdir) related build problem on CentOS 5.3 x86_64.' [Simon Arnaud, Kouhei Sutou] === Thanks * Simon Arnaud == Ruby-GNOME2 0.19.2: 2009-09-23 NOTE: 0.19.x releases are development series. This release is a bug fix release of 0.19.1. === Changes ==== Ruby/GLib2 * Bug fixes: * empty $(vendorarchdir) related build problem on CentOS 5.3 x86_64. [Toshiyuki Suzumura, Kouhei Sutou] * [#2862022] fix multi thread blocking with Ruby 1.8.6-p368 or later and 1.8.7-p173 or later. [Roy Wright, Andrea Dallera, Kouhei Sutou] * [Debian #502262] work Ruby thread with GTK+. [Johan Walles, Kouhei Sutou] ==== Ruby/GTK2 * Bug fixes: * [#2679744] fix a typo: Gtk::Widget#set_scroll_adjustment -> Gtk::Widget#set_scroll_adjustments. [Kentaro Fukuchi, Kouhei Sutou] ==== Ruby/GtkMozEmbed * Bug fixes: * fix .pc detection. [OBATA Akio, Kouhei Sutou] === Thanks * OBATA Akio * Toshiyuki Suzumura * Roy Wright * Andrea Dallera * Johan Walles * Kentaro Fukuchi == Ruby-GNOME2 0.19.1: 2009-07-26 NOTE: 0.19.x releases are development series. This release is a bug fix release of 0.19.0. === Changes ==== Ruby/GTK2 * use RUBYARCHDIR [OBATA Akio] * #2814953: install missing headers [Mamoru Tasaka] ==== Ruby/GLib2 * Bug fixes: * avoid object allocation while GC [OBATA Akio, Kouhei Sutou] * use RUBYARCHDIR [OBATA Akio] * mkmf-gnome2.rb add "-I$(vendorarchdir)" to $CPPFLAGS. [OBATA Akio, Kouhei Sutou] ==== Ruby/ATK * use RUBYARCHDIR [OBATA Akio] ==== Ruby/Pango * use RUBYARCHDIR [OBATA Akio] * use gem version rcairo as fallback [OBATA Akio] ==== Ruby/Libart * use RUBYARCHDIR [OBATA Akio] ==== Ruby/GdkPixbuf * use gem version rcairo as fallback [OBATA Akio] ==== Ruby/GnomePrint * install rblibgnomeprintversion.h [OBATA Akio, Kouhei Sutou] ==== Ruby/GtkMozEmbeded * fix header generation error caused by missing file [OBATA Akio] ==== Ruby/VTE * support VTE 0.20 [Kouhei Sutou] ==== Ruby/PanelApplet * #2815036: re-support Ruby 1.8.6. [Mamoru Tasaka, Kouhei Sutou] ==== Ruby/Libglade2 * Debian#519786: fix GC related SEGV when a widget in glade is removed by hand. [Arnaud Cornet, Kouhei Sutou] === Thanks * OBATA Akio * Mamoru Tasaka * Arnaud Cornet == Ruby-GNOME2 0.19.0: 2009-05-29 NOTE: 0.19.x releases are development series. This release supports new versions of panel-applet and xulrunner and fixes various bugs including some GC issues === Changes Ruby/GLib2: * add 'const' to name argument of rbgerr_define_gerror() [Nikolai Weibull, Kouhei Sutou] * Bug fixes: * #2420281: Failed to build [troels knak-nielsen, Kouhei Sutou] * #2493874: glib/rbglib_maincontext.c error in "RUBY_UBF_IO" [boo, Kouhei Sutou] * wrong priority conversion in GLib::Timeout.add and GLib::Timeout.add_seconds. [Nikolai Weibull] * fixed limits of basic types [Pascal Terjan] Ruby/GTK2: * Bug fixes: * fixed initialize function is deleted. [kimura wataru, Kouhei Sutou] * checked GTK_FILE_SYSTEM_ERROR availability. GTK+ 2.15.x doesn't have it. [Kouhei Sutou] * fixed GC problems. [Kouhei Sutou] * #2195432: Gtk::RCStyle.set_color_flags wrong conversion [Jesse van den Kieboom, Kouhei Sutou] * #2318481: gtkselectiondata_set Drag and Drop API problem [dave foster, Kouhei Sutou] * #2420281: Failed to build [troels knak-nielsen, Kouhei Sutou] Ruby/Pango: * added Pango::Attribute#start_index= and Pango::Attribute#end_index=. [Geoff Youngs, Kouhei Sutou] Ruby/Poppler: * removed 0.6.x support. 0.8.0 or later is required. [Kouhei Sutou] Ruby/RSVG2: * fixed broken cairo integration. [James Healy, Kouhei Sutou] Ruby/PanelApplet: * #2466921: fixed build failure with libpanel-applet >= 2.25 [Mamoru Tasaka, Kouhei Sutou] * fixed incomplete install. [Pascal Terjan, Kouhei Sutou] Ruby/GtkMozEmbed: * supported XULRunner 1.9.0. [Arnaud Cornet, Kouhei Sutou] Ruby/GNOME2: * supported MinGW. [id:luna_8bit, Kouhei Sutou] Ruby/Bonobo2: * moved Bonobo.setup_x_error_handler to Ruby/BonoboUI2. [id:luna_8bit, Kouhei Sutou] Ruby/BonoboUI2: * moved Bonobo.setup_x_error_handler from Ruby/Bonobo2. [id:luna_8bit, Kouhei Sutou] Ruby/GnomeVFS: * format security error. [Pascal Terjan] === Thanks * kimura wataru * Philipp Götzinger * Andrew S. Townley * Jesse van den Kieboom * James Healy * dave foster * troels knak-nielsen * boo * Geoff Youngs * Arnaud Cornet * id:luna_8bit == Ruby-GNOME2 0.18.0: 2008-09-30 This release fixes some memory leak bugs and has new experimental packages. === Changes Ruby/GLib2: * mkmf-gnome2.rb: add check_cairo. [Kouhei Sutou] * fixed memory leaks. [Kouhei Sutou] * [#2110165] Gdk::Pixbuf memory leak * install glib-enum-types.h. [Andy Spencer] * [#2106938] Install glib-enum-types.h Ruby/GTK2: * add GTK+ 2.12 related bindings. [Guillaume Cottenceau] * fixed initialize order. [Kouhei Sutou] * [#2113491] Incorrect initialize order (compiling with mingw) Ruby/GooCanvas [NEW][EXPERIMENTAL]: * added. [Kouhei Sutou] Ruby/Pango: * fixed memory leaks. [Kouhei Sutou] Ruby/GtkSourceView2 [NEW][EXPERIMENTAL]: * add. [yselkowitz] === Thanks * OBATA Akio * James Healy * Ricky Zheng * Guillaume Cottenceau * Ricky Zheng == Ruby-GNOME2 0.17.0: 2008-09-07 === Release notes * This Release supports Ruby 1.8.7 and has many bug fixes and new bound functions. === Main changes Ruby/GLib: * [#2060606] Crash when removing ruby applet from gnome panel with 0.7rc1 [Kouhei Sutou] Ruby/GTK: * [#2025651] FTBFS with gtk+ 2.13.5 [Cesare Tirabassi, Kouhei Sutou] * [#2043970] Segfaults on 64-bit Linux [Neil Roberts, Kouhei Sutou] Ruby/Pango: * [#2043970] Pango::FontDescription#weight= seg fault [Kouhei Sutou] Many other changes, GC bugs, Segfault fixes. See corresponding ChangeLog for detailed information on changes and contributors. === Thanks Special thanks for your contributions to: (list in no particular order) * Neil Roberts * Cesare Tirabassi * Arnaud Cornet == Ruby-GNOME2 0.17.0-rc1: 2008-06-06 === Release notes * This Release Candidate seems to be pretty stable. Please give us feedback if you encounter any problems. * The win32 bindings will be released later and will be considered as EXPERIMENTAL The changes marked with 2 stars (**) may currently not work on win32 platforms. === Main changes Ruby/GLib: * Bound functions defined since 2.14 and 2.16. * Improved main loop polling. ** * Improved callback handling from non Ruby thread. ** This changes breaks API. Sjoerd, you need to call rbgutil_start_callback_dispatch_thread() in your GStreamer bindings. Sorry. * Supported convenience GEnum and GFlags notation. e.g.: GLib::UTF8.normalize(utf8, GLib::NormalizeMode::NFD) -> GLib::UTF8.normalize(utf8, :nfd) key_file.load_from_data(data, GLib::KeyFile::KEEP_COMMENTS | GLib::KeyFile::KEEP_TRANSLATIONS) -> key_file.load_from_data(data, [:keep_contents, :keep_translations]) * Fixed locale dependent constant name computation. [#1901843] [Kouhei Sutou] Ruby/GTK: * partially support new symbols in 2.12 (Gtk::RecentAction, Gtk::TextBuffer, Gdk::Display, Gtk::TreeViewColumn, Gtk::Stock, Gtk::Widget, Gtk::ScaleButton, Gtk::TreeView, Gtk::VolumneButton, Gtk::Tooptip and Gtk::TextMark only). * [#2025651] FTBFS with gtk+ 2.13.5 [Cesare Tirabassi, Kouhei Sutou] * [#2043970] Segfaults on 64-bit Linux [Neil Roberts, Kouhei Sutou] Ruby/GStreamer: * Worked with GStreamer >= 0.10.x but isn't completed yet. Ruby/Poppler: * Supported poppler-glib 0.6.x and 0.8.0. [Kouhei Sutou] Ruby-GNOME2: * Ruby-GNOME2 can be built with ruby 1.9.0 but doesn't work well without [ruby-dev:34104] patch. * Some extconf.rb improvements Many other changes, GC bugs, Segfault fixes. See corresponding ChangeLog for detailed information on changes and contributors. === Thanks Special thanks for your contributions to: (list in no particular order) * Kazuhiro NISHIYAMA * Kouhei Sutou * Kero van Gelder * Masahiro Sakai * Detlef Reichl * Guillaume Cottenceau * Masahiro Sakai * Mikael Hallendal * Carlo E. Prelz * Sjoerd Simons * Juergen Mangler * Dirk von Schmieden * Mathieu Blondel * Joseph Method * Masayuki Yamaguchi And also special thanks to all other contributors not listed above! == Ruby-GNOME2 0.16.0: 2006-12-30 Ruby-GNOME2: * Fixed serious bugs (depends on GC) * Support GTK+-2.10 and the latest version of each libraries. * Don't include Ruby/GStreamer and Ruby/Libgda. We cancel to support Ruby/GStreamer and Ruby/Libgda. * Cancel to support ruby-1.6.x and GTK+-2.4 or earlier. Ruby/GLib: * Support GLib+-2.10 APIs. [Kouhei Sutou, Masao Mutoh] * Fix segfaults related GC with signal handlers. [Guillaume Cottenceau, Kouhei Sutou] * Add functions for Unicode Manipulation [Kouhei Sutou] GLib::Unicode, GLib::UTF8, GLib::UTF16, GLib::UCS4, GLib::UniChar * Add Key-value file parser [Masao Mutoh] GLib::KeyFile * Add Bookmark file parser [Masao Mutoh] GLib::BookmarkFile * Add Win32 compatibility functions [Masao Mutoh] GLib::Win32 * Add glib-mkenums.rb [Kouhei Sutou, Masao Mutoh] * Other improvement and fix bugs.[Kouhei Sutou, Masao Mutoh] Ruby/ATK: * Support ATK-1.12 APIs. [Masao Mutoh] Ruby/Pango: * Support Pango-1.2, 1.4 APIs [Masao Mutoh] * Fix some bugs. [Masao Mutoh] Ruby/GdkPixbuf: * Move Cairo::Context#set_source_pixbuf from Ruby/GTK.[Kouhei Sutou] You can use the methods unless X server. Ruby/GTK: * Support GTK+-2.10. [Pascal Terjan, Kouhei Sutou, Masao Mutoh] Gtk::PrintUnixDialog, Gtk::PageSetupUnixDialog, Gtk::Print*, Gtk::PageSet Gtk::LinkButton, Gtk::Recent*, Gtk::Assistant, Gtk::StatusIcon * Other improvement and fix bugs [Sjoerd Simons, Kouhei Sutou, Masao Mutoh] Ruby/GNOME: * None. Ruby/GnomeCanvas: * Fixed a bug and trivial improvement. [Masao Mutoh] Ruby/Libglade: * Fixed some bugs and trivial improvement. [Kouhei Sutou, Masao Mutoh] Ruby/Libart: * a trivial improvement. [Kouhei Sutou] Ruby/GConf: * Sample code cleanup. [Masao Mutoh] Ruby/GnomeVFS: * None. Ruby/GtkHtml2: * None. Ruby/GtkGLExt: * None. Ruby/PanelApplet: * None. Deprecated (Use Gtk::StatusIcon in Ruby/GTK+) Ruby/GtkSourceView: * Support gtksourceview-1.8. Some improvements. [Kouhei Sutou, Masao Mutoh] Ruby/GnomePrint: * None. Ruby/GnomePrintUI: * a trivial improvement. [Kouhei Sutou] Ruby/RSVG: * Added a sample [Kouhei Sutou] * Improved, fixed bugs [Kouhei Sutou] Ruby/GtkMozEmbed: * a trivial improvement. [Masao Mutoh] Ruby/Poppler: * Improved, fixed bugs [Kouhei Sutou] Ruby/VTE: * None. Ruby/GStreamer: * Canceled. Ruby/Libgda: * Canceled. == Ruby-GNOME2-0.15.0: 2006-07-01 Ruby/GLib: * Improve signal handlers with pthread ruby(--enable-pthread). [Sjoerd Simons] * Added new fundamental object for other bindings. [Sjoerd Simons] * GLib::Source#remove -> GLib::Source.remove [Kouhei Sutou] * Added new macros (GLIST2ARYF, GLIST2ARY2F, GSLIST2ARYF, GLIST2ARY2F, G_PROTECT_CALLBACK) [Masao Mutoh] * Added GLib.win32_locale, GLib, win32_locale_filename_from_utf8 [Kouhei Sutou] * Improve memory management [Kouhei Sutou, Sjoerd Simons, Masahiro Sakai, Masao Mutoh] * Other improvement and fix bugs. [Sjoerd Simons, Joao Pedrosa, Kouhei Sutou, Masahiro Sakai, Masao Mutoh] Ruby/ATK: * Improved cygwin support. [Masao Mutoh] * Fix a bug. [Masahiro Sakai] Ruby/Pango: * Fix some bugs. [Laurent Sansonetti, Masao Mutoh] * Added Pango::Layout#markup=, Pango::AttrAbsoluteSize [Masao Mutoh] Ruby/GdkPixbuf: * Fix a bug. [NISHI Takao] * Code cleanup [Masao Mutoh] Ruby/GTK: * Improve signal handlers. [Masahiro Sakai] * Added Gtk::Widget#set_widget, #set_requisition. [Daniel Chokola] * Added Gtk::Dialog#get_response. [Masao Mutoh] * Other improvement and fix bugs [Mario Steele, Tilman Sauerbeck, Geoff Youngs, Masahiro Sakai, Kouhei Sutou, Masao Mutoh] Ruby/GNOME: * Follow Ruby/GLib2 change(GRClosure). [Kouhei Sutou] Ruby/GnomeCanvas: * Code cleanup [Kouhei Sutou, Masao Mutoh] Ruby/Libglade: * Fixed some bugs and trivial improvement. [Masao Mutoh] Ruby/Libart: * None. Ruby/GConf: * Sample code cleanup. [Masao Mutoh] Ruby/GStreamer: * Sample code cleanup. [Masao Mutoh] Ruby/GnomeVFS: * Improved and fixed bugs. [Masahiro Sakai, Masao Mutoh] Ruby/GtkHtml2: * Sample code cleanup. [Masao Mutoh] Ruby/GtkGLExt: * Improved and fixed bugs. [Kouhei Sutou, Masao Mutoh] Ruby/Libgda: * Fix build against 1.3.x branch (libgda-2.x). [Laurent Sansonetti] Ruby/PanelApplet: * Fixed a bug [Patch #1431855] Ruby/GtkSourceView: * Sample code cleanup. [Masao Mutoh] Ruby/GnomePrint: * Added Gnome::Print::BINDING_VERSION. Code cleanup [Kouhei Sutou] Ruby/GnomePrintUI: * Added Gnome::PrintUI::BINDING_VERSION. [Kouhei Sutou] * Sample code cleanup. [Masao Mutoh] Ruby/RSVG: * Added RSVG::BINDING_VERSION, RBRSVG_MAJOR_VERSION, RBRSVG_MINOR_VERSION, RBRSVG_MICRO_VERSION. [Kouhei Sutou] * Supported 2.14. * Improved, fixed bugs [Kouhei Sutou, Masao Mutoh] Ruby/GtkMozEmbed: * Improved, fixed bugs [Mirko Maischberger, Masao Mutoh] Ruby/Poppler [NEW] [EXPERIMENTAL]: * Added [Kouhei Sutou] Ruby/VTE [NEW]: * Added [Kouhei Sutou] == Ruby-GNOME2 0.14.1: 2005-11-06 Ruby/GLib: * Fix memory leaks. [Masao Mutoh] Ruby/ATK: * None. Ruby/Pango: * Fix some bugs. [Masao Mutoh] Ruby/GdkPixbuf: * None. Ruby/GTK: * Improve memory management. [Masao Mutoh] Ruby/GNOME: * None. Ruby/GnomeCanvas: * None. Ruby/Libglade: * None. Ruby/Libart: * None. Ruby/GConf: * None. Ruby/GStreamer: * None. Ruby/GnomeVFS: * None. Ruby/GtkHtml2: * None. Ruby/GtkGLExt: * None. Ruby/Libgda: * None. Ruby/PanelApplet: * None. Ruby/GtkSourceView: * None. Ruby/GnomePrint: * None. Ruby/GnomePrintUI: * None. Ruby/RSVG: * None. Ruby/GtkMozEmbed: * None. == Ruby-GNOME2 0.14.0: 2005-10-16 Ruby/GLib: * Fix segfault related on GC. [Masao Mutoh] * Support Ruby-GetText-Pacakge(Include pseudo GetText module). [Masao Mutoh] * Add and completed: [Masao Mutoh] * Glib::Shell, GLib::Completion, GLib::Timer, sample/shell.rb, completion.rb, timer.rb. * Add some methods, improved, fixed bugs: [Pascal Terjan, Sven Herzberg, Masao Mutoh] * GLib, GLib::Object, GLib::MetaInterface, GLib::Enum, GLib::Flags, PKGConfig, extconf.rb, mkmf-gnome2.rb Ruby/ATK: * Support ATK-1.10. [Masao Mutoh] * Add Atk::BUILD_VERSION. [Masao Mutoh] * Add some methods, improved, fixed bugs: [Masao Mutoh] * Atk, Atk::Relation, Atk::RelationSet, Atk::StreamableContent, Atk::Text::Attribute, Atk::Util * Add and completed: [Masao Mutoh] * Atk::Util::KeyEventType Ruby/Pango: * Support Pango-1.10 and cairo [Kouhei Sutou, Masao Mutoh] * Add Pango::BUILD_VERSION. [Masao Mutoh] * Add some methods, improved, fixed bugs: [Kouhei Sutou, Masao Mutoh] * Pango, Pango::Layout, Pango::LayoutLine, Pango::LayoutIter, Pango::Language, Pango::Font, Pango::GlyphItem, Pango::GlyphString, Pango::Context, Pango::Analysis, Pango::Item * Add and completed: [Masao Mutoh] * Pango::ScriptIter, Pango::Script, Pango::(.*)FontMap, Pango::(.*)Face, Pango::(.*)Family, Pango::XFont, Pango::FT2Font, sample/script.rb, break.rb, item.rb, layout.rb * Add classes: [Kouhei Sutou, Masao Mutoh] * Pango::Engine, Pango::EngineShape, Pango::EngineLang Cairo::Context, Pango::CairoFcFont, Pango::CairoFont, Pango::CairoWin32Font, Pango::CairoFontMap * Rename class name: [Masao Mutoh] * Pango::FontSet -> Pango::Fontset, Pango::FontSetSimple -> Pango::FontsetSimple. Ruby/GdkPixbuf: * Support GTK+-2.8. [Guillaume Cottenceau] * Add some methods, improved, fixed bugs: [Kouhei Sutou, Guillaume Cottenceau] * Gdk::Pixbuf * Add and completed: [Guillaume Cottenceau] * Gdk::PixbufSimpleAnim, sample/simpleanim.rb Ruby/GTK: * Support GTK+-2.8. [Guillaume Cottenceau, Masao Mutoh] * Support cairo. [Kouhei Sutou, Masao Mutoh] * Add Gtk::BUILD_VERSION. [Masao Mutoh] * Add some methods, improve, fix bugs: [Guillaume Cottenceau, Masao Mutoh] * Gdk, Gdk::Drawable, Gdk::Display, Gdk::Drawable, Gdk::Cursor, Gdk::Window, Gdk::Screen, Gtk::Action, Gtk::Dialog, Gtk::Drag, Gtk::EntryCompletion, Gtk::FileChooser, Gtk::IconView, Gtk::Image, Gtk::Menubar, Gtk::MenuShell, Gtk::ScrolledWindow, Gtk::SizeGroup, Gtk::Stock, Gtk::TextBuffer, Gtk::TextIter, Gtk::ToolButton, Gtk::TreeRowReference, Gtk::TreeView, Gtk::TreeViewColumn, Gtk::Window, sample/gtk-demo/*.rb * Add: [Guillaume Cottenceau, Kouhei Sutou] * Cairo::Context, Gdk::EventGrabBroken, sample/gtk-demo/cairo_*.rb, sample/misc/rgtk+cairo.rb Ruby/GNOME [Masao Mutoh]: * Support libgnome/libgnomeui-2.12. * Add Gnome::BUILD_VERSION. * Add some methods, improve, fix bugs: * Gnome, Gnome::Util, Gnome::URL, Gnome::Help, Gnome::App, Gnome::Client * Add: Gnome::GConf, Gnome::Sound, Gnome::Trigger * sample/gnome-trigger.rb, sample/gnome-sound.rb Ruby/GnomeCanvas: * Support libgnomecanvas-2.12. [Pascal Terjan, Masao Mutoh] * Add Gnome::Canvas::BUILD_VERSION. [Masao Mutoh] * Add some methods, improve, fix bugs: [Kouhei Sutoh, Pascal Terjan, Masao Mutoh] * Gnome::CanvasItem, Gnome::CanvasPathDef, Gnome::Canvas. * Add: Gnome::CanvasBuf. [Masao Mutoh] Ruby/Libglade [Masao Mutoh]: * Support libglade-2.12. * Add GladeXML::BUILD_VERSION. * Add some methods, improve, fix bugs: bin/ruby-glade-create-template, sample/l10n_*.rb, GladeXML Ruby/Libart [Masao Mutoh]: * Add Art::BUILD_VERSION. * Add: Art::Uta. Ruby/GConf: * Support Cygwin. [Yaakov Selkowitz] * Add GConf::BUILD_VERSION. [Masao Mutoh] Ruby/GStreamer: * Support on Ruby-1.9. [Laurent Sansonetti] * Add Gst::BUILD_VERSION. [Masao Mutoh] * Fix bugs, improve, add some methods: [Masao Mutoh] * Gst::Element Ruby/GnomeVFS: * Support Cygwin. [Yaakov Selkowitz] * Add GnomeVFS::BUILD_VERSION. [Masao Mutoh] * Fix bugs, improve, add some methods: [Masao Mutoh] * GnomeVFS Ruby/GtkHtml2 [Masao Mutoh]: * Add Gtk::HtmlContext::BUILD_VERSION. Ruby/GtkGLExt: * Added Gtk::GL::BUILD_VERSION. [Masao Mutoh] * Fix bugs, improve, add some methods: [Kouhei Sutou] * Gdk::Pixmap Ruby/Libgda: * Support Cygwin. [Yaakov Selkowitz] * Add Gda::BUILD_VERSION. [Masao Mutoh] Ruby/PanelApplet [Masao Mutoh]: * Add PanelApplet::BUILD_VERSION. Ruby/GtkSourceView [Masao Mutoh]: * Support GtkSourcView-1.4. * Add Gtk::SourceView::BUILD_VERSION. * Fix bugs, Improve, Add some methods: * Gtk::SourceView, Gtk::SourceBuffer, Gtk::SourceTag, Gtk::SourceTagStyleMask * Add and completed: * Gtk::SourceStyleScheme, Gtk::SourcePrintJob Ruby/GnomePrint [Kouhei Sutou]: * Support libgnomeprint-2.12. * Add Gnome::Print::BUILD_VERSION * Fix bugs, Improve, Add some methods: * Gnome::PrintContext * Add: sample/gp-pac.rb Ruby/GnomePrintUI [Kouhei Sutou]: * Support libgnomeprintui-2.12. * Add: * Gnome::PrintUI::BUILD_VERSION, Gnome::FontSelection, Gnome::FontPreview, Gnome::FontDialog, Gnome::PrintContentSelector Ruby/RSVG [Kouhei Sutou]: * Support rsvg-2.12. * Add RSVG::BUILD_VERSION Ruby/GtkMozEmbed [NEW]: * Merged. [Mirko Maischberber] * Add Gtk::MozEmbed::BUILD_VERSION [Masao Mutoh] == Ruby-GNOME2 0.13.0: 2005-07-31 Ruby/GLib: * Fixed GCC 4.0 warnings [Masao Mutoh] * Added and completed: [Masao Mutoh] * GLib:PollFD, GLib::Source, GLib::MainLoop, GLib::IOChannel, GLib::Idle, GLib::ChildWatch * Added some methods, improved, fixed bugs: [Vincent Isambart, Masao Mutoh] * PKGConfig, extconf.rb, * Added: [Masao Mutoh] * GLib::MainContext, sample/iochannel.rb, idle.rb, timeout.rb, timeout2.rb, tests/test-iochannel.*, runner.rb, Ruby/ATK: * None. Ruby/Pango: * Fixed GCC 4.0 warnings [Masao Mutoh] * Support x86_64 [Masao Mutoh] * Pango::Layout * Added some methods, improved, fixed bugs: [Mirko Maischberger, Pascal Terjan, Masao Mutoh] * sample/parse.rb, Pango::LayoutLine, Pango::Coverage, Pango::LayoutIter, Pango::FontFamily, Pango::Attriterator Ruby/GdkPixbuf: * Fixed GCC 4.0 warnings [Masao Mutoh] * Fixed bugs, Improved: [Mirko Maischberger, Masao Mutoh] * sample/*.rb Ruby/GTK: * Support x86_64 [Kouhei Sutou, Masao Mutoh] * Gdk::Atom, Gtk::ItemFactory, Gtk::Widget, Gtk::Drag, Gtk::SizeGroup * Fixed GCC 4.0 warnings [Masao Mutoh] * Fixed bugs, Improved, Added some methods: [Hiroyuki Ikezoe, KATO Kazuyoshi, Pascal Terjan, Kouhei Sutou, Mirko Maischberger, Masao Mutoh] * Gtk::ActionGroup, Gtk::IconTheme, Gtk::RC, Gtk::TreeModel, Gdk::TimeCoord, Gdk::Window, Gtk::CellView, Gtk::ToolButton, Gtk::MenuToolButton, Gdk, Gdk::Display, Gdk::GC, Gdk::PangoAttrEmbossed, Gdk::Drawable, Gtk::Window, sample/gtk-demo/main.rb, sample/misc/*.rb, sample/testgtk/*.rb. * Added: [KATO Kazuyoshi, Masao Mutoh] * sample/gtk-demo/hypertext.rb, sample/misc/colorselection.rb Ruby/GNOME [Mirko Maischberger]: * sh-bang (!#) normalization * sample/test-gnome/*.rb Ruby/GnomeCanvas [Kouhei Sutou]: * Support x86_64, Improved. [Kouhei Sutou] * Gnome::CanvasPathDef Ruby/Libglade: * None. Ruby/Libart: * Added [Kouhei Sutou] * Art::DRect, Art::IRect * Fixed bugs, Improved, Added some methods: [Kouhei Sutou, Masao Mutoh] * Art::Affine, Art::BPath. Art::Canvas Ruby/GConf: * None. Ruby/GStreamer: * Fixed GCC 4.0 warnings [Masao Mutoh] * Added: [Laurent Sansonetti] * Gst::XOverLay, sample/video-player.rb, * Fixed bugs, Improved, Added some methods: [Laurent Sansonetti] * Gst::Caps, Gst::Pad, Gst::Element, Gst::TagSetter Ruby/GnomeVFS [Masao Mutoh]: * Fixed bugs, Improved, Added some methods: GnomeVFS::File Ruby/GtkHtml2: * None. Ruby/GtkGLExt: * None. Ruby/Libgda: * None. Ruby/PanelApplet [Masao Mutoh]: * Check libpanel-applet version(2.6 or later): extconf.rb Ruby/GtkSourceView [Masao Mutoh]: * None. Ruby/GnomePrint: * Fixed GCC 4.0 warnings [Masao Mutoh] * Fixed bugs, Improved, Added some methods. [Kouhei Sutou] * Gnome::PrintContext, Gnome::PrintJob, Gnome::PrintConfig, Gnome::PrintUnit, Gnome::PrintPaper, src/lib/gnomeprint2.rb, sample/to_file.rb Ruby/GnomePrintUI: * Fixed GCC 4.0 warnings [Masao Mutoh] * Fixed bugs, Improved, Added some methods. [Kouhei Sutou] * Gnome::PaperSelector, Gnome::PrintUnitSelector, Gnome::PrintPreview, Gnome::PrintDialog, Gnome::PrintConfigDialog, sample/dialog.rb, Ruby/RSVG: * Fixed GCC 4.0 warnings [Masao Mutoh] * Fixed bugs, Improved, Added some methods. [Kouhei Sutou] == Ruby-GNOME2 0.12.0: 2005-03-06 Ruby/GLib: * Support GLib-2.6.x. [Masao, Mutoh] * Support MS VC++. [Masao, Mutoh] * Fix bugs, Improved, Added some methods. [KATO Kazuyoshi, Masao Mutoh] * PKGConfig, rbgobj_lookup_class(). * Added: [Masao, Mutoh] * GLib::Threads, src/lib/pkg-config.rb, sample/spawn.rb. Ruby/ATK [Dafydd Harries, Vincent Isambart, Masao Mutoh]: * Support MS VC++. * Fix bugs, Improved, Added some methods. * Follow Ruby/GLib changes. Ruby/Pango [Masao Mutoh]: * Support Pango-1.8.x. * Support MS VC++. * Follow Ruby/GLib changes. * Added and completed: * Pango::Renderer, Pango::Matrix, Pango::AttrStrikethroughColor, Pango::AttrUnderlineColor, Pango::GlyphItem * Added some methods, improved, fixed bugs: [Matthew Berg] * Pango::Context, Pango::AttList, Pango::Attribute, Pango::Layout, Pango, Pango::AttrSize, Pango::LogAttr, Pango::Item, Pango::Analysis, Pango::Font, Pango::FontDescription, Pango::FontFace, Pango::FontSet, Pango::AttrList, Pango::AttrIterator, Pango::Rectangle, Pango::Layout, Pango::LayoutLine, Pango::LayoutIter, Pango::GlyphInfo * Added * Pango::FcFont, Pango::XftFont, Pango::FontFcFontMap, Pango::XftFontMap. * Renamed, Moved * Pango::FontFamily#list_faces -> #faces. Ruby/GdkPixbuf [leon breedt, Masao Mutoh]: * Support GTK+-2.6.x. * Follow Ruby/GLib changes. * Fixed bugs, Improved, Added some methods for GTK+-2.6.x: * Gdk::PixbufAnimationIter, Gdk::Pixbuf, Gdk::PixbufLoader, Gdk::PixbufFormat Ruby/GTK: * Support Ruby-1.9.x. * Support Pango-1.8.x. * Support GTK+-2.6.x. * Support MS VC++. * Follow Ruby/GLib changes. * Improve to support gthread. * Added and completed for GTK+-2.6.x: [Darren Willis, * Gtk::CellRendererProgress, Gtk::ScrollStep, Gtk::IconView, Gtk::CellRendererCombo, Gtk::AboutDialog, Gdk::PangoRenderer, Gtk::CellView, Gtk::MenuToolButton, Gtk::FileChooserButton, Gdk::EventChange, Gdk::X11 * Fixed bugs, Improved, Added some methods for GTK+-2.6.x: [Mirko Maischberger, Joao Pedrosa, KATO Kazuyoshi, Masao Mutoh] * Gtk, Gtk::CellLayout, Gtk::RadioToolButton, Gtk::ToggleToolButton, Gtk::Stock, Gtk::Image, Gtk::Label, Gtk::Progressbar, Gtk::EntryCompletion, Gtk::TextBuffer, Gtk::FileFilter, Gtk::FileChooser, Gtk::Menu, Gtk::CellRenderer, Gtk::TreeView, Gtk::TextView, Gtk::TextBuffer, Gtk::Drag, Gtk::ToolItem, Gtk::ActionGroup, Gtk::Action, Gtk::ComboBox, Gtk::Combo, Gtk::IconTheme, Gtk::SelectionData, Gtk::TargetList, Gtk::ListStore, Gtk::Window, Gtk::ToggleAction, Gtk::MessageDialog, Gdk::Region, Gdk::Window, Gtk::Clipboard, Gtk::Settings, Gtk::TreeModel, Gtk::ModelFilter, Gtk::TreeViewColumn, Gtk::Widget, Gdk::Pango, Gdk::Display, Gdk::Drawable, Gtk::RadioAction, Gdk::Screen, Gtk::TextBuffer, Gdk::Threads, sample/gtk-demo/*.rb, sample/misc/threads.rb, pangorenderer.rb * Added: [KATO Kazuyoshi, Darren Willis, Masao, Mutoh] * sample/misc/tree_progress.rb, misc_button.rb, aboutdialog.rb, aboutdialog2.rb, sample/gtk-demo/clipboard.rb, entry_completion.rb, expander.rb, iconview.rb Ruby/GNOME [Masao Mutoh]: * Follow Ruby/GLib changes. Ruby/GnomeCanvas [Masao Mutoh]: * Follow Ruby/GLib changes. Ruby/Libglade [Masao Mutoh]: * Follow Ruby/GLib changes. * Support MS VC++. * Improved. Ruby/Libart [KATO Kazuyoshi, Masao Mutoh]: * Follow Ruby/GLib changes. Ruby/GConf [Masao Mutoh]: * Follow Ruby/GLib changes. * Fixed bugs, Improved. * Deprecated: * GConf::Client.new Ruby/GStreamer: * Follow Ruby/GLib changes. [Masao Mutoh] * Added and completed: [Jack Paul, Masao Mutoh, Laurent Sansonetti] * Gst::TypeFindFactory, Gst::MediaInfoError, Gst::Tag, Gst::RegistryPool, Gst::TagSetter * Fixed bugs, Improved, Added some methods: [Jack Paul, Max Nickel, Masao Mutoh, Laurent Sansonetti] * Gst::Plugin, Gst::PluginFeature, Gst::Caps, Gst::Structure, Gst::Xml, Gst::Thread, Gst::Scheduler, Gst::SchedulerFactory, Gst::MediaInfo, sample/gst-inspect.rb Ruby/GnomeVFS [Masao Mutoh]: * Follow Ruby/GLib changes. * Fixed bugs, Improved. Ruby/GtkHtml2 [Masao Mutoh]: * Follow Ruby/GLib changes. Ruby/GtkGLExt [Masao Mutoh]: * Follow Ruby/GLib changes. Ruby/Libgda: * Support 1.1.99 * Follow Ruby/GLib changes. [Masao Mutoh] * Fixed bugs, Improved, Added some methods: [Laurent Sansonetti] Gda::DataModel, Gda::Provider, Gda::Quarklist, Gda::Connection * Renamed, Moved [Laurent Sansonetti] * Gda::DataModel#editable? => #updatable? * #editing? => changed? * #begin_edit => #begin_update * #cancel_edit => #cancel_update * #end_edit => #end_update Ruby/PanelApplet [Neil Stevens, Masao Mutoh]: * Follow Ruby/GLib changes. * Added some methods Ruby/GtkSourceView [Masao Mutoh]: * Follow Ruby/GLib changes. * Added some methods Ruby/GnomePrint: * Follow Ruby/GLib changes. [Masao Mutoh, Kouhei Sutou] * Fixed bugs, Improved, Added some methods. [Kouhei Sutou] Ruby/GnomePrintUI: * Follow Ruby/GLib changes. [Masao Mutoh, Kouhei Sutou] * Fixed bugs, Improved, Added some methods. [Kouhei Sutou] Ruby/RSVG: * Follow Ruby/GLib changes. [Masao Mutoh, Kouhei Sutou] * Fixed bugs, Improved, Added some methods. [Kouhei Sutou] == Ruby-GNOME2 0.11.0: 2004-11-14 Ruby/GLib [Kouhei Sutou, Vincent Isambart, Masao Mutoh]: * Fix bugs, Improved, Added some methods. Ruby/ATK [Vincent Isambart, Masao Mutoh]: * Support ATK+-1.7.x. * Fixed bugs, Improved, Added some methods. Ruby/Pango [Geoff Youngs, Vincent Isambart, Masao Mutoh]: * Improved, Fix bugs. Ruby/GdkPixbuf [Geoff Youngs, Masao Mutoh]: * Support GTK+-2.4.x. * Fixed bugs, Improved, Added some methods. Ruby/GTK [Geoff Youngs, Vincent Isambart, Masao Mutoh]: * Fixed bugs, Improved, Added some methods. Ruby/GNOME [Masao Mutoh]: * Improved. Ruby/GnomeCanvas [Masao Mutoh]: * Fixed bugs, Improved, Added some methods. Ruby/Libglade [Masao Mutoh]: * Improved. Ruby/Libart [Vincent Isambart, Masao Mutoh]: * Improved to support ruby-1.7.x or later. * Changed: [Masao Mutoh] * Art::Canvas::Color.new -> Art::Canvas.color. * Art::Vpath::Dash -> Art::VpathDash. Ruby/GConf [Masao Mutoh]: * Improved. Ruby/GStreamer [Masao Mutoh]: * Improved. Ruby/GnomeVFS [Masao Mutoh]: * Improved. Ruby/GtkHtml2 [Masao Mutoh]: * Improved. Ruby/GtkGLExt [Vincent Isambart]: * Improved. Ruby/Libgda: * None. Ruby/PanelApplet: * None. Ruby/GtkSourceView [Vincent Isambart, Masao Mutoh]: * Fixed bugs. Ruby/GnomePrint [NEW]: * Added. [Kouhei Sutou] Ruby/GnomePrintUI [NEW: Alpha release]: * Added. [Kouhei Sutou] Ruby/RSVG [NEW: Alpha release]: * Added. [Kouhei Sutou] == Ruby-GNOME2 0.10.1: 2004-08-16 Ruby/GdkPixbuf [Masao Mutoh]: - Fix bugs. Ruby/GTK [Masao Mutoh]: - Support GTK+-2.0.x again. Ruby/GtkSourceView [Masao Mutoh]: - Fix bugs. == Ruby-GNOME2 0.10.0: 2004-08-09 Ruby/GLib [Masao Mutoh]: * Added: [Kazuhiro NISHIYAMA, Masao, Mutoh] * GLib::Spawn, sample/utils.rb, sample/type-register2.rb * Added some methods, improved, fixed bugs: [Laurent Sansonetti, Pascal Terjan, Masao Mutoh] * GLib, GLib::Object, GLib::Log, glib2.rb, Ruby/ATK [Masao Mutoh]: * None. Ruby/Pango [Masao Mutoh]: * Fix bugs. Ruby/GdkPixbuf [Masao Mutoh]: * Removed version information. Ruby/GTK: * Support GTK+-2.4.x. * Added: [Seiya Nishizawa, Masao, Mutoh] * Gtk::ToolButton, Gtk::ToolItem, Gtk::ToggleToolButton, Gtk::SeperatorToolItem, Gtk::ComboBox, Gtk::ComboBoxEntry, Gtk::Expander, Gtk::ColorButton, Gtk::FontButton, Gtk::FileChooserWidget, Gtk::FileChooser, Gtk::FileFilter, Gtk::FileChooserDialog, Gtk::Action, Gtk::ToggleAction, Gtk::IconInfo, Gtk::IconTheme, Gtk::UIManager, Gtk::RadioAction, Gtk::CellLayout, Gtk::ActionGroup, sample/misc/entrycompletion.c, filechooser.rb, combobox.rb, expander.rb, color_font_button.rb, uimanager.rb, uimanager2.rb, uimanager2.xml * Improved, fixed bugs: [Geoff Youngs, Vincent Isambart, Kazuhiro NISHIYAMA, Masao Mutoh] * Gtk::Style, Gtk::Widget, Gtk::TextView, Gtk::Container, Gdk::EventClient, Gtk::Dialog, Gtk::Entry, Gdk::Selection, Gtk::Drag, Gdk, Gdk::Atom, Gtk::Editable, Gtk::Stock, Gtk::TextIter, Gtk::TextMark, Gtk::Style, sample/misc/dialog2.rb, entry.rb, settings.rb, * Renamed, Moved: [Masao Mutoh] * Gtk::EventCrossing::CrossingMode to Gtk::EventCrossing::Mode, Gdk::SettingAction to Gdk::EventSetting::Action Gdk::Input.set_extension_events to Gdk::Device. * Deperecated: [Masao Mutoh] * Gtk::Combo, Gtk::OptionMenu since GTK+-2.4. Ruby/GNOME: * None. Ruby/GnomeCanvas: * None. Ruby/Libglade: * Added: [Masao Mutoh] * sample/l10n*, makemo.rb, sample/po/*. * Added methods: [Masao Mutoh] * GladeXML#get_tooltips. * Improved, fixed bugs: [Masao Mutoh] * GladeXML, bin/ruby-glade-create-template Ruby/Libart: * None. Ruby/GConf: * Added some methods, Improved, fixed bugs: [Giovanni Corriga, Pascal Terjan, Kazuhiro NISHIYAMA, Masao Mutoh] * GConf::Client * Deprecated: [Masao Mutoh] * GConf::Client.new. Use GConf::Client.default instead. Ruby/GStreamer: * Requires GStreamer-0.8.x or later. * Added: [Laurent Sansonetti] * Gst::Clock, Gst::Scheduler * Added methods, improved, Fixed bugs: [Laurent Sansonetti] * Gst::Element, Gst::Bin, Gst::Caps, Gst::Structure, * Removed: [Laurent Sansonetti] * Gst::Autoplug, Gst::AutoplugFactory, Gst::Type, Gst::TypeFactory, Gst::TypeFind Gst.set_debug, Ruby/GnomeVFS: * Fixed bugs: [Pascal Terjan, Giovanni Corriga, Masao Mutoh] Ruby/GtkHtml2: * None. Ruby/GtkGLExt: * Fixed bugs: [Vincent Isambart] Ruby/Libgda: * Added methods, fixed bugs: [Laurent Sansonetti] * Gda::Command, Gda::Connection * Removed: [Laurent Sansonetti] * Gda::Export Ruby/PanelApplet [NEW]: * Added. [Jamis Buck, Masao Mutoh] Ruby/GtkSourceView [NEW]: - Added. [Laurent Sansonetti] = GNOME2 0.9.1: 2004-03-14 Ruby/GLib [Masao Mutoh]: * Fix a compilation problem on MinGW. Ruby/ATK [Masao Mutoh]: * Fix a compilation problem on MinGW. * Improved extconf.rb Ruby/Pango [Masao Mutoh]: * Improved extconf.rb Ruby/GTK [Masao Mutoh]: * Fix a compilation problem on MinGW. * Fix a bug of Gtk::Combo. * Improved extconf.rb Ruby/GConf [Kazuhiro NISHIYAMA]: * Fix bugs. Ruby/Libgda [Laurent Sansonetti]: * Support libgda-1.0.3(stable branch). = Ruby-GNOME2 0.9.0: 2004-03-07 Ruby/GLib: * Improved, fixed bugs: [Kenichi Komiya, Vincent Isambart, Masao Mutoh] * GLib::Object, GLib::Param::Flags, mkmf-gnome2.rb, sample/type-register.rb * Added new macros: [Masao Mutoh] * G_DEF_CLASS3() Ruby/ATK [NEW]: * Added and compeleted: [Masao Mutoh] * Atk::Action, Atk::Document, Atk::GObjectAccessible, Atk::NoOpObject, Atk::NoOpObjectFactory, Atk::Value, Atk::Component, Atk::Image, Atk::HyperText, Atk::HyperLink, Atk::EditableText, Atk::Implementor, Atk::Object, Atk::Relation, Atk::Registry, Atk::ObjectFactory, Atk::State, Atk::StateSet, Atk::EditableText, Atk::Table * Added: [Masao Mutoh] * Atk::Util, Atk::Component, Atk::Selection, Atk::Text Ruby/GdkPixbuf: * None. Ruby/Pango: * None. Ruby/GTK: * Completed: [Masao Mutoh] * Added and completed: [Masao Mutoh] * Added: [Kenichi Komiya, Masao, Mutoh] * Gtk::TextAppearance, sample/misc/bindings.rb, properties.rb, style_property.rb, settings.rb * Added some methods, improved, fixed bugs: [Kenichi Komiya, Masahiro Sakai, Vincent Isambart, Dafydd Harries, Masao Mutoh] * Gdk::Window, Gtk::SizeGroup, Gtk::Object, Gtk::BindingSet, Gtk::TextTagTable, Gtk::TextTag, Gdk::Colormap, Gtk::TreeViewColumn, Gtk::TextIter, Gtk::SpinButton, Gtk::Allocation, Gtk::TextView, Gtk::TextBuffer, Gtk::Widget, Gtk::Container, Gtk::Setting, Gtk::TreePath, Gtk::TreeIter, Gdk::Display, Gtk::TextAttributes, Gdk::Property, Gdk::Keymap, Gdk::Pixmap, Gdk::Drawable, Gdk::Screen, Gdk::Event, Gdk::EventExpose, Gdk::Selection, Gdk::GC, sample/gtk-demo/main.rb, stock_browser.rb, list_store.rb, tree_store.rb, sample/testgtk/notebook.rb, sample/misc/label.rb, toolbar.rb, extconf.rb * Removed: [Masao Mutoh] * Gtk::Object#activate_binding * Use Gtk::Object#bindings_activate insted. * Gtk::TextAttribute#copy * Use GLib::Boxed#copy instead. * Gdk::EventKey#string, #length. * makedefconst.rb * Deperecated: [Masao Mutoh] * Gtk::TextBuffer#insert_with_tags, #insert_pixbuf, #insert_child_anchor. They will be removed until 1.0.0. Use Gtk::TextBuffer#insert instead. Ruby/GNOME: * Fixed bugs: [Masao Mutoh] * Gnome::Program Ruby/GnomeCanvas: * Added: [Masao Mutoh] * Gnome::CanvasShape, Gnome::CanvasRE, Gnome::CanvasClipgroup * Fixed bugs: [Vincent Isambart, Masao Mutoh] * extconf.rb, sample/canvas-curve.rb Ruby/Libglade: * Added: [Masao Mutoh] * sample/custom.[rb|glade] * Added methods: [Archit Baweja, Masao Mutoh] * GladeXML#widget_names, #filename, #[], #require, #provide * Improved, fixed bugs: [Masao Mutoh] * bin/ruby-glade-create-template Ruby/Libart: * Improved: [Masao Mutoh] * extconf.rb Ruby/GConf: * None. Ruby/GStreamer: * Added some methods, improved, fixed bugs: [Laurent Sansonetti] * Gst, Gst::Bin, Gst::Pad, Gst::PadTemplate, Gst::Type, Gst::Element sample/gst-inspect.rb, media-type2.rb Ruby/GnomeVFS: * Added some methods, improved, fixed bugs: [Masahiro Sakai, Masao Mutoh] * GnomeVFS::FileInfo, Gnome::VFS::File, GnomeVFS::ProtocolError, GnomeVFS::NoMasterBrowserError Ruby/GtkHtml2: * Added some methods, fixed bugs: [Vincent Isambart, Masao Mutoh] * Gtk::HtmlView, Gtk::HtmlStream, extconf.rb Ruby/GtkGLExt: * Added some methods, improved, fixed bugs: [Vincent Isambart, Masao Mutoh] * Gdk::GLDrawable, sample/*.rb Ruby/Libgda: * Added: [Laurent Sansonetti] GeometricPoint, Gda::Money, Gdak::Time * Added some methods, improved, fixed bugs: [Nikolai Weibull, Laurent Sansonetti] * Gda::Error, Gda::ParameterList, Gda::Provider, Gda::DataSource, Gda::Connection, Gda::Parameter, Gda::Command, Gda::Row, Gda::Value, Gda::DataModel, Gda::ModelList, Gda::FieldAttributes tests/*.rb, src/lib/libgda.rb == Ruby-GNOME2 0.8.1: 2003-11-23 Ruby/GTK: * Fixed compilation problems for GTK+-2.0.x. [Masao Mutoh] * Fixed some bugs. [Masahiro Sakai, Masao Mutoh] * Added Gtk::Tree* methods for GTK+-2.2.x. [Matthew Berg] Ruby/GtkHtml2: * Fixed compilation problems for libgtkhtml-2.4.1 [Masahiro Sakai] Ruby/Libgda: * Fixed a bug [Laurent Sansonetti] *Notice* Ruby/Libgda needs libgda-1.0.2(not released yet) or later. == Ruby-GNOME2 0.8.0: 2003-11-16 Ruby/GLib: * Provide methods for creating GObject from ruby side. Now you can create your own signals and properties: [Masahiro, Sakai] * GLib::MetaInterface, GLib::Instantiatable, GLib::Signal * Added some methods, improved and Fixed some bugs: [Masahiro Sakai, Masao Mutoh] * GLib::Closure, GLib, GLib::Instantiatable, GLib::Object, mkmf-gnome2.rb * Added new macros: [Masao Mutoh] * G_RENAME_NICK() * Added: [Masahiro, Sakai] * sample/type-register.rb, tests/*.rb Ruby/GdkPixbuf: * Added some methods, improved and Fixed some bugs: [KATO Kazuyoshi, Masao Mutoh] * Gdk::Pixbuf Ruby/Pango: * rbpango.h is installed with glib/gtk2 headers. * Added new methods: [Masao Mutoh] * Pango::Layout * Added: [Masao Mutoh] * PangoLogAttr, PangoAnalysis Ruby/GTK: * Completed: [Masao Mutoh] * Gdk::Geometry, Gdk::Event*, Gdk::Pixbuf, Gdk::Drawable, Gdk::DragContext, Gdk::Selection, Gdk::RGB, Gdk::GC, Gdk::Atom, Gdk::Image, Gdk::Colormap, Gdk::Keyval, Gdk::Screen, Gdk::Visual, Gdk::Window, Gdk::Display, Gdk * Added and completed: [Masao Mutoh] * Gdk::Property, Gdk::Keymap, Gdk::TimeCoord, * Added some methods, improved, fixed bugs: [Matthew Berg, Martin Povolny, KATO Kazuyoshi, Laurent Sansonetti, Masahiro Sakai, Masao Mutoh] * Gtk::AccelGroup, Gtk::Accelmap, Gtk::Clipboard, Gtk::Notebook, Gtk::Drag, Gtk::Menu, Gtk::Stock, Gtk::Style, Gtk::ListStore, Gtk::TreeStore, Gtk::Widget, Gtk::TextBuffer, Gtk::TreePath, Gtk::TreeRowReference * Added: [KATO Kazuyoshi] * sample/gtk-demo/changedisplay.rb, sample/gtk-demo/pixbufs.rb. * Removed: [Masao Mutoh] * Gtk::Clipboard#owner * Gdk::Span * Gdk::Region#eql?, #&, #-, #| Ruby/GNOME: * Added some methods, improved, fixed bugs: [Masao Mutoh] * Gnome::AppHelper, Gnome::DruidPageStandard * Apply Enum/Flags. [Masao Mutoh] Ruby/GnomeCanvas: * None. Ruby/Libglade: * None. Ruby/Libart: * None. Ruby/GConf: * None. Ruby/GStreamer: * Update maintainer's e-mail address [Laurent Sansonetti] Ruby/GnomeVFS: * None. Ruby/GtkHtml2: * Added and completed: [Masao Mutoh] * Gtk::HtmlContext, Gtk::HtmlBoxTable, Gtk::HtmlBoxTableRowGroup, * Completed: [Masao Mutoh] * Gtk::HtmlView * Added: [Masao Mutoh] * Gtk::HtmlBox, Gtk::HtmlBoxBlock, Gtk::HtmlBoxTableCaption, Gtk::HtmlBoxText, Gtk::BoxRoot, Gtk::BoxForm, Gtk::HtmlParser, Gtk::HtmlEmbedded, Gtk::HtmlBoxEmbedded Ruby/GtkGLExt: * None. Ruby/Libgda [NEW]: * Added and compeleted: [Laurent Sansonetti] * Gda, Gda::Client, Gda::Command, Gda::Provider, Gda::DataSource, Gda::Connection, Gda::DataModelArray, Gda::DataModelHash, Gda::DataModelList, Gda::Error, Gda::Export, Gda::FieldAttributes, Gda::Parameter, Gda::ParameterList, Gda::QuarkList, Gda::Row, Gda::Select, Gda::Table, Gda::Transaction * Added * Gda::DataModel sample/*.rb, tests/*.rb == Ruby-GNOME2 0.7.0: 2003-09-07 The whole Ruby-GNOME2: * Enum/Flags support. Enum/Flags constants are defined as classes. [Masahiro Sakai, Vincent Isambart, Masao Mutoh] * Improve extconf.rb. [Masao Mutoh] If the libraries are not found, they're ignored. And you can specify to target libraries. Ruby/GLib: * Improved and Fixed some bugs. [Masahiro Sakai, Masao Mutoh] * GLib::Type, GLib::Boxed, mkmf_gnome2.rb * Added lib/glib2.rb and improve to support Win32 platform. [TAMURA.KENICHI, Masahiro Sakai] * Added new class: [Masahiro Sakai] * GLib::Enum, GLib::Flags * Added new macros: [Masahiro Sakai] * RVAL2GENUM(), RVAL2GFLAGS(), GENUM2RVAL(), GFLAGS2RVAL(). * Removed some methods. [Masahiro Sakai] * GLib::Param#value_defaults? * Define GLib::BINDING_VERSION * Apply Enum/Flags. [Masahiro Sakai] * Follow extconf.rb changes. [Masao Mutoh] Ruby/GdkPixbuf: * Apply Enum/Flags. [Masahiro Sakai, Masao Mutoh] * Follow extconf.rb changes. [Masao Mutoh] Ruby/Pango: * Improved and Fixed some bugs: [Vincent Isambart, Masahiro Sakai, Masao Mutoh] * Pango::Font, sample/*.rb, extconf.rb * Added new methods: [Masahiro Sakai] * Pango::Language, Pango::FontMap, Pango::FontFamily, Pango::Context, Pango::FontDescription, * Apply Enum/Flags. [Masahiro Sakai, Masao Mutoh] * Follow extconf.rb changes. [Masao Mutoh] Ruby/GTK: * Follow Ruby/GLib changes. [Masahiro Sakai, Masao Mutoh] * Added some methods, improved, fixed bugs: [Martin Povoln, KATO Kazuyoshi, Masahiro Sakai, Masao Mutoh] * Gdk::Atom, Gdk::Input, Gdk::DragContext, Gdk::Event, Gdk::GC, Gdk, Gtk::Label, Gtk::TreeIter, Gtk::TreeView, Gtk::IconSize, gdk-demo/*.rb, extconf.rb * Added: [KATO Kazuyoshi] * Gdk::DisplayManager, gtk-demo.rb * Apply Enum/Flags. [Masahiro Sakai, Masao Mutoh] * Follow extconf.rb changes. [Masao Mutoh] Ruby/GNOME: * Follow extconf.rb changes. [Masao Mutoh] * Fix bugs. [Masahiro Sakai] Ruby/GnomeCanvas: * Follow extconf.rb changes. [Masao Mutoh] * Improve extconf.rb. [Masahiro Sakai] * Fix a sample. [Vincent Isambart] Ruby/Libglade: * Add a 'after' parameter to GladeXML.connect. It allows to connect signal_connect_after(). [Soila Jani] * Fix bugs: [Masao Mutoh] Ruby/Libart: * Follow extconf.rb changes. [Masao Mutoh] Ruby/GConf: * Apply Enum/Flags. [Masao Mutoh] * Follow extconf.rb changes. [Masao Mutoh] Ruby/GStreamer: * Improved and Fixed some bugs. [Laurent Sansonetti] * Gst, Gst::MediaInfo, Gst::Second, Gst::MediaType, sample/media-type.rb * Added some methods: [Laurent Sansonetti] * Gst::Bin, Gst::Registry, Gst::MediaInfoTrack * Added: [Laurent Sansonetti] * Gst::XML, Gst::ClockEntry, sample/xml-ogg-player.rb * Win32 support. [Masahiro Sakai] * Follow extconf.rb changes. [Masao Mutoh] Ruby/GnomeVFS: * Follow extconf.rb changes. [Masao Mutoh] Ruby/GtkHtml2: * Added: [Martin Povoln, Masao Mutoh] * Gtk::HtmlStream, lib/gtkhtml2.rb * Removed methods: [Martin Povoln] * Gtk::HtmlView#set_html * Follow extconf.rb changes. [Masao Mutoh] Ruby/GtkGLExt [NEW]: * Added and completed. [Vincent Isambart] * Gdk::GLConfig, Gdk::GLContext, Gdk::GLDrawable, Gdk::GLPixmap, Gdk::GLWindow, Gdk::Window, Gdk::Pixmap, Gtk::GL, Gtk::Widget * Added. [Vincent Isambart] * Gdk::GL, sample/*.rb * Follow extconf.rb changes. [Masao Mutoh] * Win32 support. [Masahiro Sakai] == Ruby-GNOME2 0.6.0: 2003-08-09 Ruby/GLib: * mkmf-gnome2.rb,rbglib.h, rbgobject.h, rbgutil.h are installed to site-ruby directories. The other libraries which depends on Ruby/GLib can compile in any directotires. [Masahiro Sakai, Masao Mutoh] * Support ruby-1.8.0 [Masao Mutoh] * Added new macros: [Geoff Youngs, Masao Mutoh] * CBOOL2RVAL/RVAL2CBOOL, G_DEF_CONSTANTS, G_RENAME_CONSTANT * Improved and Fixed some bugs. [Masahiro Sakai] * GLib::Object, GLib::Type, GLib::Closure, GLib::Signal, * Added some methods: [Masahiro Sakai] * GLib::Param, GLib::Param::*, GLib::Boxed, GLib::Signal, GLib::Pointer * Removed some methods. [Masahiro Sakai] * GLib::Param::*#default, #default_value Ruby/GdkPixbuf: * Follow Ruby/GLib changes. [Masao Mutoh] * Separate Gdk::Pixbuf#scale to #scale and #scale!, #composite to #composite and #composite!. [Masao Mutoh] Ruby/Pango: * Follow Ruby/GLib changes. [Masao Mutoh] Ruby/GTK: * Follow Ruby/GLib changes. [Sakai, Masahiro, Masao Mutoh] * rbgtk.h are installed to site-ruby directories. The other libraries which depends on Ruby/GTK can compile in any directotires. [Masao Mutoh] * Completed: [Geoff Youngs, Masao Mutoh] * Gtk::Clipboard, Gtk::Menu, Gtk::Notebook, Gtk::Socket, Gtk::Plug, Gtk::FileSelection, Gtk::ListStore, Gtk::TreeStore, Gtk::TreeModel, Gtk::TextView, Gtk::Notebook, Gtk::ColorSelection, Gtk::Style, Gtk::ItemFactory, Gtk::Invisible, Gtk::TreeSortable, Gtk::TreeView, Gtk::TreeSelection, Gtk::TreePath, Gtk::TreeViewColumn, Gtk::Drag, Gtk::TextTag, Gtk module * Added and completed. * Gtk::TreeDragSource, Gtk::TreeDragDest, * Added some methods, improved, fixed bugs: [Geoff Youngs, Masahiro Sakai, Masao Mutoh] * Gdk::Window, Gdk::Drawable, Gdk::EventProperty, Gdk module, Gtk::Object, Gtk::Editable, Gtk::TreeModel, Gtk module, Gtk::TextBuffer, Gtk::IMContext, Gtk::Menu * Added: [Geoff Youngs, Masao Mutoh] * Gtk::BingindSet, Gdk::Display, Gdk::Screen * Removed: [Masao Mutoh] * Gtk::Socket#xwindow, Gtk::Menu#set_path, Gtk::Notebook#popup_disable/enable, Gtk::ItemFactory.add_foreign Gtk::TreeSortable#sort_func=, Gtk::TreePath#to_s Ruby/GNOME: * Follow Ruby/GLib changes. [Masao Mutoh] * Add Gnome::PixmapEntry#set_preview. [Masao Mutoh] Ruby/GnomeCanvas: * Follow Ruby/GLib changes. [Masao Mutoh] Ruby/Libglade: * Follow Ruby/GLib changes. [Masao Mutoh] Ruby/Libart: * Follow Ruby/GLib changes. [Masao Mutoh] Ruby/GConf: * Fix a bug [744158] [Masao Mutoh] Ruby/GStreamer [NEW]: * Merged with Ruby-GStreamer project. [Laurent Sansonetti] * Version informations are also merged. * Completed: [Laurent Sansonetti] * Gst, Gst::Autoplug, Gst::Cpu, Gst::Format, Gst::Object, Gst::PadTemplate, Gst::Pipeline, Gst::PluginFeature, Gst::QueryType, Gst::Type * Added and completed. [Laurent Sansonetti] * Gst::AutoplugFactory, Gst::EventMask, Gsk::EventSeek, Gst::EventSegmentSeek, Gst::EventSize, Gst::Parse, Gst::SystemClock, Gst::Thread,Gst::MediaInfo, Gst::MediaInfoStream, Gst::MediaInfoTrack * Added some methods, improved, fixed bugs: [Laurent Sansonetti] * Gst::Caps, Gst::Clock, Gst::Plugin, Gst::Pad, Gst::Element, * Added: [Nikolai :: lone-star :: Weibull, Laurent Sansonetti] * sample/media-type.rb, gst-inspect.rb, mediap-type2.rb Ruby/GnomeVFS [NEW]: * Initial release. [Nikolai :: lone-star :: Weibull] * Completed: [Nikolai :: lone-star :: Weibull] * GnomeVFS module, GnomeVFS::Directory, GnomeVFS::Monitor, GnomeVFS::FileInfo, GnomeVFS::Error * Added: [Nikolai :: lone-star :: Weibull] * GnomeVFS::File, GnomeVFS::URI Ruby/GtkHtml2 [NEW]: * Initial release. [Martin Povoln] * Added: [Martin Povoln] * Gtk::HtmlDocument, Gtk::HtmlView == Ruby-GNOME2 0.5.0: 2003-05-24 Ruby/GLib: * Fixed warning for ruby-1.8.1. [Masao Mutoh] * Fixed some bugs, Added methods and improved: [Masahiro Sakai] * GLib::Object, GLib::ParamSpec, GLib::Signal, GLib::Type, GLib::Instantiatable, GLib::MetaInterface, GLib::Param::String * Added: [Geoff Youngs, Masao Mutoh] Ruby/GdkPixbuf: * Fixed a bug. [Geoff Youngs] Ruby/Pango: * Some constants were moved. [Masao Mutoh] * Moved Pango::Attribute::UNDERLINE_* to Pango::AttrUnderline::*. * Moved Pango::Attribute::SCALE_* to Pango::AttrScale::*. Ruby/GTK: * Completed: [Masao Mutoh] Gtk::AccelGroup, Gtk::Style, Gtk::Selection * Added some methods, improved: [Stephen Lewis, Masahiro Sakai, Masao Mutoh] * Gtk::TextBuffer, Gtk::TextIter, Gtk::TreeIter, Gtk::ListStore, Gtk::TreeStore, Gtk, Gtk::HandleBox, Gtk::Frame, Gtk::Container, Gtk::Table, Gdk::Input, Gtk::Widget, Gtk::Allocation, Gtk::RC, Gtk::ItemFactory, Gtk::Toolbar, Gtk::Window, Gtk::CellEditable, Gtk::Accessible, sample/misc/*.rb * Added and completed. [Nikolai :: lone-star :: Weibull, Masao Mutoh] * Gtk::RcStyle, Gtk::TargetList, Gtk::TreeSortable, Gtk::TreeModelSort, Gtk::IMContext, Gtk::IMContextSimple, Gtk::IMMulticontext * Added: [Masao Mutoh] * Gtk::Settings * Renamed some methods. [Masao Mutoh] * Gtk::Table, Gtk::Widget * Removed: [Masao Mutoh] * Gtk::Object#user_data, #user_data=, #set_user_data. Deprecated properties of Gtk::ProgressBar. Gtk::Requisition. Use [width, height] instead. Gtk::Widget#set_requisition, *_event, Gtk::Widget::NO_PARENT. Gtk::SelectionData.remove_all. Use Gtk::Selection.remove_all instead. Ruby/GNOME: * Cygwin support [Masahiro Sakai] * sample/test-gnome/color-picker.rb: Follow Ruby/GTK changes.[Masao Mutoh] Ruby/GnomeCanvas: * sample/canvas-primitives.rb: Follow Ruby/GTK changes.[Masao Mutoh] Ruby/Libglade: * Fix a bug of bin/ruby-glade-create-template. [Masao Mutoh] Ruby/Libart: * None Ruby/GConf: - Added GConf::MetaInfo. [Nikolai :: lone-star :: Weibull] - Fixed a bug [Masao Mutoh] == Ruby-GNOME2 0.4.0: 2003-03-23 The whole Ruby-GNOME2: * Add mkmf-gnome2.rb for sub/optional libraries. [Masahiro Sakai] Ruby/GLib: * Win32 platform support(Cygwin, Mingw32) [Masahiro Sakai] * Support mkmf-gnome2.rb [Masahiro Sakai] * Added some methods. [KUBO Takehiro, Masahiro Sakai] * Fix some bugs and improvement. [Masahiro Sakai, Masao Mutoh] Ruby/GdkPixbuf: * Win32 platform support(Cygwin, Mingw32) [Masahiro Sakai] * Support mkmf-gnome2.rb [Masahiro Sakai] * Fix some bugs and improvement. [Masahiro Sakai] Ruby/Pango: * Win32 platform support(Cygwin, Mingw32) [Masahiro Sakai] * Support mkmf-gnome2.rb [Masahiro Sakai] * Added a method(Pango.pixels) [Masao Mutoh] * Fix some bugs and improvement. [Masahiro Sakai] Ruby/GTK: * Win32 platform support(Cygwin, Mingw32) [Masahiro Sakai] * Support mkmf-gnome2.rb [Masahiro Sakai] * Multi-threading support. [Masao Mutoh] * Added some methods, improved: [Kazuo Saito, Geoff Youngs, KATO Kazuyoshi, Masahiro Sakai, Masao Mutoh] * Gtk::Toolbar, Gtk::ItemFactory, Gdk::Region, Gtk::AccelGroup, Gtk::AccelMap, Gtk::TextIter, Gtk::TextTagTable, Gtk::TreeModel, Gtk::TreeSelection, Gtk::Clipboard, Gtk::Box, Gdk::RGB, Gtk::AccelGroupEntry, Gdk::Window, Gtk::SeparatorMenuItem, Gtk::TreePath, Gtk::TreeView, Gtk::Combo, Gdk::Threads, Gtk::TreeIter, Gdk::Event, Gtk::Drag, * Added: [Kazuo Saito, KATO Kazuyoshi, Masao Mutoh] * sample/gtk-demo/*.rb, sample/misc/threads.rb * Removed: [Masao Mutoh] * Gtk::Toolbar#insert_item/widget/element, Gtk::Toolbar#prepend_item/widget/element, Gtk::Toolbar#append_item/widget/element. * Use Gtk::Toolbar#insert, prepend, append instead. Gtk::Combo#list, button, popup, popwin, set_item_string, Ruby/GNOME: * Support mkmf-gnome2.rb [Masahiro Sakai] Ruby/GnomeCanvas: * Support mkmf-gnome2.rb [Masahiro Sakai] Ruby/Libglade: * Support mkmf-gnome2.rb [Masahiro Sakai] * Improved: [Masao Mutoh] * bin/ruby-glade-create-template Ruby/Libart: * Support mkmf-gnome2.rb [Masahiro Sakai] * Fix some bugs and improvement. [Masahiro Sakai] Ruby/GConf: * Support mkmf-gnome2.rb [Masahiro Sakai] Misc: * Project website is moving from http://ruby-gnome2.sourceforge.net/ to http://ruby-gnome2.sourceforge.jp/. == Ruby-GNOME2 0.3.0: 2003-02-09 Ruby/GLib: * Miscellaneous bugfixes and some improvement internal. [Masahiro Sakai, Masao Mutoh] Ruby/GTK: * Miscellaneous bugfixes and some improvement internal. [Masao Mutoh] * Support GTK+-2.2.x. [KUBO Takehiro] * DnD enhancement. [Geoff Youngs, Masao Mutoh] * Require Ruby/Pango. [Masao Mutoh] * Completed: * Gdk::Drawable, Gdk::Rectangle, Gdk::Region, Gtk::AccelGroup, Gtk::Accelerator, Gtk::AccelGroupEntry, Gtk::AccelKey * Added and completed: * Gdk::Pango::Embossed, Gdk::Pango::Stipple, Gdk::Span * Added some methods, improved: * Gtk::Widget, Gtk::Calender, Gdk::GC, Gtk::Drag, Gtk::SelectionData, Gtk::RadioMenuItem,Gdk::Pixmap * Added: * sample/misc/dnd.rb, dndtreeview.rb, dnd.rb * Removed: * Gtk::AccelGroup#connect_by_path(use Gtk::AccelGroup#connect instead). Ruby/GdkPixbuf: * Added GdkPixbufLoader. [Geoff Youngs] Ruby/GNOME: * None. Ruby/GnomeCanvas: * Warning fixes for samples. [Masao Mutoh] Ruby/Libglade: * Added a sample(sample/treview.[glade|rb]). [Masao Mutoh] Ruby/Libart: * Added Art::Affine, Art::Bpath, Art::Canvas, Art::SVP, Art::Vpath [Tom Payne] * Added samples(sample/rose.rb, testlibart2.rb). [Tom Payne] Ruby/GConf: * None. Ruby/Pango(NEW): * Initial release. [Geoff Youngs, Masao Mutoh] * Added and completed: * Pango::Rectangle, Pango::FontDescription, Pango::FontMetrics, Pango::FontFace, Pango::Fontset, Pango::FontsetSimple, Pango::Attribute, Pango::AttrString, Pango::AttrLanguage, Pango::AttrColor, Pango::AttrInt, Pango::AttrFloat, Pango::AttrBool Pango::AttrFontDesc, Pango::AttrShape, Pango::AttrFamily, Pango::AttrStyle, Pango::AttrVariant, Pango::AttrStretch, Pango::AttrWeight, Pango::AttrSize, Pango::AttrForeground, Pango::AttrBackground, Pango::AttrStrikethrough, Pango::AttrUnderline, Pango::AttrScale, Pango::AttrRise, Pango::Color, Pango::Language, Pango::AttrList, Pango::AttrIterator, Pango::TabArray * Added: * Pango::Context, Pango::Item, Pango::ClyphString, Pango::Font, Pango::FontFamily, Pango::FontMap, Pango::Layout, Pango::LayoutIter, Pango::LayoutLine, sample/attribute.rb, gdk_layout.rb, label.rb, parse.rb. Misc * Project website http://ruby-gnome2.sourceforge.net/ * Ruby/GTK Tutorial http://ruby-gnome2.sourceforge.net/tut/toc.htm * Ruby-GNOME2 reference manual(This project has just started). http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=Ruby-GNOME2 == Ruby-GNOME2 0.2: 2002-12-28 Ruby/GLib: * Some bugfixes and some improvement internal. Ruby/GTK: * Some bugfixes and some improvement internal. * Require Ruby/GdkPixbuf. * Completed: * Gtk::TextIter, Gtk::Label, Gtk::Tooltips, Gtk::Viewport. * Added and completed: * Gtk::TextAttributes, Gtk::IconFactroy, Gtk::IconSet, Gtk::IconSource, Gtk::IconSize, Gtk::Accelerator, Gtk::AccelKey, Gtk::AccelGroupEntry, Gtk::SizeGroup, * Added some methods, improved: * Gtk module, Gtk::TextBuffer, Gtk::*MenuItem, Gtk::*Button, Gtk::ItemFactory, Gtk::Widget, Gtk::TreeViewColumn, Gtk::Notebook, Gtk::Image, Gtk::AccelLabel, Gtk::Invisible, Gtk::Dialog, Gtk::TreePath, Gdk::Keyval sample/misc/*button.rb, stock.rb sample/testgtk/savedposition.rb * Added: * Gtk::Clipboard, Gtk::AccelGroup, Gtk::AccelMap sample/misc/button2.rb, label.rb, dialog.rb, dialog2.rb, treeview.rb * Removed: * Gdk::Bitmap(use Gdk::Pixmap(depth = 1) instead) Ruby/GdkPixbuf: * Follow Ruby/GLib changes. * Add Gdk::Pixdata. Ruby/GNOME: * Follow Ruby/GLib changes. * Fix problems which Ruby/GNOME can't work with Ruby/GdkPixbuf. * Code cleanup. * Remove Bonobo codes(Move to Ruby/Bonobo). Ruby/GnomeCanvas: * Follow Ruby/GLib changes. * Follow Ruby 1.8.0pre1, 1.6.8. Ruby/Libglade: * Follow Ruby/GLib changes. * Add bin/ruby-glade-create-template(Create .rb from .glade) * Add sample/treeview* * Improve the behavior to work when handlers aren't undefined not to occur signal_proc.arity error. Ruby/Libart: * Follow Ruby/GLib changes. Ruby/GConf: * Follow Ruby/GLib changes. Misc: * Project website: http://ruby-gnome2.sourceforge.net/ * Ruby/GTK Tutorial: http://ruby-gnome2.sourceforge.net/tut/toc.htm * Ruby-GNOME2 reference manual(This project has just started). http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=Ruby-GNOME2 == Ruby-GNOME2 0.1: 2002-11-23 Initial release. * Ruby/GLib * Ruby/GTK * Ruby/GdkPixbuf * Ruby/GNOME * Ruby/GnomeCanvas * Ruby/Libglade * Ruby/Libart * Ruby/GConf ruby-gnome-ruby-gnome-25972cb/README.md000066400000000000000000000105011511343406000174700ustar00rootroot00000000000000# Ruby-GNOME [![Gem Version](https://badge.fury.io/rb/gtk4.svg)](https://badge.fury.io/rb/gtk4) ![Ruby-GNOME Logo](https://avatars1.githubusercontent.com/u/416159?v=3&s=200) Ruby bindings for GNOME This is a set of bindings for the GNOME 3.x and 4.x libraries to use from Ruby that allows you to write graphical user interfaces in Ruby. ## Installation Instructions for gtk3 and gtk4 ### Debian/Ubuntu Ruby can be run from the system directories, or from your home directory, or both. Most people won't have the correct permissions for a system install, so the vast majority of people to run Ruby from their local, `/home/...` directory. To test if your copy of Ruby is running locally enter this on the command line: ```bash which ruby ``` If it outputs something like this: ```bash /home/ralph/.rbenv/shims/ruby ``` that starts with `/home/`, that's local (good!) But if outputs something like this: ```bash /usr/bin/ruby ``` That is a system directory, and the gtk4 gem will fail to install. Actually, a system administrator with super-user permissions could install everything in the system folders (see advanced install), but its much better for everyone else to run Ruby locally. If you're already running a copy of Ruby under your home directory, you can install gtk4 (or gtk3): ```bash gem install gtk4 ``` But if you're running ruby from the system folders, you can install a Ruby version manager like [RVM](https://rvm.io/) or [rbenv](https://github.com/rbenv/rbenv). These programs allow you to run multiple versions of Ruby from your home directory. rbenv has a [rbenv-installer](https://github.com/rbenv/rbenv-installer) that installs everything and adds a line to your `.bashrc` file so you're running local copies of Ruby. To get rbenv: 1. Run the installer 2. Restart your command prompt 3. Run `rbenv install --list` (find recent Ruby version) 4. Run `rbenv install 3.3.5` (example version. choose one from list) 5. Run `which ruby` (check that its running from home directory) If that works, then you're ready to install gtk4 (or gtk3): ```bash gem install gtk4 ``` ### macOS Input needed... ### Windows In Windows, the gem should be installed without issue. If you install Ruby using the [Ruby Installer](https://rubyinstaller.org/), make sure that MSYS2 gets installed too. GTK needs MSYS2 to make the binary files. Then, at the Ruby command prompt: ```bash gem install gtk4 ``` ## Advanced Installation instructions ### Debian/Ubuntu ```bash sudo apt install -y gcc make ruby-dev sudo gem install rubygems-requirements-system sudo gem install gtk4 ``` ## Install from GitHub master branch You can also install these gems from GitHub master branch. Create `Gemfile` like the following: ```ruby source "https://rubygems.org/" plugin "rubygems-requirements-system" git "https://github.com/ruby-gnome/ruby-gnome.git" do gem "gtk4" end ``` Install these gems by Bundler: ```bash bundle install ``` ## Build From Source Code ```bash ruby extconf.rb make ``` To compile and install a particular sub-binding, you can add arguments: ```bash ruby extconf.rb [subdir]... # e.g.) ruby extconf.rb glib2 pango atk gdk_pixbuf2 gtk4 ``` Or you can compile each sub-binding: ```bash cd ruby extconf.rb make ``` ### extconf.rb options * `--ruby` * ruby directory * `--topsrcdir` * top source directory * `--topdir` * top directory * `--strict` * if some libraries fail to compile/install, `make` command returns 1(exit 1) ## Bugs Please report bugs in our bug tracker: * [https://github.com/ruby-gnome/ruby-gnome/issues](https://github.com/ruby-gnome/ruby-gnome/issues) ## Copying Copyright (c) 2002-2025 Ruby-GNOME 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. ### Exceptions Some GTK+ 3 examples are licensed under GNU Free Documentation License 1.3 or any later version later; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. Because they are based on scripts in [PyGObject-Tutorial](https://github.com/sebp/PyGObject-Tutorial). [PyGObject-Tutorial is licensed under GFDL 1.3](https://github.com/sebp/PyGObject-Tutorial/blob/master/COPYING). See [gtk3/sample/](/gtk3/sample) directory for details. ## Project Website [https://ruby-gnome.github.io/](https://ruby-gnome.github.io/) ruby-gnome-ruby-gnome-25972cb/Rakefile000066400000000000000000000134021511343406000176610ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2008-2025 Ruby-GNOME 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 require "erb" require "find" require "open-uri" require "pathname" require "tmpdir" require_relative "helper" task :default => :test def version @version ||= ENV["VERSION"] || guess_version end def guess_version versions = {} File.open(File.join(__dir__, "glib2", "ext", "glib2", "rbglib.h")) do |rbglib_h| rbglib_h.each_line do |line| if /#define\s+RBGLIB_([A-Z]+)_VERSION\s+(\d+)/ =~ line versions[$1.downcase] = $2.to_i end end end ["major", "minor", "micro"].collect {|type| versions[type]}.compact.join(".") end def gem_exist?(name, version) gem_uri = "https://rubygems.org/gems/#{name}/versions/#{version}" begin URI.open(gem_uri) true rescue OpenURI::HTTPError false end end def gem_push(path, name, version) return if gem_exist?(name, version) begin ruby("-S", "gem", "push", path) rescue puts("failed to push gem: #{path}") puts("#{$!.class}: #{$!}") end end packages = (ENV["PACKAGES"] || "").split(",") packages = Helper.all_packages if packages.empty? desc "configure all packages" task :configure do ruby("extconf.rb") end file "Makefile" do task(:configure).invoke end desc "build all packages" task :build => ["Makefile"] do sh("make") end desc "clean all packages, docs" task :clean do sh("make", "clean") if File.exist?("Makefile") rm_rf("yard_docs") end desc "more clean all packages" task :distclean do sh("make", "distclean") if File.exist?("Makefile") end desc "run tests for all packages" task :test => [:build] do ruby("run-test.rb") end namespace :gem do desc "build all gems" task :build do packages.each do |package| cd(package) do ruby("-S", "rake", "gem") end end end desc "document all gems" task docs: [:girdocs, :rubydocs] task :girdocs do packages_rb = packages.map { |pkg| File.join(pkg, "lib", pkg + ".rb") } ygir_gem = Gem::Specification.find_by_name('yard-gobject-introspection') ygir_lib = File.expand_path('lib/yard-gobject-introspection.rb', ygir_gem.full_gem_path) args = [ygir_lib, * packages_rb] all_args = %w(bundle exec yard doc -o ./yard_docs/gir/ --load).concat(args) sh(*all_args) end task :rubydocs do file_globs = packages.flat_map { |pkg| [ File.join(pkg, "lib", pkg + ".rb"), File.join(pkg, "lib", pkg, "**/*.rb"), File.join(pkg, "ext", pkg, "**/*.h") ]} all_args = %w(bundle exec yard doc -o ./yard_docs/ruby/).concat(file_globs) sh(*all_args) end desc "push all gems" task :push do packages.each do |package| Dir.glob(File.join(package, "pkg", "*-#{version}.gem")) do |gem_path| gem_base_path = File.basename(gem_path, ".gem") gem_name = gem_base_path.gsub(/-#{Regexp.escape(version)}\z/, "") gem_push(gem_path, gem_name, version) end end end desc "install all gems" task :install do Helper.sort_packages(packages).each do |package| puts("::group::Install #{package}") gem_path = File.join(package, "pkg", "#{package}-#{version}.gem") gem_path = File.expand_path(gem_path) mkdir_p(File.dirname(gem_path)) cd(File.join(__dir__, package)) do ruby("-S", "gem", "build", "#{package}.gemspec", "--output", gem_path) end install_command_line = ["-S", "gem", "install"] if (ENV["RUBY_GNOME_INSTALL_USER_INSTALL"] || "yes") == "yes" install_command_line << "--user-install" end install_command_line << gem_path ruby(*install_command_line) puts("::endgroup::") end end desc "uninstall all gems" task :uninstall do sort_packages(packages).reverse_each do |package| ruby("-S", "gem", "uninstall", "--version", version, package) end end end desc "tag the current release" task :tag do sh("git", "tag", "-a", version, "-m", "release #{version}!!!") sh("git", "push", "--tags") end namespace :doc do generate_tasks = [] namespace :generate do packages.each do |package| desc "generate documents for #{package}" task package do rm_rf("#{package}/yard_docs") ruby("-C#{package}", "-S", "yard", "doc") end generate_tasks << "doc:generate:#{package}" end end desc "generate all documents" task generate: generate_tasks do rm_rf("yard_docs") mkdir_p("yard_docs") packages.each do |package| cp_r("#{package}/yard_docs/", "yard_docs/#{package}") end File.open("yard_docs/index.html", "w") do |index_html| index_html << <<-HEADER Ruby-GNOME

Ruby-GNOME documents

FOOTER end end end ruby-gnome-ruby-gnome-25972cb/adwaita/000077500000000000000000000000001511343406000176265ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/adwaita/.yardopts000066400000000000000000000016521511343406000215000ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/Adwaita lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/adwaita/COPYING.LIB000066400000000000000000000636421511343406000213010ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/adwaita/README.md000066400000000000000000000007441511343406000211120ustar00rootroot00000000000000# Ruby/Adwaita Ruby/Adwaita is a Ruby binding of Adwaita. ## Requirements * Ruby/GTK4 in [Ruby-GNOME](https://ruby-gnome.github.io/) * [adwaita](https://gnome.pages.gitlab.gnome.org/libadwaita/) ## Install gem install adwaita ## License Copyright (c) 2022 Ruby-GNOME 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 https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/adwaita/Rakefile000066400000000000000000000020031511343406000212660ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2022 Ruby-GNOME 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/adwaita/adwaita.gemspec000066400000000000000000000037511511343406000226130ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2022-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "adwaita" s.summary = "Ruby/Adwaita is a Ruby binding of Adwaita." s.description = "Ruby/Adwaita is a Ruby binding of Adwaita." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["dependency-check/Rakefile"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "dependency-check/Rakefile", ] s.files += Dir.glob("lib/**/*.rb") s.add_runtime_dependency("gtk4", "= #{s.version}") s.add_runtime_dependency("rake") [ ["alpine_linux", "libadwaita-dev"], ["alt_linux", "libadwaita"], ["arch_linux", "libadwaita"], ["debian", "libadwaita-1-dev"], ["homebrew", "libadwaita"], ["msys2", "libadwaita"], ["rhel", "pkgconfig(libadwaita-1)"], ].each do |platform, package| s.requirements << "system: libadwaita-1: #{platform}: #{package}" end s.metadata["msys2_mingw_dependencies"] = "libadwaita" end ruby-gnome-ruby-gnome-25972cb/adwaita/dependency-check/000077500000000000000000000000001511343406000230175ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/adwaita/dependency-check/Rakefile000066400000000000000000000030271511343406000244660ustar00rootroot00000000000000# Copyright (C) 2022-2025 Ruby-GNOME 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 require "pkg-config" require "native-package-installer" if File.exist?(File.join(__dir__, "..", "vendor")) task :default => "nothing" else task :default => "dependency:check" end task :nothing do end namespace :dependency do desc "Check dependency" task :check do package_id = "libadwaita-1" unless PKGConfig.check_version?(package_id) unless NativePackageInstaller.install(:alt_linux => "libadwaita", :debian => "libadwaita-1-dev", :redhat => "pkgconfig(#{package_id})", :arch_linux => "libadwaita", :homebrew => "libadwaita") exit(false) end end end end ruby-gnome-ruby-gnome-25972cb/adwaita/lib/000077500000000000000000000000001511343406000203745ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/adwaita/lib/adwaita.rb000066400000000000000000000016641511343406000223420ustar00rootroot00000000000000# Copyright (C) 2022 Ruby-GNOME 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 require "gtk4" require "adwaita/loader" module Adwaita LOG_DOMAIN = "Adw" GLib::Log.set_log_domain(LOG_DOMAIN) loader = Loader.new(self) loader.load("Adw") end ruby-gnome-ruby-gnome-25972cb/adwaita/lib/adwaita/000077500000000000000000000000001511343406000220065ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/adwaita/lib/adwaita/loader.rb000066400000000000000000000017711511343406000236070ustar00rootroot00000000000000# Copyright (C) 2022 Ruby-GNOME 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 Adwaita class Loader < GObjectIntrospection::Loader private def pre_load(repository, namespace) end def post_load(repository, namespace) require_libraries end def require_libraries end end end ruby-gnome-ruby-gnome-25972cb/adwaita/test/000077500000000000000000000000001511343406000206055ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/adwaita/test/run-test.rb000077500000000000000000000024651511343406000227250ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2022-2025 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "atk", "cairo-gobject", "gdk_pixbuf2", "gio2", "pango", "gdk4", "graphene1", "gsk4", "gtk4", "adwaita", ]) do begin require "adwaita" rescue GObjectIntrospection::RepositoryError puts("Omit because typelib file doesn't exist: #{$!.message}") exit(true) end end ruby-gnome-ruby-gnome-25972cb/adwaita/test/test-application.rb000066400000000000000000000017601511343406000244160ustar00rootroot00000000000000# Copyright (C) 2022 Ruby-GNOME 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 TestApplication < Test::Unit::TestCase test ".new" do application = Adwaita::Application.new("org.example.hello", 0) assert_equal(Adwaita::StyleManager.default, application.style_manager) end end ruby-gnome-ruby-gnome-25972cb/atk/000077500000000000000000000000001511343406000167735ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/atk/.yardopts000066400000000000000000000016461511343406000206500ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/ATK lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/atk/COPYING.LIB000066400000000000000000000636421511343406000204460ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/atk/README.md000066400000000000000000000011031511343406000202450ustar00rootroot00000000000000# Ruby/ATK Ruby/ATK is a Ruby binding of ATK-1.12.x or later based on GObject-Introspection. ## Requirements * [Ruby/GObject-Introspection](https://github.com/ruby-gnome/ruby-gnome) * [Ruby/GLib2](https://github.com/ruby-gnome/ruby-gnome) ## Install gem install atk ## License Copyright (c) 2017-2020 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 * https://github.com/ruby-gnome/ruby-gnome * https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/atk/Rakefile000066400000000000000000000020111511343406000204320ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2017-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/atk/atk.gemspec000066400000000000000000000040061511343406000211170ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "atk" s.summary = "Ruby/ATK is a Ruby binding of ATK-1.0.x." s.description = "Ruby/ATK is a Ruby binding of ATK-1.0.x." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["dependency-check/Rakefile"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "dependency-check/Rakefile", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("glib2", "= #{s.version}") s.add_runtime_dependency("rake") [ ["alpine_linux", "at-spi2-core-dev"], ["alt_linux", "libatk-devel"], ["arch_linux", "atk"], ["conda", "atk"], ["debian", "libatk1.0-dev"], ["homebrew", "atk"], ["macports", "atk"], ["msys2", "atk"], ["rhel", "pkgconfig(atk)"], ].each do |platform, package| s.requirements << "system: atk: #{platform}: #{package}" end s.metadata["msys2_mingw_dependencies"] = "atk" end ruby-gnome-ruby-gnome-25972cb/atk/dependency-check/000077500000000000000000000000001511343406000221645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/atk/dependency-check/Rakefile000066400000000000000000000030131511343406000236260ustar00rootroot00000000000000# Copyright (C) 2017-2025 Ruby-GNOME 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 require "pkg-config" require "native-package-installer" task :default => "dependency:check" namespace :dependency do desc "Check dependency" task :check do package_id = "atk" unless PKGConfig.check_version?(package_id) unless NativePackageInstaller.install(:alt_linux => "libatk-devel", :conda => "atk", :debian => "libatk1.0-dev", :redhat => "pkgconfig(#{package_id})", :arch_linux => "atk", :homebrew => "atk", :macports => "atk") exit(false) end end end end ruby-gnome-ruby-gnome-25972cb/atk/lib/000077500000000000000000000000001511343406000175415ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/atk/lib/atk.rb000066400000000000000000000031471511343406000206520ustar00rootroot00000000000000# Copyright (C) 2017-2018 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 require "gobject-introspection" module Atk LOG_DOMAIN = "Atk" GLib::Log.set_log_domain(LOG_DOMAIN) class Loader < GObjectIntrospection::Loader end loader = Loader.new(self) loader.load("Atk") class TextRectangle def initialize(x=nil, y=nil, width=nil, height=nil) super() self.x = x if x self.y = y if y self.width = width if width self.height = height if height end end module Version MAJOR = MAJOR_VERSION MINOR = MINOR_VERSION MICRO = MICRO_VERSION STRING = "#{MAJOR_VERSION}.#{MINOR_VERSION}.#{MICRO_VERSION}" class << self def or_later?(major, minor, micro=nil) micro ||= 0 version = [ MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION, ] (version <=> [major, minor, micro]) >= 0 end end end end ruby-gnome-ruby-gnome-25972cb/atk/test/000077500000000000000000000000001511343406000177525ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/atk/test/atk-test-utils.rb000066400000000000000000000014651511343406000231770ustar00rootroot00000000000000# Copyright (C) 2017-2021 Ruby-GNOME 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 require "atk" module AtkTestUtils end ruby-gnome-ruby-gnome-25972cb/atk/test/run-test.rb000077500000000000000000000017601511343406000220670ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2017-2021 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "atk", ]) do require_relative "atk-test-utils" end ruby-gnome-ruby-gnome-25972cb/atk/test/test-text-rectangle.rb000066400000000000000000000020651511343406000242050ustar00rootroot00000000000000# Copyright (C) 2017 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 TestAtkTextRectangle < Test::Unit::TestCase include AtkTestUtils def test_width rectangle = Atk::TextRectangle.new(0, 10, 20, 30) assert_equal(0, rectangle.x) assert_equal(10, rectangle.y) assert_equal(20, rectangle.width) assert_equal(30, rectangle.height) end end ruby-gnome-ruby-gnome-25972cb/atk/test/test-version.rb000066400000000000000000000033471511343406000227500ustar00rootroot00000000000000# Copyright (C) 2017 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 TestAtkVersion < Test::Unit::TestCase include AtkTestUtils test "STRING" do major = Atk::Version::MAJOR minor = Atk::Version::MINOR micro = Atk::Version::MICRO assert_equal([major, minor, micro].join("."), Atk::Version::STRING) end sub_test_case("#or_later?") do test "same" do assert_true(Atk::Version.or_later?(Atk::Version::MAJOR, Atk::Version::MINOR, Atk::Version::MICRO)) end test "later" do assert_true(Atk::Version.or_later?(Atk::Version::MAJOR, Atk::Version::MINOR - 1, Atk::Version::MICRO)) end test "earlier" do assert_false(Atk::Version.or_later?(Atk::Version::MAJOR, Atk::Version::MINOR + 1, Atk::Version::MICRO)) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/000077500000000000000000000000001511343406000207245ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/cairo-gobject/.yardopts000066400000000000000000000016571511343406000226030ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/CairoGObject lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/cairo-gobject/COPYING.LIB000066400000000000000000000636421511343406000223770ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/cairo-gobject/README.md000066400000000000000000000010471511343406000222050ustar00rootroot00000000000000# Ruby/CairoGObject Ruby/CairoGObject is a Ruby binding of cairo-gobject. ## Requirements * Ruby/GLib2 in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [rcairo](https://github.com/rcairo/rcairo) * [cairo](http://cairographics.org/) GObject binding ## Install gem install cairo-gobject ## License Copyright (c) 2012-2013 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 https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/cairo-gobject/Rakefile000066400000000000000000000022541511343406000223740ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2012-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| package.windows.packages = [] package.windows.dependencies = [] package.windows.build_dependencies = ["cairo", "glib2"] package.windows.build_packages = [] end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/cairo-gobject.gemspec000066400000000000000000000032711511343406000250040ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "cairo-gobject" s.summary = "Ruby/CairoGObject is a Ruby binding of cairo-gobject." s.description = "Ruby/CairoGObject is a Ruby binding of cairo-gobject." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["ext/#{s.name}/extconf.rb"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "extconf.rb", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("ext/#{s.name}/*.{c,h,def,rb}") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("cairo", ">= 1.16.2") s.add_runtime_dependency("glib2", "= #{s.version}") end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/ext/000077500000000000000000000000001511343406000215245ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/cairo-gobject/ext/cairo-gobject/000077500000000000000000000000001511343406000242345ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/cairo-gobject/ext/cairo-gobject/extconf.rb000077500000000000000000000066701511343406000262430ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2013-2023 Ruby-GNOME 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 require "pathname" source_dir = Pathname(__FILE__).dirname base_dir = source_dir.parent.parent.expand_path top_dir = base_dir.parent.expand_path top_build_dir = Pathname(".").parent.parent.parent.expand_path mkmf_gnome2_dir = top_dir + "glib2" + "lib" $LOAD_PATH.unshift(mkmf_gnome2_dir.to_s) if mkmf_gnome2_dir.exist? module_name = "cairo_gobject" package_id = "cairo-gobject" require "mkmf-gnome" ["glib2"].each do |package| add_depend_package(package, "#{package}/ext/#{package}", top_dir.to_s, top_build_dir: top_build_dir.to_s) end unless required_pkg_config_package(package_id, :alt_linux => "libcairo-devel", :conda => "cairo", :debian => "libcairo2-dev", :redhat => "pkgconfig(#{package_id})", :arch_linux => "cairo", :homebrew => "cairo") exit(false) end unless check_cairo(:top_dir => top_dir) exit(false) end create_pkg_config_file("Ruby/CairoGObject", package_id, ruby_gnome_version, "ruby-cairo-gobject.pc") ensure_objs $defs << "-DRUBY_CAIRO_GOBJECT_COMPILATION" case RUBY_PLATFORM when /darwin/ symbols_in_external_bundles = [ "_rb_cCairo_Context", "_rb_cCairo_Device", "_rb_cCairo_FontFace", "_rb_cCairo_FontOptions", "_rb_cCairo_Pattern", "_rb_cCairo_Region", "_rb_cCairo_ScaledFont", "_rb_cCairo_Surface", "_rb_cairo_context_from_ruby_object", "_rb_cairo_context_to_ruby_object", "_rb_cairo_device_from_ruby_object", "_rb_cairo_device_to_ruby_object", "_rb_cairo_font_face_from_ruby_object", "_rb_cairo_font_face_to_ruby_object", "_rb_cairo_font_options_from_ruby_object", "_rb_cairo_font_options_to_ruby_object", "_rb_cairo_pattern_from_ruby_object", "_rb_cairo_pattern_to_ruby_object", "_rb_cairo_region_from_ruby_object", "_rb_cairo_region_to_ruby_object", "_rb_cairo_scaled_font_from_ruby_object", "_rb_cairo_scaled_font_to_ruby_object", "_rb_cairo_surface_from_ruby_object", "_rb_cairo_surface_to_ruby_object", "_rbgobj_convert_define", "_rbgobj_define_class", "_rbgobj_gtype_new", "_rbgobj_make_boxed", ] symbols_in_external_bundles.each do |symbol| $DLDFLAGS << " -Wl,-U,#{symbol}" end end create_makefile(module_name) pkg_config_dir = with_config("pkg-config-dir") if pkg_config_dir.is_a?(String) File.open("Makefile", "ab") do |makefile| makefile.puts makefile.puts("pkgconfigdir=#{pkg_config_dir}") end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/ext/cairo-gobject/rb-cairo-gobject.c000066400000000000000000000237231511343406000275200ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2013-2019 Ruby-GNOME 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 */ #include "rb-cairo-gobject.h" #define RG_TARGET_NAMESPACE rb_mCairoGObject static VALUE RG_TARGET_NAMESPACE; #define DEFINE_CONVERSION(prefix, \ gtype, \ ClassName, \ rb_klass, \ RVAL2CR, \ CR2RVAL) \ static gpointer \ prefix ## _robj2instance(VALUE rb_object, \ G_GNUC_UNUSED gpointer user_data) \ { \ return RVAL2CR(rb_object); \ } \ \ static VALUE \ prefix ## _instance2robj(gpointer cr_object, \ G_GNUC_UNUSED gpointer user_data) \ { \ return CR2RVAL(cr_object); \ } \ \ static VALUE \ prefix ## _s_gtype(G_GNUC_UNUSED VALUE klass) \ { \ return rbgobj_gtype_new(gtype); \ } \ \ static VALUE \ rg_ ## prefix ## _s_try_convert(VALUE klass, VALUE value) \ { \ if (RTEST(rb_obj_is_kind_of(value, klass))) { \ return value; \ } else { \ gpointer raw_object = RVAL2CR(value); \ return BOXED2RVAL(raw_object, gtype); \ } \ } \ \ static void \ define_ ## prefix ## _conversion(void) \ { \ RGConvertTable table; \ VALUE rg_klass; \ \ memset(&table, 0, sizeof(RGConvertTable)); \ table.type = gtype; \ table.klass = rb_klass; \ table.robj2instance = prefix ## _robj2instance; \ table.instance2robj = prefix ## _instance2robj; \ \ RG_DEF_CONVERSION(&table); \ \ rb_define_singleton_method(rb_klass, \ "gtype", \ prefix ## _s_gtype, \ 0); \ \ rg_klass = G_DEF_CLASS(gtype, ClassName, RG_TARGET_NAMESPACE); \ rb_define_singleton_method(rg_klass, \ "try_convert", \ rg_ ## prefix ## _s_try_convert, \ 1); \ } DEFINE_CONVERSION(context, CAIRO_GOBJECT_TYPE_CONTEXT, "Context", rb_cCairo_Context, RVAL2CRCONTEXT, CRCONTEXT2RVAL) DEFINE_CONVERSION(device, CAIRO_GOBJECT_TYPE_DEVICE, "Device", rb_cCairo_Device, RVAL2CRDEVICE, CRDEVICE2RVAL) DEFINE_CONVERSION(pattern, CAIRO_GOBJECT_TYPE_PATTERN, "Pattern", rb_cCairo_Pattern, RVAL2CRPATTERN, CRPATTERN2RVAL) DEFINE_CONVERSION(surface, CAIRO_GOBJECT_TYPE_SURFACE, "Surface", rb_cCairo_Surface, RVAL2CRSURFACE, CRSURFACE2RVAL) DEFINE_CONVERSION(scaled_font, CAIRO_GOBJECT_TYPE_SCALED_FONT, "ScaledFont", rb_cCairo_ScaledFont, RVAL2CRSCALEDFONT, CRSCALEDFONT2RVAL) DEFINE_CONVERSION(font_face, CAIRO_GOBJECT_TYPE_FONT_FACE, "FontFace", rb_cCairo_FontFace, RVAL2CRFONTFACE, CRFONTFACE2RVAL) DEFINE_CONVERSION(font_options, CAIRO_GOBJECT_TYPE_FONT_OPTIONS, "FontOptions", rb_cCairo_FontOptions, RVAL2CRFONTOPTIONS, CRFONTOPTIONS2RVAL) DEFINE_CONVERSION(region, CAIRO_GOBJECT_TYPE_REGION, "Region", rb_cCairo_Region, RVAL2CRREGION, CRREGION2RVAL) void Init_cairo_gobject(void) { RG_TARGET_NAMESPACE = rb_define_module("CairoGObject"); rb_define_const(RG_TARGET_NAMESPACE, "BUILD_VERSION", rb_ary_new3(3, INT2FIX(CAIRO_VERSION_MAJOR), INT2FIX(CAIRO_VERSION_MINOR), INT2FIX(CAIRO_VERSION_MICRO))); define_context_conversion(); define_device_conversion(); define_pattern_conversion(); define_surface_conversion(); define_scaled_font_conversion(); define_font_face_conversion(); define_font_options_conversion(); define_region_conversion(); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_STATUS, "Status", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_CONTENT, "Content", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_OPERATOR, "Operator", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_ANTIALIAS, "Antialias", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_FILL_RULE, "FillRule", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_LINE_CAP, "LineCap", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_LINE_JOIN, "LineJoin", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_TEXT_CLUSTER_FLAGS, "TextClusterFlags", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_FONT_SLANT, "FontSlant", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_FONT_WEIGHT, "FontWeight", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_SUBPIXEL_ORDER, "SubpixelOrder", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_HINT_STYLE, "HintStyle", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_HINT_METRICS, "HintMetrics", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_FONT_TYPE, "FontType", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_PATH_DATA_TYPE, "PathDataType", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_DEVICE_TYPE, "DeviceType", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_SURFACE_TYPE, "SurfaceType", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_FORMAT, "Format", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_PATTERN_TYPE, "PatternType", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_EXTEND, "Extend", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_FILTER, "Filter", RG_TARGET_NAMESPACE); G_DEF_CLASS(CAIRO_GOBJECT_TYPE_REGION_OVERLAP, "RegionOverlap", RG_TARGET_NAMESPACE); } ruby-gnome-ruby-gnome-25972cb/cairo-gobject/ext/cairo-gobject/rb-cairo-gobject.h000066400000000000000000000025251511343406000275220ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2013 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 */ #ifndef RB_CAIRO_GOBJECT_H #define RB_CAIRO_GOBJECT_H #include #include #include #include #ifndef CAIRO_GOBJECT_TYPE_HINT_METRICS # define CAIRO_GOBJECT_TYPE_HINT_METRICS CAIRO_GOBJECT_TYPE_HNT_METRICS #endif #ifndef CAIRO_GOBJECT_TYPE_TEXT_CLUSTER_FLAGS # define CAIRO_GOBJECT_TYPE_TEXT_CLUSTER_FLAGS cairo_gobject_text_cluster_flags_get_type () #endif #include extern void Init_cairo_gobject(void); #endif ruby-gnome-ruby-gnome-25972cb/cairo-gobject/extconf.rb000077500000000000000000000040271511343406000227250ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2013 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 require "pathname" require "mkmf" require "rbconfig" require "fileutils" module_name = "cairo_gobject" package = "cairo-gobject" base_dir = Pathname(__FILE__).dirname.expand_path ext_dir = base_dir + "ext" + package mkmf_gnome2_dir = base_dir + 'lib' if RbConfig.respond_to?(:ruby) ruby = RbConfig.ruby else ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG["EXEEXT"]) end build_dir = Pathname("ext") + package FileUtils.mkdir_p(build_dir.to_s) unless build_dir.exist? extconf_rb_path = ext_dir + "extconf.rb" unless system(ruby, "-C", build_dir.to_s, extconf_rb_path.to_s, *ARGV) exit(false) end create_makefile(module_name) FileUtils.mv("Makefile", "Makefile.lib") File.open("Makefile", "w") do |makefile| makefile.puts(<<-EOM) all: (cd ext/#{package} && $(MAKE)) $(MAKE) -f Makefile.lib install: (cd ext/#{package} && $(MAKE) install) $(MAKE) -f Makefile.lib install site-install: (cd ext/#{package} && $(MAKE) site-install) $(MAKE) -f Makefile.lib site-install clean: (cd ext/#{package} && $(MAKE) clean) $(MAKE) -f Makefile.lib clean distclean: (cd ext/#{package} && $(MAKE) distclean) $(MAKE) -f Makefile.lib distclean @rm -f Makefile.lib EOM end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/lib/000077500000000000000000000000001511343406000214725ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/cairo-gobject/lib/cairo-gobject.rb000066400000000000000000000016511511343406000245320ustar00rootroot00000000000000# Copyright (C) 2013-2018 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 require "cairo" require "glib2" require "cairo_gobject.so" module CairoGObject LOG_DOMAIN = "CairoGObject" GLib::Log.set_log_domain(LOG_DOMAIN) end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/000077500000000000000000000000001511343406000217035ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/cairo-gobject-test-utils.rb000066400000000000000000000015101511343406000270500ustar00rootroot00000000000000# Copyright (C) 2013-2021 Ruby-GNOME 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 require "cairo-gobject" module CairoGObjectTestUtils end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/run-test.rb000077500000000000000000000021331511343406000240130ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2013-2021 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "cairo-gobject", ]) do require_relative "../../gobject-introspection/test/gobject-introspection-test-utils" require_relative "cairo-gobject-test-utils" end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairoantialias.rb000066400000000000000000000017101511343406000262510ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCaitoAntialias < Test::Unit::TestCase def test_cairo_antialias assert_nothing_raised do CairoGObject::Antialias.new(CairoGObject::Antialias::DEFAULT) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairocontent.rb000066400000000000000000000016761511343406000257710ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoContent < Test::Unit::TestCase def test_cairo_content assert_nothing_raised do CairoGObject::Content.new(CairoGObject::Content::COLOR) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairocontext.rb000066400000000000000000000017531511343406000257770ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoContext < Test::Unit::TestCase def test_cairo_context assert_nothing_raised do surface = Cairo::ImageSurface.new(Cairo::Format::ARGB32, 290, 200) Cairo::Context.new(surface) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairodevicetype.rb000066400000000000000000000017101511343406000264450ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoDeviceType < Test::Unit::TestCase def test_cairo_device_type assert_nothing_raised do CairoGObject::DeviceType.new(CairoGObject::DeviceType::GL) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairoextend.rb000066400000000000000000000016731511343406000256030ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoExtend < Test::Unit::TestCase def test_cairo_extend assert_nothing_raised do CairoGObject::Extend.new(CairoGObject::Extend::REPEAT) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairofillrule.rb000066400000000000000000000017051511343406000261260ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoFullRule < Test::Unit::TestCase def test_cairo_fill_rule assert_nothing_raised do CairoGObject::FillRule.new(CairoGObject::FillRule::WINDING) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairofilter.rb000066400000000000000000000016661511343406000256030ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoFilter < Test::Unit::TestCase def test_cairo_filter assert_nothing_raised do CairoGObject::Filter.new(Cairo::Filter::GAUSSIAN) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairofontslant.rb000066400000000000000000000017011511343406000263140ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoFontSlant < Test::Unit::TestCase def test_cairo_font_slant assert_nothing_raised do CairoGObject::FontSlant.new(Cairo::FontSlant::NORMAL) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairofonttype.rb000066400000000000000000000017001511343406000261530ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoFontType < Test::Unit::TestCase def test_caito_font_type assert_nothing_raised do CairoGObject::FontType.new(CairoGObject::FontType::FT) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairofontweight.rb000066400000000000000000000017031511343406000264640ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCaitoFontWeight < Test::Unit::TestCase def test_cairo_font_weight assert_nothing_raised do CairoGObject::FontWeight.new(Cairo::FontWeight::BOLD) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairoformat.rb000066400000000000000000000016631511343406000256030ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoFormat < Test::Unit::TestCase def test_cairo_format assert_nothing_raised do CairoGObject::Format.new(Cairo::Format::RGB24) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairohintmetrics.rb000066400000000000000000000017051511343406000266410ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoHintMetrics < Test::Unit::TestCase def test_cairo_hint_metrics assert_nothing_raised do CairoGObject::HintMetrics.new(Cairo::HintMetrics::ON) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairohintstyle.rb000066400000000000000000000017001511343406000263260ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoHintStyle < Test::Unit::TestCase def test_cairo_hintstyle assert_nothing_raised do CairoGObject::HintStyle.new(Cairo::HintStyle::MEDIUM) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairoimagesurface.rb000066400000000000000000000017121511343406000267410ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoImageSurface < Test::Unit::TestCase def test_cairo_image_surface assert_nothing_raised do Cairo::ImageSurface.new(Cairo::Format::ARGB32, 290, 200) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairolinecap.rb000066400000000000000000000016621511343406000257250ustar00rootroot00000000000000# Copyright (C) 2013 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 TestLineCap < Test::Unit::TestCase def test_cairo_linecap assert_nothing_raised do CairoGObject::LineCap.new(Cairo::LineCap::ROUND) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairolinejoin.rb000066400000000000000000000016731511343406000261230ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoLineJoin < Test::Unit::TestCase def test_cairo_linejoin assert_nothing_raised do CairoGObject::LineJoin.new(Cairo::LineJoin::ROUND) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairooperator.rb000066400000000000000000000016721511343406000261460ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoOperator < Test::Unit::TestCase def test_cairo_operator assert_nothing_raised do CairoGObject::Operator.new(Cairo::Operator::OVER) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairopathdatatype.rb000066400000000000000000000017171511343406000270030ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoPathDataType < Test::Unit::TestCase def test_cairo_path_data_type assert_nothing_raised do CairoGObject::PathDataType.new(Cairo::PathDataType::LINE_TO) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairopatterntype.rb000066400000000000000000000017201511343406000266640ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoPatternType < Test::Unit::TestCase def test_caito_pattern_type assert_nothing_raised do CairoGObject::PatternType.new(CairoGObject::PatternType::LINEAR) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairoregion.rb000066400000000000000000000016261511343406000255750ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoRegion < Test::Unit::TestCase def test_cairo_region assert_nothing_raised do Cairo::Region.new end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairoregionoverlap.rb000066400000000000000000000017161511343406000271660ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoRegionOverlap < Test::Unit::TestCase def test_cairo_regin_overlap assert_nothing_raised do CairoGObject::RegionOverlap.new(Cairo::RegionOverlap::PART) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairoscaledfont.rb000066400000000000000000000023711511343406000264320ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoScaledFont < Test::Unit::TestCase def setup surface = Cairo::ImageSurface.new(Cairo::Format::ARGB32, 290, 200) context = Cairo::Context.new(surface) @font_face = context.font_face @font_matrix = Cairo::Matrix.identity @scale = Cairo::Matrix.scale(0.5, 1.0) @font_option = Cairo::FontOptions.new end def test_cairo_scaled_font assert_nothing_raised do Cairo::ScaledFont.new(@font_face, @font_matrix, @scale, @font_option) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairostatus.rb000066400000000000000000000016741511343406000256400ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoStatus < Test::Unit::TestCase def test_cairo_status assert_nothing_raised do CairoGObject::Status.new(CairoGObject::Status::SUCCESS) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairosubpixelorder.rb000066400000000000000000000017221511343406000271760ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoSubpixelOrder < Test::Unit::TestCase def test_cairo_subpixel_order assert_nothing_raised do CairoGObject::SubpixelOrder.new(Cairo::SubpixelOrder::DEFAULT) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairosurfacetype.rb000066400000000000000000000017171511343406000266450ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoSurfaceType < Test::Unit::TestCase def test_cairo_surface_type assert_nothing_raised do CairoGObject::SurfaceType.new(CairoGObject::SurfaceType::IMAGE) end end end ruby-gnome-ruby-gnome-25972cb/cairo-gobject/test/test_cairotextclusterflags.rb000066400000000000000000000017471511343406000277210ustar00rootroot00000000000000# Copyright (C) 2013 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 TestCairoTextClusterFlags < Test::Unit::TestCase def test_cairo_text_clutter_flags assert_nothing_raised do CairoGObject::TextClusterFlags.new(CairoGObject::TextClusterFlags::BACKWARD) end end end ruby-gnome-ruby-gnome-25972cb/clutter-gdk/000077500000000000000000000000001511343406000204415ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gdk/.yardopts000066400000000000000000000016551511343406000223160ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/ClutterGDK lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/clutter-gdk/COPYING.LIB000066400000000000000000000636421511343406000221140ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/clutter-gdk/README.md000066400000000000000000000012221511343406000217150ustar00rootroot00000000000000# Ruby/ClutterGDK Ruby/ClutterGDK is a Ruby binding of GDK specific API of Clutter. ## Requirements * Ruby/Clutter and Ruby/GTK3 in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [Clutter-gdk](http://blogs.gnome.org/clutter/) ## Install gem install clutter-gdk ## 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. ### C API https://developer.gnome.org/clutter/stable/clutter-GDK-Specific-Support.html ## Project Websites * https://github.com/ruby-gnome/ruby-gnome * https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/clutter-gdk/Rakefile000066400000000000000000000020111511343406000221000ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2016-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/clutter-gdk/clutter-gdk.gemspec000066400000000000000000000031341511343406000242340ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "clutter-gdk" s.summary = "Ruby/ClutterGDK is a Ruby binding of GDK specific API of Clutter." s.description = "Ruby/ClutterGDK is a Ruby binding of GDK specific API of Clutter." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("clutter", "= #{s.version}") s.add_runtime_dependency("gdk3", "= #{s.version}") end ruby-gnome-ruby-gnome-25972cb/clutter-gdk/lib/000077500000000000000000000000001511343406000212075ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gdk/lib/clutter-gdk.rb000066400000000000000000000031111511343406000237550ustar00rootroot00000000000000# 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 require "clutter" require "gdk3" module ClutterGdk loader = GObjectIntrospection::Loader.new(self) loader.load("ClutterGdk") end init_gdk = lambda do module Gdk class Window def clutter_stage ClutterGdk.get_stage_from_window(self) end end end end if Gdk.respond_to?(:init) Gdk.on_init do init_gdk.call end else init_gdk.call end init_clutter = lambda do Gdk.init if Gdk.respond_to?(:init) module Clutter class Stage def gdk_window ClutterGdk.get_stage_window(self) end def set_foreign_window(window) ClutterGdk.set_stage_foreign(self, window) end alias_method :foreign_window=, :set_foreign_window end end end if Clutter.respond_to?(:init) Clutter.on_init do init_clutter.call end else init_clutter.call end ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/000077500000000000000000000000001511343406000216655ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/.yardopts000066400000000000000000000016631511343406000235410ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/ClutterGStreamer lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/COPYING.LIB000066400000000000000000000636421511343406000233400ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/README.md000066400000000000000000000014441511343406000231470ustar00rootroot00000000000000# Ruby/ClutterGStreamer Ruby/ClutterGStreamer is a Ruby binding of Clutter-GStreamer. ## Requirements * Ruby/Clutter and Ruby/GStreamer in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [Clutter-GStreamer](http://blogs.gnome.org/clutter/) ## Install gem install clutter-gstreamer ## License Copyright (c) 2013 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. ### Exceptions Ruby scripts and image files in sample/ are ported and copied from Clutter. Headers in samples/*.rb describes that the location of the original file of the Ruby script and image files. The original files are licensed under the LGPL v2.1 or later. ## Project Website https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/Rakefile000066400000000000000000000020111511343406000233240ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2013-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/clutter-gstreamer.gemspec000066400000000000000000000041211511343406000267010ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "clutter-gstreamer" s.summary = "Ruby/ClutterGStreamer is a Ruby binding of Clutter-GStreamer." s.description = "Ruby/ClutterGStreamer is a Ruby binding of Clutter-GStreamer." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["dependency-check/Rakefile"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "dependency-check/Rakefile", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("sample/**/*") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("clutter", "= #{s.version}") s.add_runtime_dependency("gdk_pixbuf2", "= #{s.version}") s.add_runtime_dependency("gstreamer", "= #{s.version}") s.add_runtime_dependency("rake") [ ["alpine_linux", "clutter-gst-dev"], ["arch_linux", "clutter-gst"], ["debian", "libclutter-gst-3.0-dev"], ["rhel", "pkgconfig(clutter-gst-3.0)"], ].each do |platform, package| s.requirements << "system: clutter-gst-3.0: #{platform}: #{package}" end end ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/dependency-check/000077500000000000000000000000001511343406000250565ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/dependency-check/Rakefile000066400000000000000000000026201511343406000265230ustar00rootroot00000000000000# Copyright (C) 2017-2025 Ruby-GNOME 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 require "pkg-config" require "native-package-installer" if File.exist?(File.join(__dir__, "..", "vendor")) task :default => "nothing" else task :default => "dependency:check" end task :nothing do end namespace :dependency do desc "Check dependency" task :check do package_id = "clutter-gst-3.0" unless PKGConfig.check_version?(package_id) unless NativePackageInstaller.install(:debian => "libclutter-gst-3.0-dev", :redhat => "pkgconfig(#{package_id})", :homebrew => "clutter-gst") exit(false) end end end end ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/lib/000077500000000000000000000000001511343406000224335ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/lib/clutter-gst.rb000066400000000000000000000042431511343406000252400ustar00rootroot00000000000000# Copyright (C) 2013-2018 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 require "gdk_pixbuf2" require "clutter" require "gst" module ClutterGst LOG_DOMAIN = "Clutter-GStreamer" GLib::Log.set_log_domain(LOG_DOMAIN) class << self attr_accessor :load_version def const_missing(name) init if const_defined?(name) const_get(name) else super end end def init(argv=[]) class << self remove_method(:init) remove_method(:const_missing) end Gst.init if Gst.respond_to?(:init) Clutter.init if Clutter.respond_to?(:init) loader = Loader.new(self, argv) loader.version = load_version loader.load end end self.load_version = nil class InitError < StandardError end class Loader < GObjectIntrospection::Loader def initialize(base_module, init_arguments) super(base_module) @init_arguments = init_arguments end def load super("ClutterGst") end private def pre_load(repository, namespace) init = repository.find(namespace, "init") arguments = [ [$0] + @init_arguments, ] error, returned_arguments = init.invoke(arguments) @init_arguments.replace(returned_arguments[1..-1]) if error.to_i <= 0 raise InitError, "failed to initialize Clutter-GStreamer: #{error.name}" end end def post_load(repository, namespace) require "clutter-gst/version" end end end ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/lib/clutter-gst/000077500000000000000000000000001511343406000247105ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/lib/clutter-gst/version.rb000066400000000000000000000022641511343406000267260ustar00rootroot00000000000000# Copyright (C) 2015 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 ClutterGst module Version MAJOR = ClutterGst::MAJOR_VERSION MINOR = ClutterGst::MINOR_VERSION MICRO = ClutterGst::MICRO_VERSION STRING = ClutterGst::VERSION_S class << self def or_later?(major, minor, micro=nil) micro ||= 0 version = [ MAJOR, MINOR, MICRO, ] (version <=> [major, minor, micro]) >= 0 end end end end ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/lib/clutter-gstreamer.rb000066400000000000000000000014401511343406000264300ustar00rootroot00000000000000# Copyright (C) 2014 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 require "clutter-gst" ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/sample/000077500000000000000000000000001511343406000231465ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/sample/2.0/000077500000000000000000000000001511343406000234455ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/sample/2.0/media-actions-pause.png000066400000000000000000000054301511343406000300050ustar00rootroot00000000000000‰PNG  IHDR01œ^*"sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ2Þ@\_ ˜IDAThÞ­ZËŽ]W]õØ{ŸÄNHâ¼ ‰P"DœC1‡B™s|s`ñŒ0 $ Ê„!RÃ$(Û}o÷={1سÏé‹ívbËêvß{wíªZµjUÀçë×OûGÜðo‡ÍkÀc.àg`ëÀ»à‹€›ìSN¹Dò#ïm^{BD"y³:úi‚4¸`ïf/?p9|ã›/þÚ̯Ì÷tªHØï÷¿ûío~ÿ3‹0Ï3ÀÝ ‡[/}çÛ?K)½Dòìï/ó|øç^}íû7>¹A7³|íÚW¯¹û×T5LÓtáèä~¿Ç4MßðS3;53œœœì„€œ3ó¦iúžˆ0¥¹°­ÝnGá…ž¿ö·¿¾ñ†Ç!ª¯\yT~ôÃCU/tè­›7å•_½Â?ü\¾l€@M»1FÌsF Áàá‡ÁË?xYî¿téBvrÎøÅ/.ï¿ÿE•)&xˆíÂ)%\½z*sàúõëH) xˆÇ „`–I–úJ)ʳÏ>‡|ðb0#¥PU„èÓ4ÁJ*"ãÝÿ¼sÇL˜®<òØêg1¢ :RJÈ9/†ˆ~ðÑû½Vú˲~kfÆ“aeGEc„»;¥_” ÓØïwwtÀÍÀáB$‘R Øf 9@®jûýníÀÿÉUPÔ„1FzŒqV "ÀíjŒ$ ’ý3C6Ÿ !”÷l.ORÃ};["(ÊKU¬d ÆU^Eéδ†EHàºbŒÈ92¾›5¼{;ƒªÂŠ+c%šr¡ËÇLjÆÁ^Âåôö_ÞuO[ÛéEcD¯ä»v¢C¨žC,Á:¡u•ð®›oo B+â"ud¡UYÞ9¬0àmBG2pìòÄE°Jc™¨)S*}Z_áÚ vâ¡"„²J`Ï€PŽ}æ.T)¾Ñ¨ „@O)QÕœq òŽ:¡Õe³lj ¥Tj òÈò¹<Øàmí”Ë/E/ªè4:ò+‡r'7Éù’ãÆxª4ºÒÑ!GAŸTŒßÉΚ\T1Dxªàš®pÜ H6w(8æÛ˜ÎÝ#°“M½”3ÏÛ!×N© cª4:óБ_ïôÚÈ­Ýth³Ó-ë÷íó¡h¡¼ˆ-âœyÚ±ÌÖ0U ¹&£‘7˜)kz@£ÓcˆØfäÌžW–6ŒVöÊNÞõ Y"·éE1ˆ8@’8ÙŸŽV.C´µë kh XJ „bŠ<›÷ÈÈ«”i‘dÅkzzÍP“ÆK#[óݘ'û›K;&ª•áê·´,´F)rŽÜZX(ƈ[;)CÚØ±¥(J,%PÿJZɼî!BUÖÔDÖ?뉓E¹nm5ÜJÎç@LF-d9Ôb*.¨h ¤qÀâ…km" UEš5— ˆ3 U…ŽªR¹­ôlŠÊ,äŠítU ¥‘…H3§ÙÖúA¯®áêJ?JJO!¦¦03ĸöšTµ¢ŒK¦YtÎó|@Î3sFÎÌóŒ+< ֘ܜ1DzJÁ ólPÓŽ!mE* ¥É ôبjàeÕ‚KÍ€ÌTUØ ½öûœžvÍ? 7‘ª™75˜•¼h!s£l5„È„yO%þ&zdJ_ÑsPUäL” Ø‚õú>UºíÐ'À¬ÊB-ÓîÆ=Ä75…š­‘B©\7”œ3ò<·IlrÔ&ˆò ÛÚÐDæ5Ó²¨Ê6PQJ`†«ðÕ%3åž w“ÞÈÌ-»Ù’ÚaŒ›ó\¾Î3rý¾u^+ûWƒ›!D§ˆr™‘3½¦_6Ð[¦¼VvìMR³s¸ÂÍ`n9ÆHO)Á-ÀìtåÀn vh4t¨µZ1fÙ8Ð ´\x%Û¹¥Ðì£åAРj †Øp9B¨P«ÔƒY…—Cцlö÷›9‚{½l>R ™ÃF;¢È"çWïi dÛ„hËvð"Ì ÞÚgUÒŠ‘ìü\d°@„è8`ÀÌÒDu€Äb§Þ¹qz…ä:h¥.§´BÐÜR¢Çéî,ÅeUHÕCë÷…¸ô‡ ¡ÆBR±©¦H1RT8®JbŒ032“ jÍQ…0çе+vÚe' w/k•²5S˜íbÑ'¬z©Dxl…Ÿkf9·™3¹ iï“*R!„Û,·dUÄfF3-J)Á,Ôù°À©î~„µfB zBîaÅ,C:„L­Ë’âl…PµCÂ\D3´9À‚Œr×€ÐÖ*nÖ ¹ëíÆ@Íÿ¡¶¸ÐH‡uMsB$·Î‰HWŸÛ”!f)`ÊÈBŠC…ÛÒ`jZ#Ë¹Š¶†›zñŒÜÒÈZa•F6χ„ܹ52_j (WA7ƒÚE È Ø+îµRJp÷3/C­O›UÛìJ@ÈË,Ðׂ›FãAeëgÎ…FÕ± ¯ªË¾)"¥"ËRllt])Û=À§)Ñ]i­s™ÄZcé·¬dÑšQèYÅæ'ˆ l¶„ÜÌ,Žª#ª M­MU6i!‹¬·^kÊ”j'nÍ¥h®–­}¡Ô9`‡H+âPv­ØÖ@Ù åÞ–YCúB¶I¬La ¹A4šù8h•ÖùxSã‡Õà‰¥9÷ƒc×õcr>°ŠËh±:Lî°*Š¡0f‚ÃÜûÁëmKïjb}[6µR‚©ž{BMû  "ƒ´A“ç.æ˜ÙïÏ:,ƒF¥QwŽšªmæ‚òÙ@£VK\=gh£ä(É[g¶!5ôNìîðZ„Ì5ož¨p½v©²¢4Å&°<%³s8„™‹ö:¼d.’¹/‰›öj66?3Õ*Ý1¦¥‘iOmÁ™®Và"y‰>ó¹­°¦¨¥i-› w„hª4sˆYr“Ó«Ë‚¥x[ðšmjõ2‘Õ Ä>cªjÇZŠÓ‘­ðzù;ΰZÅœ‡ÂÏc—ž¦ !̇CÁp‡PYN°YÛ\—c h“Ó)Eh•ÓññÇwGV„ú2k|ÆUfÖÝþ’…)N°àÜ>àˆ1ò Zíׯÿ»¸[íU[¤rËÊ_ê“ÿ®§Ü0M c¢©ŠªÊn·Ã_õÈpqççggg4317Ê\Ï1D@„f†ÓÓ=ÿü—?mÐÝÙ:==¥ªŠ©J‘.yæ©gÞ¼qã“÷H>4÷ôËVšÈ[÷ÝÿÃá0µubc!rß4Ýpó¿|n>æ{´#>zú©§ßHÎùs"‚·ßyû¾7ßúÇ“"rO¿ìB¾þâ·þ5ÏsRÕ€›«a¸”sNªzöÚë¯~ ro¿CR¿òåçß}âñ'v$!$•ä"üý‚ÿoàLDnÈ£!©.‹ˆ}Fv²ˆÜø-¤µ¢ jRIEND®B`‚ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/sample/2.0/media-actions-start.png000066400000000000000000000057541511343406000300360ustar00rootroot00000000000000‰PNG  IHDR)0Œ¹S¥sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ1GI å lIDATXÃÍ™kp×™†ßïôe¦5Ó#Í[èf HÂDÙdŒ@Ø‘ÀÅN¼&…°6l*ÙZmœ”WÅû#ŽS¹Vâ®dXgãª1]LBðj7©Ø©dÙ2f/Æ‹(Ùº A£‘4Ó=}ΗÝ3#q $Áà©’zÔÓ5ýœ÷{¿KibjhŒ÷ØKP@ ñà\î½™hk_qß’%M_cà&&&²*ä¸ïÈŠÅ‹Ò4Í»‰ø_ÏŸ_¥˜ùÌädF7Røaf©”Âçþ***]ܰhçª;VnP @U°  `f|üã÷òî]?å¶¶¶E†¡?þá®5¿Z²¤© €`QàÙãÉ·ÞÒ¡iZróæ-dš&­[» <88÷<÷ÁºÚÚ„išgR©ó9vàUïFAb2“†ãäÐÔ¸„Vw®áúúz:Ö×÷AÃÐ×ÝrKý¼á³#ÿ'¥´+¸×ïâÂÌ ÙÜ Fdž¡é‚Ö¯ïÆ®gw¡ëÃ]U¦iþmGç/ÿÅš[‚¤º5ð+]W%sNRI03r¹,òž +laÍš»(y{’GGF¢™Lfc]]íâh4:06vn<ðª Ê_H)AD "H)‘s|Øõ·ÒêÕk¸¹¹ÇúŽ5åóùîE‹6¦'Ò‡r¹œº—¼ÖõU\é"?’Žã`ôÜ0ò^žV¬h¥;žÅý÷?+++Ûв¢å·--ËÖ†a-¶öZ–¬Ë*y)Xf†ëæàæèšU+ï ö¶•œžL‡ÆÎÞS]3?™H懇G ˆÀêº@@ ©$7×u0¿ªš:;:¹µµ}}Çd2™îÅ ‹–¹9ç¿2SSy"*ÔÖD"äóù?Ò4ÍDý-uBˆ9 ¾b H%1“ª©®¡{ï½–ÖNŸ>½0VûLUUÕ¸çyžç¡Pȶ,+kš¦Ìf³¨««ÃäääÕA–——'æÏ¯*Bf,<ÏŠÉs¥7ïÂq€Ëno¡Ýù!H)éwÞ¾«¼¢|eUÕÍS§„å¦iš±X,?88( ±±©TêCVUU%â‰x%7oÞÇÉA*Y íÕ‚2nÞ“Ë!¯ÄÊö•ÜÙщý'掎®­­«í …B§3Ó˲•••†RjzhhÉdÃÃׇ¬¯¯ODíHÉÍmã:P¬@$@DD q•°ða³Ù03UVΣ»?zjjkèÔ©“ÕJ©OWÎKh¦aždfYQQQQ[[ëêºî ]²¡¡1ašzàCºù”â`AÑ9ªŠ 1Gy!òÒƒë:Pбô¶÷Ñê5k8‰ÐÉ“ýmžôîŠÅl!„þ†¦iÃ0Ê,X òÐÝÝþþþRŒÅìâ üáC\0€ÆÜó ¿k9YœŸ‡Ò¦Mò3Ïü˜W­ZµÈó¼¯D"áQ;ÒPVV¦[–U³nݺºõë×k½½½Ø°aCIÉd2™p]·ƒ™“›Ú‚|Þ+.†X\N=A—ð­¸äâø6RŠbvŒººÖá¶¥·áÔ©Ó•çñM¦ê–E§ ÃH477+Ó4óGeÐÚÛÚSÓ™¥”éå¡”ºrÒàò‰%fyÌPÌPR"çf15•ë¹hjXB]]]\S]¾¾¾¤RãÝ ·c±ÿD"†ÂN&“8r䈣utv$R©ñ9¬dB€A@ˆK(Æ`Vð<‰¼çÂusÈç]xž)=H¥ÀJ!Ÿw19•†¶héÒfºçî!=1=Ñby6;³QJïh"Q9bF´µµUè¶mCâÏjsß°˜xÎg +H1ƒ•3ƒ™/èPDÃÿ.^;žƒ“(•ãË_þ{ܺp!¶mÛz33vßtÓÍ ³Ù“™£ºµ¡‰Ò,à+àø)D~"1Äð…#Ò !fÍ£³È~×b”ÀÌPJA×5ÄìrXá2¤'Ó¼}û6>ü*Y–u<Û0tCÓ¢ìyÞ¨nÇlhºMÓæfw!Û…ðG%Q€+Õ‹F]Åà€—"€d.¶YfF4E4>p`?mݾ•4¡É²²È÷>±áþe2“3;RÊÁÇ{Lê¶mCÓ4ˆ@ ?kEPû_úÌ‚ èfCra8c_G àˆAìŸÓuÑH‚ÿ÷«Øµk'½yìÍœþ{ccÓSímw¼=22ŒP(4òðÃOÀ“O> =B×õ9J *‚‚Di ü[ò1]hæ9¡ef! …aèΟå­[ÿŽ?)å+Íï{ÿw[ZVô…C!95•I†‘îééQðôÓO£§§³”,Ýœ„(…]J(uŸÞ_D +@g{Ý0`&¤”¼gïsô“Ÿì€®ëÓ‰Då7ÿ®çó? 1³ `hãÆùÝ»wÛÓÓ¤®Ch¥ä!\ÜêJ€³JÏ,Ra²e3 t‚¡›€—_~ {ö>OoL%‰éìXóOwvŒŸ8#,Ë]»vmºpïM›6]Ô»uÛŽA×D1éðkVXK°¢'Š>¥ÀÏ~‰a0 !вŸ·oÿG:{ö,tÝxñ#뺟\¾¼uØÐuOO뺞Z½zµ€ÞÞ^tww_rÀÐc¶xR”œÅ\ÌÞbí#€ ƒ0‘àÙÉ# „¿¨™™Þ³÷9úÅ/ö³iš£ .|â«ý?Þzë´©”rœmy‹{èÐ!>|+V¬¸, èQ; ¡éÅìF±(«âsZáùF)å_Ç” Ô&04M@Jɽ½/Ò¿õ¾HçÆÇÇkjkŸyèÁ-;—·,Ÿápx̲¬‰êêj¼öÚkH&“W5™ë¶mC×D± Ï)¼¤ Xø½œ|µü÷0AÓ4º"Âë¯áþó)“Iöí_|äKOݶdé´‚R©ÔŒišçª««%œ8qWýŒ£ !üpž,(FB€$CÏJ¿§û%%]Ó166†ç÷þ+<¨,Ë:ÑÞÖþÄç>÷…WÇ p‰h8 ÍÙ”ýc@¡ ˆÀ“ŠÙŸÌƒÁ—˜@ÄBh°L¡PÙl–÷ì¿ûÏßÒôôô@SSÓÖ/=òèX¬Ü ‡B¡Qi"âl6 ˲þäGZRh¥Äap`ž=nV¸ ш xåÐ+¼óÙ”sr˜7oÞ¶o}ã;Ûâñ„€˜9KD#T¡àÿ9€EH´‚'•‚”ªØ ÃDy¬º¦ã­·NcÏ Ïã7ŽzѨýêÝýØ×ï»oÃqf3sžˆÎ !¦®õ^¤ ˆÀ“ФôŠpV¸ çϧø…}{ñúëGÈ“Þÿ/»}Ù÷ÿæ³=Ãá°ÇÌa"cæ4©BÒÍÿ®¤&fyR1bv9ÊcþÆÃË¿y‰÷íÛKRITUUû‰Ç¿¶£Ð˜˜9GDCDÁ¤È|Má.Jœ‚'ožWüÆ›Gég?߇3N<ÿå_Þ»á;ím+‡˜¹,Ø29/„˜œ ÷n– ƒ²CCƒü¾=túô)]ÿ]gÇê§xàSojBSÌlBÈ wÞÞ­×,%u¼ô›_ãÀý ¢l}ý‚Ç¿øÈ£?gf-P+ODïÑuÿw‰€…š®kØ¿ÿg™ÊDåÞO}ò¯~ÐÐИ`‘à<¥ßMß] RÔÖÔ¾D£­uåÖv­;€)fíõ í%·•RMD¤Hf6‚A(`HáÞå.R2¨m€FDy)"š¸Q¡½¤’Ì\ ÁÌ"Jª¾gà÷>#Àwé®IEND®B`‚ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/sample/2.0/vid-panel.png000066400000000000000000001243261511343406000260420ustar00rootroot00000000000000‰PNG  IHDR0lt"ˆÊsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ V"¶™tEXtCommentCreated with The GIMPïd%n IDATxÚì½KÌmërTcž}îÛv|åW!&†(<중ð–E?âÑ Ð!"tô=D D‚D‡=$$ˆ£H)„8(¶¯m¢hX !‡Døqî®Ac~U5F͵Ï='Ž„ÿ’î=¯ý¯­9¿ù}U£Æ#âíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^o¯·×Ûëíõöz{½½Þ^ÿo¾ðà÷ó7Àçx{½½Þ^o¯·×ÛëíõÙ_”3üíõöz{½½Þ^o¯·×ÛëÿÛ¯/ù+WDèÿ ÿû›öz÷ë}ƒûýÿÂïûÇ~ï òý>þ8>þø]¼{÷.È·¢ìíõöz{½½>ï Ÿs‹¿ÛàÓW?ü¹pm#ó.ŸÒlŸb}Nù Þ`þˆˆ”¿ï?Î\ˆ$Á"ˆˆ‹ xŸy¼2@ɸ¿?ÇùMÔoAý÷8Ÿ€ð0ïÔ~>7î/Œû÷‚çJÿt#÷g ÆuÝŸ‰d\ý¯@dÐÿžˆ ëßG;yß½¶Û›qÅýÛ¨"âüs½ÎçŽõßë:­¿Çy÷o­ÔŸ#ŸüÚ'ñ«¿öI|òÍoò¿ûoú/üóàŸüí§¾Ð«Íõ–¿î"ás=*ÿóÿò¿âoÿ-ÿäŸüÉŸúïÿú_ÿè£ë÷¼{÷ÑY†ó~³ÈÞ^o¯ßX¯o]Whçÿ™t2>}Jʽú“Z;>kóXïƒû˜Gïùþ÷Æ„ÏñyŸŸ«6·½íÉQÐÿ?§Ö6±ß×JNÈõ{çð¸ßf>Ëü ùìçÏâñ‰ž›ÿýÆu•žŸ®7íý{íp Üô{=ˆÙÓ—ü©xy¼ð´±d.žï|ìëþköµ“¯/?\=nñ½ŽöǨC¼îM­çŸ{r¯Çz+Ni$D&ûhº^æz>†˜ÏYïÏó|@ ~.ä‹PŽèZku7s'(OX8g›®7ùluî‘øMçùœïtÖgÜE_]ó^_@0ë3íÕ6Eë³D‰þ.ÁS›°ë¸X;‰ˆ+ü”Õø¨jê;Ο|òÍøæû÷õÿ_úùßõ»~çEį‚&Ï;T=›¿žBæsíÈßøÆÏþ+_þòÿ­¯~åË™Éëÿ…ʯXâËMÿõ_×-ÒÍAwè†ó9ÅŸmîç§ý,¿ÅÁõ¡ú>Öúâw¬ ª7–W¿“Þ®úfÇé ÖwêMª6ª¾~³1ëõÄiú­Î¦¼¯¹opu%2pï ²v0>¦+¬.nw8z©Èˆëªu¸®¤­=;‡Ãµ"ù,ç²%^ÜùËñìôç{èaëEÏ!Ý*eDz[©ÿ ·®K—ÞôÃ>« ¨ï!Ÿ|ÑUcÖØ)pêƒá@ï©úq¨kèÑÃj¹9÷´ßCFwê}àPד¿?Îç—zÁ~{ÿ¾^_û(ߘÞgùî`¯y_2xbl½&¤080ÄÊ\§^É^¨¨g©ëMØ?¿ú,R»õAs«žÛyPܨÇy&{mÙ¶‰òü!Ÿƒ&Ù^07¬¸ógà:ןRWõš=¿3tÿ¢–ÏF¥®“,‘.à÷>»WMøí:ëh­SHhëXþß84Ô†úl×Å_þå_Á/ýÒ_ýÏþÜOÿÌøÏüþú?ˆ/Âåýù«1ü›^Àü‰?ñ§þ©ßüßõ}ík_efây@ÊFˆøìò§ïŒº­¾ºâeÆÏø;ägdS|v¬!‹§H—6ætr£A¿ØÜž¾SeóPÙn?À1no¾‘g1ÖÆÀµYÞ²U`«šFoœ¾É…AË~°'"rEµ‹]gðágÍP xB½è:Äl:Œ‚šï÷»b YB¯ÅºÍs÷Á¹Àoù}¥ëÔkûú½g¯«NO:§FPh0}/­Z{”µ~þ©› ¬XˆëÅmßÏ)½˜ÑÎÎ>½ˆ˜‹’§x€]Ï^áð¢Çﯠˆ½[þ!X›Œ¸àß}hJÇ/ßø’ ÌOÙ'ê÷ê!oŸáŒU8Ϧ¿F:˜Nø >ÜÃ<±,àqÚµíbcßh r€Í½ÙOütõ,õF(EUÄÆ¹üèRŦŸ¢ô¥P&m5ÐIÐY›¯¯úœHÊŸ×qÍzVö}Ñ‚L MÖ¨¬®–l ‘õ<×UÒ%Ï'¬¡Å›63À]0]ZS¯zF÷ß—ËùU¿Ë°R7 =”7QÔaÏÀ^%3Á¼ ÁB€ïß?ñæ/ÿþöŸøí×uEf~rŠ˜oþ2,`~úg~&øþKñ…/~ó_ýMßñµól¨ÌSÑ×!Úñ„”§y4Ïfø>.9´Ÿå½ÙìªV7¦ûï¯ëÌ]Ï‚»Ö±ôa¹ Ñ:ØÉ:Œ¼òmpÕñáô‚UZô¦ ·÷ó’ñ~Ÿ«»ôiú)‹_@íøž›p(ìÉ×põ‹„Aä„/èú—ögöÆÐ?#Å‹¦*l®© õ¸î6¦6ÿûž‚ ÷LüêF –ÚÈR .¼øÂX¾áðáÁlƒíq6ÓÌ3î£;Œ`Þ›1¼!’¬Îµ7™û‚ÜxLÍŽïéx£0ë×w¾¯Ç=ùŽèGêînYÅëé2{—ªN‘:M¸Ÿ¦µ¦ìL”£v»û_g»®ûrn0CŠ(ßT°ÆMynŠŽyzÝ(úbêêï·[m?íèìùÅõ¡¢l£º•×þ6ëéÜ54L¿Qå%ÔÍÓαçg…O†PèsRoqyƒÒÝ8òäõ]Î? òųNRá3ŽIÞûi¾Ã\kH¡º÷™ºK×ã|V ×ÙÃhoa¿ç1öÛã*¬Ñ{_Ù£FmÍ®àG´{ýÇ£ ë•Xç_íyðæ’‚¶DÚÝX ‚Tç¥ëƒt9|±÷îKßä5 +eÏCÒ…^Ç༧UW/qÌwYgP8.ø°GÁ¿ü¿ÿüðüÈ÷žÿúÉùß7?PÈ|êëzõ/öç~.þîßñ;â‹_Ê÷ßþm_ýCA$"y®-yo+<Ý×]ŒG'3ÈS”ð>"î¿’<0Dâþ¬iðjö죦Å~j×eÎbæÒÂ:“è¼wæ‚ÔaÓË:² ¡È{$û‰Çù}IíØ¿û=É<6åÉ 4|¨d>q§zwòÉL˜.ʤÐíŸR½dÍ‚ioÄþ™:Ä‹°Æ<×’y®û<ü$©Má/÷•È› wVrs¾ßýþlÒXÍœy Öý¨Ù:e¤w„”¾~Ðy6;ž3Ч@¹ÿ[zs)Ÿ¥î!“RlÕ ‰s8°Þ?Ï)ú”qoF 2ñI='ó¾vq¾û¬ÏóÌéHMGb½™³‹žï¬E<ÑùeœäùgR• =] ÚÚOÖ¨GW!§{&}<+Î;Èç)å4Rïö$×uWM0¹wôP‹UV³‘\ßeþüWo ö,œ‡Ðf®âµ'úSh—}ÎÓɱÆ5¼¹¹?“¬ýºþåå]ë²×l5+µ¦¹¦=÷Ì¥+¡ïŒ½ºç¬ûXïɾ¶þA-îdo8ûÍŒ»fõÏz ñÚÛí+0äCuº÷KÛ;Sƒ¦œúI­óçîÖ#Ÿ”ßwÖ4jR@O4séÅ Ö3NêHgVʹ…àý]©ë|Á9Øx§A=„²Ïß_#íè=K&¾û»¿‹?ÿ³?÷—þÈþ÷þÀ¾ð…o‹ˆ¯DÄ#â ‡'óQŒréS_=—ŸþFü•ÿó¿þ¯ýüÚW¾||ôQHÕÄX]µ>Ø€@æ»×«zu:AP´¹+rۨ˜¦¾±»¸0’Ûl,xp ¹`nÚ˜ک¶mØ Ž>¼÷¬òÅ—£w‚Wu¸i3ž~š’ÂÎæ&FÎH,Ø6”û!0r}&Áðg‚°‰¡2úÃ@ÀJÔÁ >IkvÝ(©­Mý®èûS(tã ¼sæ„Ãকp¤‚óÂȶŠö„gîõ N:GŸÎêô:°6‹2ÇV…O(ø.úàc ì zµõŽÐÄÌþm}Èø¯»V]Ë:”zåÐà!#úÓN{^ÈççNƒ„¬ÓiÎÇÀ÷ Ó“?T!Ükih¥ãži#[r’ ¬Hzнd?£ŒDωušô:¢‰éóÑ-œiTQ‘ä5xªÏÛÏøA~®A“/èkŸq¤Æ¶‹Ý+º,HÅéE|ß]3énøŠ¬îä³.û{©u•ë™Ô}‡ó×y§l]>ö/#\Í/ôŒ‘qæ=Q }ÖvqËir1²ºŒ³îû¿ëèÜ阘ñ½¶EWúâ>æoý­¿åǾïûó/ýøÿ—?ÿ)*‡ÏWÀüè?ü~Ûßñƒ?ø+_ùò—©ŒŒžBwZV±ç¥|ÊÔ×%„©Šç†àSŠ· úÂð9ËÕÍ W<Æ/þ´8#‹càUÐBU´ £Ó¸†x~¸-¾Ö+ö7pÆè™rpÍa6]Ø/ç!vÖÞ'<ÄÝg]†Bò ‹yH†”Š.EB½ïs:#´„ͨyéÁsº„³Áp€‚”y¡Ô$JUEèJ&m„ÚïÂ)Þjø«nzŽþÊŸ*î|†ãÁÒêö_Ù·âk¸W÷ØšK‘¤½R ç -š/yun+¯ |Mˆ§Qƒè°P+ëÏR†#ʉéuDç‹Z-ë˜BXgp0R'¹eÂÑ\@G‹¦Xë=^Gë mÊ(£._ö=²LA!åûtrqz=có…¢¢¤ÛG˦ǯȼuíÚ~rÝ‹BŽíõ“)ŒüZþ×â¸áB‹OÕn̪AïK¯þ¸JÐ×OKigŸþOøT2£Òg ]ïøwý?ôcí¯ýò7þìÿø“qM„>æñ¹ÿŸÿóÿâW¾òå—LDëÞ¯™ÖùÍ×ñˆ„O>H¢ý(¢.äuÃÝÂÙ—Rn€ó;!PWU£× ôBª~”„ÔŠžÅ¦;ð‚Ñmʵc@8ôÎïÂÌ»ƒÔ½~œõL^¼!x膳uúçç 8dŽšÎy ã|péP¦ DÁÏë:B4ö®lãéäT®‘Òˆ}~ÖGõpy! {ÈüðDD/=l•3`:û_–⥛wUÄ™3kÇ+•]2€+RTU‚ÃÒãYL¦€RtwRqßÓÔBÿb )2Hìç&dnŽuÿ…!Zj•Kö÷(ô¹ÑûØèèUS¼Aš·Ñª¿^†-`=­ÂpÙÀ‡*B–Ýê ªÐ€Oží VûÚƒ’F÷U^œÂt+M’£É*äî¦)änÇç|xU\³.8{뵎lÛÁëãæa]X×¢”KWïUEϸzoÓ5I"pe(¨Ñè펜ުؠáÂažÉ¼hâæÀÀw„*ÔNÞ½ý]«JqM¤_ãËMÞ[ß*²®ÂíÙÐóé‰rBø)«éQNåÐ83ÜAíÃñ [Ÿ}UöïÅÀ|Á暨Ükä}î&Œ¾Ö{L¢•\`FÖúÄÅ_üÅ_Äß÷#¿ówGÄ/GÄ_?ý•ˆøÕËyÿ S6ÌòÿD|ãg¾ñï|éK_üÃdbnôü[gw=w!…:ÜÚܶ˜.TÑÅy+ñ˜'Wåž]fWìù Á«}AzH!`¾€S9Í­ŸáR ²„ÏtëÛ¦pwÊC ³»Q©*ãE×uª• 'qÍçG7™µ´ê:€òp'}l$s]E´Bæà ‘mäá5R‘¡ç³r÷3{-Í©k‚‘pފοIç"€ôâ…|9•›ÛÅéø ÞXÄ¡`öú×ÓÌkñF©êÞ¼´…ðŽuÐÁEô­ç …[ÐäºÃ#;oo¾Å«C›CМgêiõQo0DÂ@žV»Qã(ê5dÕáÈU:Œá5éÏq)£ôÞm@Ÿr«höžF漟®ÛKŒ»¢\VçY¡hÚ.9ÑÞShøôÀô©hòá+…¢g,1ëŸÂû.—°ýÕü=ú{§ñ•Ÿ (yäÙØxK‘0}¯«ÎÜ$ß8MPôHÄ8Uç÷%¼|LõÁ×ÏŽµD¬‘‹oTëú~¦Ð#Œ>šs'Eæû¬¡Œ^ÍÞ@þ4·JR÷¢§l½×} -8ê ä«5KÄâÜ®gj–/_0ä}Aá*7ޤÔïm®ŽìiÇÓ §Ÿ=›â×U{çº'ñ]_ÿ:ÿØý£ÿÍù©ïˆˆ¯©uqb>ȇù("â~á‹ßý{þžø—þàü/¾ðÅ[¸€ÀSû¤o<ý¶¯‘‹Ý@úìpKX#ü—éT}!7~·Ï:0þTK¯ÍÁ‡ R ïј¦(.‚¢Áõ Ðå­J/nˆUø ›5Ò³_E¥=Q‘ÎDÉ`{RˆL0FºYúFñ”eÏ%¤ÝÑH\µ³Æêø_(§”Nx%ÛŒÚFq.ò'Y±6°¿bš_Œn«reÅ`Þýø)æŠWì¹5^ðP²p”D®îÆËá5\òþ\_Ë­±8=f·èóåTvÆØ”u:ãšÆc^+Í—øÊOJØ]¼=t K!ŒsykPPÏk+ ª³%ã‚´½¤…†Á*»¼ÎðzðV>À@à]œd >èRÁE1æÒ “ÎWc,•^!ëa‡³ÞÁ*ȀŹuŒW Âëy²ÒœDFWÓaºé Ù{¸ˆ]a]Hº¢ñùËgµýaó/áh ž4cï/|Óv6)#€Â½{2y¦ßƒ® ìµ±Gj† ï±ŸN0ð÷ßÿ½ï>ùäúÚŸþþÔϲYñ¦Hz‰ÀôÇù©Ÿú~×w~3‰§toOæÉ@À.èžþè8ˆ/YÓæ+yö1ê…2ÆaÎÅÀS9G—J z±âgNEæ²®žââÜÔ}èÈÀv y`bž¶ 4.s=Y—âJ}lðÔc¢) ÛÃo^Õxi™¨ø®ŠV‹W)÷óù`óìêƒIx+T& <È¡aЯ8yöõâÈÝ«A¼$·pþÅÓ»­Àmo¶¾'¦¨Ž‘_7ðÝΦ/x}[ÇVÏÃ5Ÿû>@ç—(„¿æ£cz¸Cl~u|B7ý{48Þ<˜Ð&ÃÈÁÑ&lxÁÃRÂ-K=ß9Õ£J:õë¨g[‹1ã‰íφ]p-¿{L¶«ÒRêŽ$ã/¼˜‹6ù¶eý»pÁ"p¾*é÷’}íÿb=ŒƒLfnö[ðñÂÒáU*¦”X]ºO–¨4vp¤òzÕ´}êÞîÊéÝ•HSs\¯íKÓ¼L…ÞÁö;Ñ[ßðjJ¿U¦2¾ ! ûxkµãº?ʈýQT¿rR~õÌžµ›ánCÐEŽF0~á/þ¥øûÿÁàGÏÛþRDü_g¤ô+q;ù~3ÆÁ—ÀüéÿþÏ|ßwÿ-¿é_fÒ­• ÍMÆ”H«n¼ÚbúŒºŒµ¯$ɤ/ìU%Dß1ìžâ23.šÆÝYÆ›€±¹:o³„m.d¸Ýt'‚áYìÐ5x>­ŽºŒÚDI7÷ 5ò€Ó`Ìì)LnM½MùUþÌ\ä’êf™@oÆ,”Wˈk‹ÍT·B:”K—Ýn“žê¢(žZä(9ÑñèÔºÃ:…ÓE§žÏ½/º²Éq•œaÊ…fy›‰‹A »ÕIýÅÛz›ÈÐÁˆ äêã”G"J †t |ðê÷M^ÆËåF‹êÁSs¥ý^E´®¯™ÑjPÓ=%p&…Æ|«‘XQŧðÂsVÞ3¬sœ‡&‡'E¶ýˆ)YÊíQ6¬yñ<Ù‡»ÈT×xÊÈÒ}§´ ÖûV—¡žÅHPQ#‘² Ç%#û^fD\ô©òZÛ ο É{6?nЗAÐ>Z>eŽïŒ¶ä}Tøþ~&p XT@žMvøgÑÄÙ₽,ÊË‹GdÓÃÏ۔чË]t¶ýHîÒÆ«2ú5Äú)äÛJ-†ÝðRâ—td#ÎýLÉç˜^í´˾b„#¸y1ÀËŠ‰A9qäÐÛm °Ö‹¬Qõð)acöA3ÎïˆxÊ8ÍÊA+9$ØÍ"PÎe[T#‚ïêHúÈäz=W;ÄÕcGµ¯Ð ‚ Õ£þf@HæË£zyòfI·0Yû¹oæ^ã¯ä 2È8«Ë¢#PF¼Iå<Ñ…鿦î`,H|8µã“O~-~ô÷þCkD|{ŒCï+ƒ»¾,ï""¾ç{¿ã;#x¾MYB.½¦à…L>ƒ¹Ê[>Ÿƒ¹”1Ogeôš]˸Yû(hª™ÌÃn•¦vô 7é¤Ç7cˆÈÔ®]I}—Áþ'‹0÷”ð»2µ„!£TÙÇØô.œsýtÐåï-UñáÈ%ï6 —ΔUUƒ}ˆbÒŽ{T”¬¤š¢€aD s­)][w8c~Jã9t±ý¦"æxp$Çâ)¾¢8Å~È›„ ®îòŠ-ÉfEâFÙ=]â‡Å8×Yco±™|fp`£) ÷óÆ"@;wçé±â$i;ÍlŒÎ*uÉ‹|Q•\xä"Š.ObF’«|äˆÅ(Ø›œçÌHídzoְΠ<õÝ!mR©÷gg^S`“üôpòæÓa12–‰¤{÷ñ¶ŒÀx6² ‘|-]ƒ± Ù ÍâûÏ)W¢ ¡]«|†È@!ÀzšDîüšM–§ù§ài9°•U«»‡Ëu¹fbž4-.D¹G»E8ˆLˆqåŒÚ(Èv¬b㡵ÚÌ÷Õ›éÜ V¬õ'äË9üÂD(y#ù MÖ¦ÝîB…ˆTB*\jÅÏt[ çšKÅ•ÎK"½>|œgM‹‡;ñð+ÂFãÚET¢;£ÍL1§1KJðæñÝ(ÕHÿ7g°Iè–é’&$÷º1!.5•Q ^ð¦dö¶0t•b°¹gäæv©;úëèž[Z¨bóãwïøƒ?øCÿøÿÏÿø;Çï7_ 1ƒÀ|~DŠrL£ØçþR™·ÖŸÒ5^Ü×giâÛG¿Áu®·é–vª9±Uªf”äˆjï 5¶iÈ|¼VRa‹gŇEH3OäsDr¢ôT"dC± +‘ÙöŸy͵‚òÚ»J(Œ^¶Ü'·ö´É²ŠRs¾ÿÌ},t,µ´HCç.1P¼ºH› sQë)þUv>íïRùÕG>œÅì28‡ðÉ´m’ËXÎCh£ˆ0B±—eT2{Z&º ¬ÄìÁš\ÜPSýX.í]§ „>Aåi&Xž{rMÃÕ×ëæ)m˜‘×ù!æÙoF‚ÿ(|IA"µ8.úD5aCÈ¿æ2û\åIÙîÒø«ˆœ‚ðÄóF( í¥PV™ÄÿðßˈøÚA]ÔæWÏ¿kNÅõîÝ»¿IYºèÖßa\•0ûë‚þœg·$Á§iålNÙã Ì&ù ÖdÐ gJ˜BÛõ©òPèñÐ4‡Ùxc†Çüé\¼3&«…æ´:Y·vÞJ(oƒÅ¥.âÞdË{ ç½°õþ”ÐÇ%IW”¢³Œ„O©Ô=þ#¥#Ê•/óÛ!ucŸù|rFNÛíµ=0B²f  yá}:ߺöÑÇb— «À+¯Š”°îÙ›o{í gΨ•”¢[‹®|òËÏÄ¥£¡v~’©ät=ŸžbMSý…øÚÔ&–¡Þ8Ê‹râýÃËvgÅè½·gXpz¾Ö–p/;E7¸1Á’ic Ѝp:7zc %!ÎsÌÚz­½÷plÝ3ÌVÍçÄÅ-ÜûÐqÖÙ³¿þÜV䣛Çý€ }"¡mÞ‰RG9 ™Æ?QÆÉÉöPâiˆUDã Aî§óèÄ·iÉ…ë9Û\±˜„]̾Xsê\×k$ÅçÇ„Zl§iE`á _K‹HÉ@Sehó•”÷ÔyVÔMgñõ^œè=Ûggd!3 Ƽ†Jå˜;!‰A)–áõA™—kÍø}”ýsŒ(D¬0×ïû¿ï{â·ý¶ú-qg$}EãWó¯<Œûá˸ÿLØÇæn@‹Š\³½œÔ]E{Ž&Y­Øiã”8U:¿Âë8„Ëúà Üsùȃž„yùÌdb¸ ©j¨x‘Ó±aåt9üŒVU—t ôÎÈãÌ ½—5ßѬ¼$õöŸ=ê#SÿûRDüßG9ýÑ!ùÆ» @ä‚êƒÖy§ÜØ€ò¸ìÞÃuí}±Rôßç=Re¬Ò½'½èE 3MFÜrÁ#©B£ú`丑‚±Oº¬J6„!ÜBœ3WJÎеÐF@r£s”+Ô÷ÌéÈ2e~ºÆO·õúÕ›Y 9áX£­ïN¾@Uœ¥Íê’+‡Ú7Ž z€ZÎG p”8aM ©Lˆc§.dx~SXD£™B±iç`µr$$0Mè4f„,+ìl55Åyà ԈûVLœQÎMXOá *uÚ4 [• /ÆZ[rä=2®³É¼ï‘“UþN ;ß3ànž½.â~ž.ä©gTØ`Cf3«€$<ö %ïuÃ3e6.jÛ ½àß ‹ä2áÃzÎ#Dù“ãì+ÏJ'j‡¨é(±2ÛX 8¤A£†Y×ê³±¨ƒ‡<ûèeî*Ê#›X„Û•ôŒpçf5»TÓåEå® ×HÍ‹¢§ªlFi4žJo÷o©±Z€"«ò¼'—dìÝðܦ ˲ÅC‚M35¹´EÙŒ·’Æ~Ø9Rèn @óU2xL%@B ?ÄÍO)=s‹SåÇ}yÎJ b9"—ÉM2à¡Lµ 0ÿ£"r§pNÙ6(ÞÆÙ%Csp¢0Ý´ºð (Êe›t+pö¯/}ñ‹ÄåK1IÕ_ˆˆ©w×ò/ û<Èoظ$ºÈpø Úi2Äë")Ö Õç bUËG’tfº¹È3/Ñ»hêòvÌe~ï\M@êÅÞ~²[Ðß¶$yº˜z¾Ú¼íëR2]!Öö¼pr%ÒÜÐJ¶¼+‰ÜæFT`ê.‰”0fDLÓ×uÖ”›ˆqñvr%©:‡ªœ+–äš“)ÒNF^¼ç1—Ë Z¨rï[ÕwFUÚícº‡â.Ör„ݹÛæZ2PiÞ1R`Å”¿ƒGIgΫ—Õ3­ÊööpCu´A‘Ä·z &ïÎ>(iæ]©´þ\γڙ«íA²3~±©±¿§[Ð%³ÃÔråX–ç@ñÙ¡¿4ÛdŸ£GKlò2èBÙðè&ÁÒÕQ¹z#¸<`¤H"Wê¯X¤D£¸Ÿ–¨îNN[æw4¤ù°Œ-À¹>…t†D’4/#ùû­ü 2ÚbŸ ˆucL9t™ ÉÎæ»uöY!0À͹IŽ ½?d‚!æ“étöþäüœî“Ó¶Êl…T=Þø[)ùJõ ‚‹ûa¯„E Öx¹“¤§hP…ÚìÝ}¡ù~k­ÃtŒùL”-»wµŸÔí>ÖˆdÝ 3!ëïã†L1²™3ýjJÈ»?þHŠ–/žÿ½抈÷×u¹\¯7,ˑё¡†3NÂGÏ”¦?‡æŸ4ƒæ¼‘‰^žbFä1«ÛÓ –áB¦WªF|mGÜÃ{P8XŽYpX·ÇÈðàP‰+„J3›,,*0‚¦¡¢Kuc5×"—%fÎÝŲÊs~ÊŸ3'Kí–¨–Ö1(Z¿vîD[é¸ÔjkzÖ*a†HåʈB‡*3•zU™V-G¬¼(§ª*ýcrŠÂC'¦Wõ“BIœØzM“&sqpÔ¦\x’c””’¹nûþæZQPQvgVˆg.ï“›#âÙ:1°ét¶ÃöÂFUBkl:¼3åQ]mLȳCÖAÜp{5-`¯!]Ëý̘7%½˜ëñ®\Šõ»(šð˃ÎñAÕ"<ŒÀ¼=Œ+€1òD“ÐïªáRéqAçy´%øV„¥-™µÌ‘÷RTxê_Å!%LY£&ÜÁ>Ì<ÆAŠæÂ+°Ð9 éb %ô\%Ï3¬di¶¹$4‚ ŸN¡G=èÏÊ‚ðXЈf©1Óz˰{+Þ'~Óã:ÓùHáWž;„s®d“h3ý¤x©5¡ø ºlU»ÙjË Ép£rFà]ˆ„AÛ®„¤¬šðAOzáÂPŠZv“2ªf¼ÄÍK"]ýt Õ®ë£S°|,ÈËÎFÂ;*ž‚æhöîîF9%­Jˆ ö…"8m§"¦ÊâÇð¸ GA‘@¦d0t§ÛdVÉR«òv¬j}9â*¬'¬{ý+ÃI…˜ßž\KvxØÛøX)¹ÊÎ'NÏÇÐÒ jf7„¬˜"ÇW%kîÄPÐâˆqé„$»6÷d±²Òú”¨†Ív€Æ€‡ËRýt-¶*—¯Â´TQ£.†&Õ†€ÀZìÝðô +UØ•¢ªŠIÃsòÌ¡7¤©x÷FëFƒHt¸ÜöÉ©çBZ³©œ0¼ÆWFnÖÀ@ÌÊêñÔÆ]‰è”ÍN4?“Ä‹sn´NrÊó¸aäö-Ç™Çdzr5…TÌWV猇R'tÄ\‰÷éü:µ¿Æ!„ %.âÚ|rAúž¹£e‘‡(ŸšQ„#1áNÁ8êÃ…ì|z"QøG:Ž–&ÊóÄ 4büàTDA²±”_%þ[ÃÅ“ýÈFÒ°ñK™ˆšmÆÙ,‹¡™Wa’jå×Há°^«áÔ}{çÌ…¬Ý\ã™>ÁlümrÒÄò<¦†ËºÑ½´,y˜G*´xxØï6 ìõŠðTXGa}¹ãhq}LC[J£V!£EL¼FtŠ"ÁKÝóèÁa]ýÕŸqOš ê Ù°”å>hÖÍÙ¤|¦9ôâ”,‰©}IƒÊÕßäü–Œ•~+îœkÈHº;žo¸ÒÖìVPö¼È˜ís ©Wµ²¦Ò0% Å YF Å.O æK‘-£Å;–ʪ6÷–Hí…㎒ŒWfUj"ÖD­Ac,‡\öÞ9òô˜ :CŠ\çîv O„C@ä" Tg\½0f›“Ñÿe7®tŠñh˜ÃrÏ{§N—ÁÚp¿îª4ñÉ-M¡ɆJrA…?ÕE!ÄñŸ'—‹ª8{ÎM¬g˜b û0ûë0Y.!‘süJŠë„Z›kT)(U53©^fâ‘4ª&ÉskÑBŠÑàuï'be K@+ýû B“Ç÷¸Ë„“ÏÖMhô›×$³€óùƇ*Ïs;æ²éϬø¯Ì½?Å´r^º^d»õ´Mתæ®ÞóÓ‹\ˆJ0«ÙÚëS…&÷¹^üOˆ«½Ôñ¶È|©QÛëïÑÈY¼áÞ-%¡#› ÓEFê—„„Å¥Ì Ç„jˆDãå0ÅKŽÀ9ôÆ˾¹lþÃÇNôÍ€:îêHŸ…v¡‘â±r¤Þ„J?ñvP3¨S°•5Ò›™òXef¼âiJQäÉç‘ú¦zv¦î^n™Õvƒ u½E#uãš;œ¬î]ˆgÌ£É'4…ÚBźŸÓŒgÚ¡¹í4YYѤͣ(2x¯fxÎUyÊȈEHòð«®7ï*7ø›gï§ò³”“Àm›¯{$ì÷î„xIß ZsôÄÚL9_§0¨¯44%§—g°E#]¬q&•7bàŒAµwÖUÐL2+¿«ÍBRÞèäJ-©4B( é{<áMÒÏ[iõÎOˆ+ÅqŒN¡r i÷£UÈÄ»±gã6­¬ ϬÐÌ7mÒLH“…9ÁN6¤´§[Ó~•cé!Uï5¨Òùù /lõ†vË9¡dIšæéñ’D/¨”.#LlÊt/ËaAއÇÿ¡=(ì,à)VKÊØ(%—ŽÅ‘q¯£:®TGãÕIô†®#8ðAð„¹%¢LQt^‘òRD¢Éxnb¥SÎÉêô…øM訂°t“Ժ̟ÖóaéÀaòÿT鵎I4“JºïV¥T¸^¾ñÂÙUbi!ƒçÈùÞærͧ XÃ:»T‹( TæM3a°¤gˆA8M\í+Ý<åÐ(6€Úk ¦¾¢pa£7Go[Nnþmx¦Ê÷×)|Ré‘9\W4¡ÚY^+Xã£8LZäµÚ<&kƒ,¨¿ÏîMŒ*ZûЄü^ØU1¹y±O7ÃFe˱fr9éªC§NCç œÇÕ<îo±›‘[€Öbqcº]˱Iš±äÉgƒî¹&éµS“’séã.ã"uU©#5“Iº>>LäÜτ¦¢°@Í’¢6øSÞÐ:í᜵… i)†N#4?+–pª8ü«¦_²pL®t>K:/ŒXî br©ÜÚ{©1õ³ÐýUºÐûþuÓ®âs¬”aþKPo£•¥¥Ü«AQ¯)0~ ±¼Qê¨Á‚¨(Šô}üƒ¸¤Ÿ’«•ï;åöìÆ“ò¢bsGb…LjaîÛ#ü4¥¬YÈ# £Ëåº|¬ósÖøxöÄË$nšœÆÈ4¢ú ìÅã×TEº¤ôO!Pê{-yNA|Km—†³Q\E\·B+¥ •ùbyûT%ÖXb‚r´U¯¤.š$œÐTsTÇìéb I‰.6³ÒlË(5¡…­¹‚Ë÷³Å™¡‡·*g %ÿý‰‘R£ ‰O-%þ‹\_MNÚ˜-DÄñ O"¦ŸÑö»Òñ`À¸…„”gCŒa#®sÞ{£ls÷xåµá5ÎeðVŒ¯†§ò†0ÖuŽ«3W>‚ÝÌ%K/·C6‰l/¹« TdV,rç–ZJ¬sÅuEÈ…úPæÊF:M9é¼{Ÿ5~Y©È£;»u¹‘âSíZHhj³ÐID–V´ ůˆ¢&Ï –QN#fzÒllgá)_‹&ƒx5ÔîwCÍȨ “2MQæÜ˜-¶&@{V•¹ïPÆ/²¦xMÛäŒ)£t:èaêÆs:%M¾‰‰ x;¤¬ÏŸ!EVÅ5¦…†Ô`™ü¡?F«ï -Íê:ú™à)ÞÎAÑŠq×lnîjÞý´:wÎGÿîÎ*@s“™,b«TƒÔ=[<;”Ðo~7~ô"³ÄsÕIùAaYP‚3=PMÊcÈ [Œ» v4œ¢¹›3fOɱ*>Ì3 n¯µãBz}½¿ ›gRì!Ë¡%ä)C!¡£«ºî›–Í¡KéÚëÌQ¸Æå1Aµ5Qçy³VØHPÿ®£N+µ+i²~3m%oDV9wZŸexУ=ªÎã“ãƒ/T[‡¿U·‚fŠåó¢Íi)]}?â‡Ç¼4‡CÉâ«÷åÃÆ1¶ µŽÐ•°þl=-É1 õ÷TŽÜë‚åÀçÄm†…O DÛåè0hç(ÆE‘«{>˜ºâ7ÉÙ1Ã’,Úæs]=²@|±í†9zô_Ì|OnVÇæÛ1^)w ò·Ê/iÀb<$ ít²>ãQ)!,̲×jN–ú¼ t^+YPê=Q©Ú§­j~‰:£.r[KûÒLÿe¬57æö¸Ì‹B=NsÒÄU)èÁ7a$ÞT·eJH™È”<;F¤Â¡éÕ³Y¤¨k²¥¯Ré_rÈ]kÖx<‹&Ìx³Bë:!=eleÈÉHÊ+ñu ë´ ¸æ–¥’…ã-q„“õÄ…´8[)]#¯!ÍÒŠ¢=f$€r½û;×ìð; \ÒZ¿ƒúy(Œ åwʵïÆëxvºR4hq'j8†[ #M.ûÆNVž–A§ð­*Ý7æ¹ `qU´c¦8z‹¿)EB©½^˾æ–ÖbÇ%ª´îÛtîéÕ^c§kžšéCݲÃcâõ=A^͇¤û9Qó¨ò’DoŠý9 NÈX9?2V¬õê…„C:AÕ©ª©áh¥R-Ä¥\CO‹ŽãhF\îâ!›ó´ì6£Á0ÅO;ûZ©6j|$Fxi¨X“\¡>@”ÑRˆbsÆ×ª Ôs#$m­-Yh}(_áõÃê®ôa.%Ì6™ ݬ<¶rGk›ü˜÷gŒ%ÛDHÕ)>¨yÃ>×L1Âà ъÍÍÈQ9a;K^r˜ّʧ›Œ'†‹@—¹A )Öá4¡9´J÷@°;Ew¤tašeTl*8{ÎZìñ„9«ì\Ò„E›ï8Œ,Øuë?ç2b”ûyàÞVV¨…EºtW³Êãр햔†Ì"%b±\o—™0ã[*g§Óšc¥ Gs!x|~.nþ¾ÀÖBèoÒ(®æ„Q¬ ÆáûVÕàB“!~C-¬˜á}ŒôX6”Qƒu£fKQD*±®93S·BˆÓTk ¥©½‰[!‡ÝÆ¿;ÄHÑJ([°!r_98•Á©ÈªFfb†8>3"û·æ·äøtUNÈ!oÅÊò¥ÂìM>í9õº‚åaqŸصWK•ÑÔ~Qq› FNlC7 r 4"£, MÂ>ó̰•›½R¬·S½r¤œÔ¼S(€‰èõCÝÕøƒ ±¾W6—ì×\äçˆsŽTžTý™œ"Ì"V#«£Ð§Û~Üîï-IãÏB­+ø’I‚gÃåŸq.`b<@ æz’èATç!DÒn–ˆ—ÎïK* 2‚y|µ^êÔg•'G» Ö<º ušç.sõšÕC‚â\™+é¦dtbí~šó Äfv".ò©, |14 %¡Ú5¢[ß+$ZŽÃ ÁßåÜÌ*3áöù{3b[[Ñó ׸øŸ,·ÏŒ‡£°´†•µÕå„c#+Ú#©ÁÐîÏ­ö[‚û3ñŒq¥ÌÛ'„O” D¥*Þ¨¡™9ŠrP·!ÂJHå©T@/„í÷ u¤6oœç®œ<Û`2GÓî®EÆ[×n?4TXVÉÍ ýKg¥¾‚–˜k]ÈðL¦®É×|Ôƒ×B?Œ«À‘¡$¥xùÜE0ø~™ÀÎVó@ZK®W±ºnÆ (Ü0ù¦FŽŒÌ; J¬Íwqø,1gü*&‚ÆÙ2Z{?z„MjñžJ8\ÆÀBžoÕ!Ý5\Ó¤ Þñ‚TAÑ¡iÉÖX!‘¥ÛýUˆºwÙ a_ûVu Ôú‘)¡k¬IsZaIV•€ÂtI‘G‘AZÌE“ÿ+]} û"5kÚÓ´Q¿§që:îa~8Xdž{‚Ò.ïsÖ… I†Î¬çšÝÇÐüÂù„~>× ±·(‹53sñ)¨¯ë—L™±ÙÜ·‚KLÆF¾¨DªKˆbaЉûØB IDATã%›¹“t¡«1Ü}ø…f¡ãºÄ÷Ä%›¼êÁÉ~hKÓçÍ$Û¨á%‰Û µSj: )ë.„Š5É'PO¸6–hüÆòfUJ÷20e´I‘_<¡ŠBaheè—€FœÔˆ4†Ž`‰ËMÒ¹°‡Ãßÿô>Ø=”3@ú¨È<\Õø/ ¡B,uX‹„<šê«é4çàË#QÞæJýDÊÚÓ»a펹.Úø¸VWò%®–MðkcH¸w‹:³ž¼q‚ SShp„Ì›á|Å’¤j¬xáÙܾ?sÙÞ‡ÌåcFd¥¶J•;Ëæ\ÛH_ú9§dÎÐr€ÌqU˜ízüj¶ÅŠºgöóv |vä*ˆ°hùPƒ¯—öñ°ƒóÚÔN=X4 Òø*4 g<èjå8ê[«¹œ¾Ú¶W¶J¥KvQŠX¾SxvV)¼ÆWd…ä™ÇÇ9дñ4˜Qº&•yÏ%KCc4ŽH1Ë”0Tê·&ÇŠþ º°ÎáVP­ú€aœ.ŒîÝt‘iéÔqˆø 0L{ØÈa# XªŒ ߣ~WPrÙ0£Œv¦Ó¹á\n‹z¹þ%y×ÑY†xæp{ÞhÊbŨӯ€6{"YÖ4iõô„ÒMófü›‹8¯Äj˜úerˆàaVóŠ[w8ßDÃsQÙg)<,jØúì]lõ­l¹¯æÙÞ/&¸"gF(o(Åöƒ"ó†eÎmÕLåŸA,Ú+ÃÍxÓdhf^„rF‹ÒàÞ<°Ï|GˆßDý ãÐ(ñ¹’Èã5FSg'0@,£Lå^‘æŒ T-¹ÊeAÐ Äd|%ލŸãçÕ×ÖÌm S8äó¼Qó°ùË cE G$iQàv”=.¤Æ*Ÿù˜©ú¿ë 3 ” !ya¦JW¸ÄÖF&±|-ÄXL¡0øçè(†ñüU7¯GsM'2}LŽ ÅÄÁÖ¼îOâñÑã¶kxJ’O2c³"°Æ|V±=‡ó·<=TÎBÜñ4@œwk’9›ëSd¨‚"@6ê‡3µAJáåLü Ö¹SŸjÜSÕþÔ1ž,/bãÛ¡ö!mwO’=òëM}ùDìâчKÖî`‰9iÊ|hˆé¶]—r¶2‡¼c¦&d~“2¾•C•2%SÆÜÔɘHÔe ±%è‰&ÓÁ8õ€qr° IÕj2¨»˜*ý22¯‘ß·©äðÏâùç‚ñK͇4+UòÊT+bÆ*,hÃ.iPBxW],qqw.)Hi¾?¡¼èÍšð¼ØÆjRÔê}ñªÑܦ›Æ3·©6>'®ÕŠÌ^“){17á4†?a÷J,æëÍ"×TÉÃt4&Dúo2rA$sn+À±ë¨ ”+³ á9uõs85E$¸p]ÂlÔÎ@ÈO2=`ÉrÊÒÀGÈ(¼904õûß §O"L2Ƥ®ÖT©o”{ÓYs«Hµ³sÔ™âÏ4¦29×XŒâ¸.ò€•NŸ¶Ì$W윪/"2AäÕKÄù*¢<¤–±•Rñ¹4Hï:+CÙÀ\óïžÇÏ&ÓI­&ÙRï1µ+ÞŠ*u°$«ÁÉ\jf?”Ä9ä…¬DyÚCF U 6IŒOi¢˜»[Ú+¶ŸVÜðàÂXÞ—:ÁÒ¸ ¥P½ÊB³0 Þ]³tЇŽ9Åžï"VT÷¼^¬É›xÊŒäeó]óXI68ÎPI3ÅÕ‰¿jhÐñEÚFÕÿ®ƒ5!æXBÖnGäœÂOЇ0CB߸ûnaø)å¡1a ¡Fü„<Ð"õ,*&2Fµì”*¼±ºOk¸Ò @j6V„”U…½É!lcPÃ0hª®5ay@ý¬Ë!a‘+êGTÏYJŽPL‡;¡¦é£”å‡)Y&³+Ÿ±B,Fí>·ýU+…ìÛ~*J\ÌÉc2Õ]¸ßä §<ÈÍíNY¤¨ƒ²m8i¡¦aÅÞ §ù͈‚¦ÇErÿ-œST?˜!€« ã9A;Û,íDh¤8¥ß£Äëµd×Ä;c ý{u©”‰n'ë«¿(RµIHS·VN” ÉšôG]SÁ¥¼hu`=wã ?EÎi\0F?âñu?—ÜÛE¡„™T¤N/díl¾šOºe\D“l&­µ.¥E\ k‰èfƒ©Üî{ÇØßZFÍ‘m^—[²—*åªÞWÅ2Õüi¬ŽÃ!åê\SÕ 7©‘øË:²h€éÑ3!ZPóûA`$Í“C§îÙ«ñZ\ßEPûlUpˆÊÊ ¾ÀòªTb±J•çñmMÕ<Î@[™iZøž¸éB]„ÓŽ z„šFÉLÓ²:¦¸´YÈ>”c®óDzE_Ï—m,œà@MÇJýä“;aʼnäEoÀîãËP‰S9±ºÙQ_‡cÑÜ6*é“H¬~Èá|é÷ê\Z!jb'ëÏrîÔª’Ä®EjÀeÿÜYqg?IO.IÍ/×dVáK±ž˜ï4†îØxê "2±G-iæ£XÜÈeÕ& BêŸÉS}yŠ”›ºÝ>Mt§$p+Ù]U—pwIJaX–Šœ¸‚˱*Í@3-hC`A§¡11zä¹¼÷¥rÚõg{˜´q1˵[›SI¥‡&W´ÍÊžD§Ö5’ÎCSþ›Žá)b b£Á«GónæÚ_é9gýÏ4iK8aG;–kùhB¨” n ߌ®'û–IÓÈf%äLfŒƒ–9ËŠÒéo5À wœß«IÝà#£Ãæ‚ 4¹kŽ”@61+I˜ƒ¯Ël½ú…F³“n§ój¨·i˜ •Ž“Žžå®Æ-ÿGëJ:1­¯íeã'KH¡p{tÔ(åa3#̲\6Á±ºª“b˜´¸Vx&OÆPv((Ä^{ÖeXðY=´— b'9V”T!- 8;ü+Z…¦¡VÏ{ßQ²ú!¶GtW¾—’w)è]¬"¦ÿ½â§é¨3\ö¨-8çÀ:hè(± q>îô<^´B‹"¯ßÙ:jÀÕï9BŒ…’aûSß Ayš#A-4È×=jzÎËS=Ú"C¨VÞ‰ª¶z¹ ©ƒTa<.„w42îe§ç6+A7m|ð&Ø®ªTCÁÞûÅâÂ)hXñþ†s&j'ÉÈøÉdwJD)œ§ù^j¹THTŠŠ‰‚ÄÍù‚øÄct(r€s€ /CSr® :t£×1BžšÁ\1ñ+ØsFÚõÐCä=,Œˆ¹H¾:‚vj„6`›‘2ãì<³\±B3Mú‚ÓrbI°l,4_/åÜül#¤–kΡý$4ŽepÛ#E–‰‡™íݯŒ”öü[ÜFÕ×b*XI`VbAáÝ4æ„õÝEÇífH!¸^Ð n¼¥3ÑËÙáCXÄ@ðÐøzµêrV#Y-™:Ü•².”+Ä)\ kÊœ˜,ãÚ´QÚȳ…¨J–T³¹ã /]Ò8fF5až@í©‚ñmqB®Sü€™Ê7WÉ{ùýôœV\5S#åpD˨Ís~Ȥø½Tœ2¢¤ÞÜd7C%ÑF9…fÀV W²¼Š–'š’Û¿ªö9gD¤þ °ä¢W(ñtW>±a÷ˆ #À3?…³×tÃL;£o®å%~SlK”ü̆¼ïh'ëç(å+ÔÈ.‘˜ o³ü¸Ú0‹'ë%ÕhLkÝóó×)¢”4\ˆDJ…2_3ÓŒyHÚ®ÉXÒO5Býžñ? ‰úÍ ·A9ÂCÐÔÚÆSšÔî¥*«¤›Ù7M¾Þñ ñÊe“½1SÍê(¹f7ÐNŸ3º™X !^ilh9Í’ZÈ–ëˆ\3ÿ°.Ò\msñS”à}iš´ægÝF^f^_›ûáPäÉ)ÇO5µJeýƒ3[×Åž¹£Í—Hí¾rAÑK1avç˜l×\×H§-[ú» ‚ÌQ:¨˜~&…¤q|‰¸Ð±ìlÊ®‡„ù-NWŽñ•ÑXܹk\ƒï{¨Èƒ„_Škª¡“â{"Ò[{B¸îELàf/«kP1 QÄi^vsD5í¦ÉžRòjfbÌÕrçOé(¼Qdi¨¸Ç‹hB°’r¥nh°éò!†S«Ñy )#L‚wsþðŠïÆCòݨ±äã,_‘qÞËÐq÷ÝÏ{rž¦ߨõFÇ/è¤8@úþÕ^-¢\²À×ñ^ÊmÒb>ÄÜ™ƒ )/+ü«Sw˜{}£ü¼}RÈ¡îÎÑMSôÄñzÉó€@r¯¶ñ¬¼¹PôögQÕ'=§ÎÙ¯1Ry¨oÛ4ݶÔúP³Lº¡î·æÀ2ƒ£Í»·{¬—•$;ÐZWnÆ“‘Å ¦ã–Ä¿g¥&¯†™˜…d+XÈÌý2r Îvu{— 9T ª¾9ñIn¬Óçï€dwðÅp<Üó$Ò‘¨Å'¡ø- wÁƒ.ÁámXüƒžuâFIø„2–««JlŸhÙÊÈXÜRj•«Ð…=Cg³13]h8§¶á–5#4!E-zt yT2âàûÆnŠÐ]RËÁžÞ¤Øx¹eéârŠ9„n UnóvœK4ãC‰ÂVÍ“‹»Fg, ÈÄe´ß‡jù‚ljy@æ® qÎùŠ+W¬ˆ$?§p]ûmPKVÒÝZiõ~0ΦɱñWÿªPwØBJüºQ”~JV{ sCÚQ¢Ž²g2ÚÆ|v™‰mBÑ·ÚpLüFú¹áj l¤äû:—½»¿3G—Y%ö{“2‚R¸ú ‰§Žwì°fG‹!?­ÕE ¤p³8ºøá>iÓÅ1×`NBÕ{b8IQ'I3´•\MrçìyuÒƒî‘ð±jO*‰3\‚¯çi»Ð“&èèq[óãòÑr)Ì9(/Õôîø‘æ1ÃÒ!êº.rÄB|¤„£#T˜—W£CQò8û™˜ŽPoŸ‡ÂVK—Ù•ÞΜhŸÑżæbÕªK®éíÅ?ã’V5$Ú!³¡ÿê"Ê#  W5·n²®;Ðhd»²¶ÎGÏUMïufSLj=†z±ù#Pvº¨{¤û7!°Ìß&#Cîþ|Ô°cnU™U èÑ<1û|D+•C\® ÉØØuXF¸Õ=[ÌÑÐk™%Ó¸(Úuº?J†ÏÇžÞ¯ËtW4>¨Î¸)a™Å;²c…òDj֟κ‘¾I"E úÓ¶uýR|kÌ‘V|4a3u4^Y»¢·ŠåHm¿“1Ê3. ÷Ó„½ôH '—šJì5˜ç=.±h?ªHḨ«h"'~ ½Ž|$· ÛÊ¡»Í°$mꬮÿv\Ku¿çŒ æå¾)jÃ'¹†˜tRÜ»ûvVÒ½~é¶ücï†kš]·9uêgcAˆõ­[$J'¼ðs‚ÞôÅ[„¡'J³õ…Œ ÆŒ"‡T,2þYã‹g!JM»+jmÍ¢ÔLq`WŸò|>S'ǪIËVX´Y…{dµ1jŒRR‚ŽC”)ºv´ÇoŒf£­7eJdÖœs¯—¥FpÈ©i Zá ʬº” týŒ>•àj8½€t{â{ƽø³q`tÜšßÈ »÷TY˜¦ëÀd¢ª‡®ŒÅjX«…K¡!keœ¦ÆÞ{ØËt™aÂ2bî{%Útõyèos¦Ý’šB®Êò90Çå.*£V®TòÊÿèÙvÈH(½3 A@J&žcù­ôˆ1’!^ª¾» ØÁ}S¤w^:H(ô =¾½«ñNdÍñ'i*z6ï¥âðÖ—žÎ•þ:ÄìŽcqKýŸ!LŽw¦ïHì­ó8ÈP^²ÿ#Ço+p5¹z]ýáìó=®ˆ•4L™{oçv³¿_ÿrŽÄ`È’·½¶±®/Ûµ<}ã> õÐÕŸyzeêô5ÍiÀájT*vg2iöÜXKƒ½qK(’w›†^‡¿Òi2D?-3o%ªqXÄ•¹\Îé¼G-¾Œl<ÐGÒ‰ì0¥Ž%P ™6(Š7I¹ÆŒøaéÖÒ´qøis(†p׆pÌ~DG1A²%ñ¶–ŽÈR‘óÎ^†Î¤D@„yÿ(q6Œ3;Ì•À®º…ÚÌÚ•çfH+®}ìõK÷*òŒ“_Gê>CÇ“…“¸aN…ún©™Ñïó.¼Û‡º©ºB@!?óñÙ!çzqÝ(Ž:-$ˆØ£š½(JÃ(î\†T„p}vÒ;rEƸÎग़bÊÁxM0YýŒjû¹*ü²KçЀžÁ‰±Š$©N£â.ÁãÝŒeÁ /´fIµ ±Ñ»2Ή)ÐLÍ鉎›—.ÚϹӣM!䟽OBÕËí¬¤ôàŒØ—†s O7Æ‘ún£Ëh¯‰‘>j‘§jyÞDþ®'¬`¹%îÂYmòr‚1§úÕ5HQ¶µ‚­äü*a6¤éjØ7‰­}j8NGª™M×V¨+z,ÑsF-sH覡Á{B`ËXùþœœãMTB¡!Þ!ü±!üÖŠôëtsƼ³š(÷¬BF›O&QóR¢?Ëâº"©èD}*ñ7ŒïfšÆB–¼´Èöÿkò%cŠ.§ˆ,ïõ¿Ø'…&çöâjßË ³BÝ&Lb8y#ˆ=Øä 5dHîD§4™^±!Ï; IDAT.µlªsµ@bø‹7(ñõ4ʦ(Gz«ÇWKj÷±R,³Â.˜n_‘Ñëz“}M1ÚHÀ!õÇAê«ÑÒø¾Pɪÿ˜“ée‘r; ´±úT•Ú³\ïd\¥0óÄàro‹ XÃP•~JF˜.¿ñRî}7J0³DLèþ]ÒR¸† šTÒý’¿g›ï ¶\¹&9þsùÀr b_J°Zv/&m®À&úR ¥=5ÿwøt„¬Öê+ŠÛܶ3:<†-ªú‹C55d ÄË•5ß7‹_aQçÖ‚w¶S0â}#némg mÐ+£\™²r¯àMwú8qïŠþfùþùx"”W:{XIÓæ¤—ɽáéÝíc/*/%úb_ùe!˜çOÈá3¼ žƒhÞJ©%J 剙â‡4 Å(¬x ´k1×1{!ÞÛšj*Ä«§ˆ×wN§¡:HYɸAç)‘ÕðÊÁçjµßDZu°B©…±Õ¾PÛ,œoG™ûc•…”=DF ¨ä±9Úöi°-\]f|'óüõÙSÌ uüCÐ÷¯rÃm¢1'*!*EØ]ioß—QËÕ^£ƒT’/âÁ;)ÃNäØTLÀ –aŸüÒ,’ê_Û;ê%œ:Š5F‘¡Ï=Êp"öÎ.ÓMÔzÝbù`·$ÚÝŸçzOFç ‘áÞ95ȵ‡-Þ‰ŽrmÔ΃$ùÊ‹–uËèSHìXX•gõûS‚Óú.qóÍ|<®( Õé9½ñêu¯Ãíàñ ±3gðþCo/–í捻|@ÉÅg¯Ä¢Ÿ|&¦çxxÙ_ÆCPè^yÔ®EàGó{°Ð¼¥*QÖ¾˜¸h°™nŠ ‘66¥î sRG®¸öó0ùAJäswX‡öHÖd銒d#óŠ<7Šåšq ø”p±gÞbàWêidDûnÆ8o7ŒñUó56)1g^?±ècŸ®ÒÑ÷¹Fã¥¨Ðæ êmâ¼)#uAÇ…®ƒŒ˜,ÙΔB’íL‘Y«5ÞUL¨F<•'ÝEr\õ¼#£;†IR‰œ±FtÞVädñ°N“.,ª@‹æÖ¸ÉZ*µÞ^H.¤I}aá†iÝ#÷.&ͺhJ!~I&žærqNœƒdmìô‘µ«S–QcÌžÑnÇ)kÎ<*ŽRM\NýÞŽ7E׿hŽŠŽ*éf%¦‚áÌùEÅ™@{uŽQó¼èŸ»I¼—›š¤­ü´»Acb„OÕ{zf¤sT#JéK@ú¼­R9::rÀ#kÂT1N2׈bÐý©Æ!|ˆ¬†«@_û_p¨RÖër`ß4åvÁ‹±aϵq‡Sürš«ÆR@· AqB—Õ(¡pšÞî 92{Ò-B<›4aîß5KÉxÒ|$•Û˜Ò±¾_û]Ѱ uÿF8ˆñ­90J¾å%¼IZ5¬1×ýüh®„)Vê"c=€ëCÃIi:€&'Ô¹ÖÎé¹:vV„Œ5…CZž)Uù{åKöô9ßE´¿)c˜> ¶ƒ¶ÌË@*4W0šdf¼aFd-Ós ô¨G“¤+ZaØzÃHôÂCÎÆèj*åõQ䆵‚ÕÀT¡‚9ª0º™¾` D# ¹XÓ¶a—Î:)b:Á-Êv;!…››=…&:Ç‹0ÆQ…¹b†ÆÅÇÓëÁ È“Y3f%.ÿ˜¥·Œ1Ò£D˜OH,1I™‡Q2€:>bÔ^Uxe,U!”|½x)©mÓO9¤ 9dÃáhƒ)ðÝä BnÖø•2^ Ø=TîÞNX‡!9|.^x\‚#‹ˆÛäPZþvÈ8²¹oä¦î„¨tߣ°„^ŸªLÁ@‹2RÞÚeŠmÛÊ'I™!Ýfv”óÑ£9ûðÂ#Ó¨.JÊAh¨áYûõ•²¾ŒS£ u‡Š^ãή‰è Œã¥Á9ó”¹µ9\2V¥Ï¤Þ[ØÝÈ|õZÛÜhŒéF\ÿiRäÆ5\”R1EuÔ¨"—ßü€™`|¶Ä`²‰ùÂKÌŽú‘¦U½š^ñÊ",ò CìJzT®—y.[îÿ³ ME2—>§ i¤ŸJ”ÓYµÊP;)Ùf©°QŒW²ÒÜ´ûâžg+wW:öK¢Ó5oQ™Ë|•”M‡¬¡M‰ònPÊËe†–±ÃSÂ%ºƒ§ó@êB¨a›£‰ª?Kš´Àúš7¦4©A‘)oSBE•PäK`È¿HíäÇ{"3µ?› ÚmÖ ’) (ž’X7׺ç©ìб‚©HÅH¬ïãC8ë° –Sq,ï‹•¦ir‡íÛ†CÎ5‡[Ž–ý¼ð L%5g¥ã™†K9fxð ÛPÑMy*tO–°ÏðTgSô6¼ËQ€JÆ`„úÅÇ+Ý™Y}‹Æ,q8Õ*ðhÄøØ»¢-2Õ/è3˨gƒ ")ºÿü‰–vúýħ3…ø¢¨®ÜÐp•ånß•&Û¦Ntæ÷r}ã*¸ºÂ­Þ/)2%ïCÜf)ÆW9°}hk©¯ôdY.gIx†L,s¶%\VYþC¶{rQV–EE¨­·ñãy"w}¿4Ø6–‡†H¨‘ðy ¤*ˆ^¢z<ñÏ¢ä"‰·À’ŽoÎ̃Ø$Ý4›usƒ6¹æ›Á—îç7ãAÁë÷õHá2ÐJEjßJh*(jœJ_Iл¿ßtGEH8‡r“ fé€gqñ¨¾Üé5·' ­Síï•“i³aëB{,Q˜> Îå^<ðsÙ˜ˆ²M}à¡›ðýœ¢ FÚtP”ˆ¢G=hìÅñÒ€ _m=ñ؋ڗɜ} 4ÒfýÌÕÉÐZ”E#fêd —y“^ìëˆN`Æo*OQ ˆþ½aÖ!dÏx¤oëZOt3„™©ÍXɬ s%¦ÃêM‹eÕÐnºþÑ*Ç[tÕ&¿+þ²ÜÐéãZ˲jŸù\Aš)‚:!2Ú1½ž_$áNðp¦RïCq±ÄËÈ¡˜Ï¦ã²m°¨Øe3@p{A5Þ̶Ҹ<MPÎùìŠÌ çéCù™H%`]ËlhU½C”eLÅÄSÁ’£Ø.æÕ+fÙâW¬¸(‡,I8Æ;f†V)°lüÍåAÕã Ѿ۲Òr(¿ âjb3Íb{¸B-ÿ‰b|D¸Ñ“úÀ ÜB›K¤Y'ʂنd£ù¯ ”)NG:,üTÛ(*eаIM¾•äg1뇜QšeÍh.£»&»)t+i*â£d³ÔÔdÿ ƒ5Ë=ݼ‚:·Îö+³ˆáRÚxz?…·\G!—µa$'zP. &´22mT2ŽÄc¦y‘a£@‡â3$ ÍF5p.† ƒ˜Œ¡P£k%3-I:UE€éS4#± jˆÏ3I•ÿšq¨‰í|Cš"uç¿¶Y™)ùTÝ…–r&Ä42•¥;Wn—þl¬†…Xô³Z 7Â%SIªÙ!H§¡~Gs .wkiòEcøà¦ÄD(w*³Ñ7å$F7t4.‹§NA~¹zTæ3Y{%ÔgôQ^]s'KB½xµ¤úeÕ?S~Šîø@~(ÏÇ3‡šx+ŽÍ}›„£ìZ.—Ù‘ˆèׯÆùô<‘#›^Whˆé …Ts¿¢ü›—«› KжNòXTs0»ëY®H‚:3®ƒ4I8–hå30±HµbÕRIÀŠ ´aOwÏhÞ‚†dYÂðÿÓÞÙþìš^e}­kï™vèŒÚªUbŒÒTE>ó/¢ð/~ÿ‰~ ñ‹/ Z_‚ˆ^cR$†(h[_¬ R? ۙݙéžÙkùá>ϵ~Ǻ®gÏn…Hë}%O¦³»çyî羯ë<×¹ÖqüV©YH˜J⪗¼ßÃËUDÙhÍ9Yà tPòð% C;ÄÛž ºœrÃÆìÒM‡·ÈÖ•KÝÿ)9 }Úz曳‹@ „O ¬ÑΑOj(`JT{-_ÀΞ*阈!@øÖB0¡‡X{ŠÖID¸hû·˜2ÏŒ˜“6{3œì›j©‚žK(îa…n!³¬ºÀ;+äø–60ܲÀy¤ŽŽêª™:ëtfv‘ •kƲ­&D89ÜsèRù¶6®ï‘æDÙ<@@ØÝE*`¦w£#Ð&.,pÑŠºwÒ•’&ì& 瞣ãiA’f‚_¯ÅÞÕ•D‚Yå-ß}Xᣊâêöx*.âד֡œ4±6 “Ný}‹Dƒà„¡e#<æ¨ >+3CÔ=å#p7O|Ȧt“M=˜µ›Ï!Ve±µ;eûý¶AÖ-å¾Þš±ÀÆZ\šÑH,âNiÎõøhÔEpbíÈäÖGYß/ÃÈvû{qêú*»F]À¶¸O¶£s¹âàÿÜBAÓŒ:̄ϡ÷‰Ã–šIA|ky£³Ï¨GË ÿ9éIy?p (ùtº¦ê_ÌFí6»o<7rý€ý°sR8([œutê-R‡88[ìTª£Jd&tBí&FÝX±DP-€Œ ÛdÐ-RMC:õZB8lÃEÔøóÎXÆ .g/ž+aYRs£ŒKÏ1ZÙšÔç·°.œÊëûÈ„lŽÃ @c%sÒê•ãæ×¡¾GÒ5ÝT3; ïgÐö)-ÐJð¦v¹ ¢°Èã„6…Ýpˆ-«ï‰¾|( ìՋ C—q7dm"µÝr4öÐ!Ñý“ܯö4,ª£ElgKK'EÊ 9ófZ®ßlñ‡)œ±õ->Ff^Bh‡YH#GNg‘+ØÍ€ücÈ©ÁXCmú.®²ÝŽtvÅÑQ &FN½àm¾éXÌéÝ!‰c”±tŽ:Ú ò-\OŒ$ˆÜ*CöÊ…ƒ¯Ô¡ªeÇaS¦çÅ©ßqFÐ]ã%z®¡ÙJ;Þ+„šìܤ¼´‘Ð=¨î[{„tÅ›®Î­ÁÀÁn¯ÿËE_ºËÛɶî4ÙäoÅìäÿN§×¥u³#„&cšT˜e\=ˆYªÎ–eŠõµUã¸ã]º+Þ'Þ,<‚w<…7G«Oe1:Ù;œö¶ö¥ºÉ®Í>GÇœlï¿êÍó1†[6?û€á_¶z3H<Å,c™"²RÀU3ŽE¶„°]):çÿfê¤ hï\lyt~0@#دF7uÒæëlOuç˜i•šYªøȧ9BªèÔaµÊ þ³SF ¥=&¶î‹­ŽØÔIRóoTí¦ŒÆ$¨.Çi‚„ECJ²÷¦™pxì'UÜ8àd^'ø¦ïÆÕQ–Åîó©”ÙÑ=x\A™BhÃ)ÛL ЩN» ñ2î¾ØãÀç‘2íqÈ`aA—{¬ Û3o$ë"¶ƒ”àÄQôL°ÿ&lû‡5ŒË]¯ÑpHŸÄÉ¥ MF&”°uA“‘JP¤MY:}Mv^¼G†Õ ÅXº;Ž °5•öҞÝèËûàáÉ\ÐW“ä`†Ü1Oæ4+j‰IØiâ0°?3u7êÚÕï?16vIyÖîGææPdŽÔzwŠÌ]ù?Øë9@jz÷•Rо K›‚ïä¢1Q2µœy¸Ëé¦3ù"‡°k 9FÔ›@˜µY\&š?íärÜä63DÔ.kÆ@F8­éñ7ÖúÒ#š«VÓA?÷^ŸÌÕ¹›Ü¤#%¬˜ØŠGÏ: d9q38™ëñ‹Î’'`Q]Ÿ4”HTlÛì~Òp” JvÕámî<ÜNK>`T`p®hw$%U”L~F¢ë`ÊÃêfµcÅ<·çèCØÛ›åt;Aë,К‘Òá“Úz£Á÷Myd³Zn(fÚ…BN“‡çé¡ &eo­‹VœžøÌíÒùÄS# µÙ¢š,“W“ÔO 9…Ô°­a BÌ’ðO€(©“7¿ÈÁûX…å†ô‰SekOjrˆ5Sáu|§ÊMà#q•0A ´+"ÑÒ‚‡6É;Òº\Ø,Ìæ3Û©Ýä8fƒÕ„û"Ô”ÝÿØ'ÉÃUÐë†1ƒ’Œ«›è®‚dfÐ °[¶®`ÎÌ{,ly¿â´é©8;;㥊˜Y„u!%g+ê¹Þy‘"ïÔ¯¡£F×ø³©ž0 íuÖEÀMjt3ÿ¼A|­ÄOjÓ“À¹Š(˜ŸÍ4ûÔà‘ƒEZw8• clH,·ŽüÁ%:&»CÍ vÞ™ä 91œˆÔ}”u{O)JIÐûàŤ ~U6I±†Ì+C‡QÉÅA£’ë™D·)çÜ‹`›è(¶94ëÅÓÉXùvXçHº @I÷øb†:œ­ó@;ä õžó·¨—‚{+§;ÍÛ@‘-(¿‰ê­¬öD¤tsÄra0¹[bç 5¤ÙtäÜ6¯Éyh)ÕcÆZûÀd©½'à¤T8;æ"”Ç!ƒÇÞbÑëã0.VêZ®£L”{JB{+#„ÅÂȆ:¸[Ç+ÀÈó"f¤Ç[ÑlòÐÄâe۬΅¤§zã5|X?E¿…w)’*J¢Žº3rÏÚñÜzÓo0“ƒz°R¥¸­_}Ê®ÂÕ¢8ÝJL‹%;¡‚ëtßhh¶â¼Úö!)³û¿õGuç\­¡Ò–Gwc?ðÑÅ*¶ £Åi‹“Ñú¼ÂTã“(àÍ6˜²+x²W·Î±6Óa EÀdRd˜IcæF‰(‰Ð¹ø€p%uCÒ&6Ø^ÇúAÍn^Ä’›ÍËrÚÒNçíÀ>—²ócN³gƒ9!!±ffùLˆ¶¶‚…ØÖÞP»Åô“l 5w¬ôZU£.œ3r@ ìŠÍURÂeT8"d—YµöŽc9®ª1úb‹‹}%gvŒ ÐF=dõv˜puœÚÁ é ¥-F8{]­L¸ÃÕá壃Ʈú%ªUn7âÔƒm‹p­¯[ä~$>;8ú¶‹êÈfÿ°#vê÷ÚØT¯´îk„žaÁ>Às”KG<Èqÿ©ñùa³ùØz5?i&µF¸êн¸æh} ÚîCÄgš’#ÏÇ…nê¤p|pÿô¥ ³¹IÕ®*Q.ÚnÑ(oÒß±ÝZ¤‹Ð¸Ó6Ëâø­Sl ZeøáÔú@§Ö¹ÉM=”Ýå⺚vôޱ‡ÿÏMô5§ÿM¤¦C‡_…gÝÍžczoÐɈ0anˆód)ô9¬“ˆ+Ì pSp"µr9“ÎÏ' ÄrD°"¥v…?ÙpÁIxYš]øÈ𹹄–…¤[…VãÕM; Àضü‹K ¢íÑ×fDѱˆ†îaŒó £ 6ß§Zò n$OÙŒ ä–#Ïh?Ò|{îÂ%eÅê· 5uxnÞ??…ŽÝ­ó:±xè&ñÜD%”ú‚-w¼dOÑtÐÝ(À€Nר‚Lý«S€gÍ]3œŸ%²J ªxv—´Nt÷s,÷HÐ9`g9=J\_øï^¦ — @‡‹W%|¯B:0\Ó{-“Vž_w„uJFZÒëaçgQB:mê–] —¢´M$V7I7¦Éø®t5}_]ì€4I&A½6¥h5‡níî#,“ÏÏ*ü¢ ¨¦B¹“‰Ú*“ËრâF0fŽ,¸IJŸ‡™/Ë…ÄÅdÏB—*»ñ©{c(?vÍ „^cò~Û¢ŒEI%O—©Â}T¥ÒfĨfÆŒâä&;2˜Îñ;>[…b½"×BÔw:±ÂIÐÅgȘ«Óv¹´¡•eÏ%ôRÅÇÔù` 8=ùóTq˜R é\’©@H¾ZÈNñ¢åHoFÊp&EgÙÄm̤ê,* ݈,7Õ"1¤,•ÇbÆk@Tr¤¡¸×îß@·¡ŒPjÅ4l­LˆºŸ‡e1éàqéð"V£Yãh%Ô]~ 1>s`t¬@œ•DköK]µS7]Vª5ÌìàæÛ1Ò?ÖGÑ|ì=Ã2À“D£ÖbL‡83êäâài®?ktåz–Ü]‡“ØÝN ¹×ãôÏÃDAúp³”@Àæ”D¹‰:pS»YÞhìI¢=…üN0ã il^.Dkº+8Á™§Žmš´´*ž£cèJpe’#ÓA⟃ËÓ 5]\ýD×ë3½¡4`Y.iE†BÊë ±"à}70,ýŽ"f3Šz4µ^r“n}dry\»”#p¶Þï ìw¤Sçxöd{héˆ{”³/}èú8övw\…ò6¢w:Þ† Ÿ›‡=rWŽ6ì¶ ‹WëªaõÐTVÈë칤ù aÞÌÓ5,µžÈ5²iEÅ­‘LZöŠŒ×"¢ ™ÁZÙºtþJ/œ¢´Í4yO{”‡˜]ß§ópQÉGÄéq3í1^å°Xcü…/'‹±±,¬B>+±`³ê˜«{Í; ¼¬É†L*×ßdœD@}·L(Ö lýCØ›æ;¤^'/w°^Ÿðn^v'7†™B{¬Ìg]Š3öìTãÛ,3Ùuã@eˆ‘3 7$Ä–›c’Ëf!Ýç-4'xÍÌg§‰âÏ¥ëóØâõNuŽ/%¹vAº»F ÓEÆ6§„V|è›ÐYvao}ʼsKãƒ6¨Xb×ýpdke’PŒ1Ù?W£!‡Ó N®¢¸Ö>q{Ø{Šë3’÷Gæäá%†U6Qh–¿c5œ‡Ü€è1î)ýþNç*ZµìF5¡ é!–èýñÙ)Y[bú¨\OÌ:€ÔÞ”¤R÷¾Y*Ôud»Ó„ nÖÚRÓ.=4Ûð9z˜Çô_w®Ü:6E:tÌPQ‚°3 “JÛ+ÁÖÎæ`6C¡è󨌠š׿{ÈÜׇUþoœÞ›übãæqˆIÛžŠ‘Ç|™ñäÍÝó«” §Á#» ïm†‰…0©2FFjŸA3³O:caÒ6&QÔüXóýaA,UøÀH“Ï#9˜š "­Ù”+!³µ¦¢î, á"û¦_ÅÄ IDATN4³NX=Êü{´»Æšî)vðühÄzeÏ«/Ò”iYÀ|L¡ñÅ,ò ëÛ¶;4a&ž´°íHÛás‡AHØdƈÏü:–†ª%ŠÆ9Э^‹À!!¾§Å¹8OÄìGw†zCw1ÒívûsuæÕÈ(0N>ƒ[ÍçøÅbÍ¡'©¸ K#A@zžÝq8'-£$OÇÇZ•Í Y¢TÚ]ë•#ÆÈßUÛšáâ¤Û†zY§‹p¶ºeû#pl7²Hè„<ÁR¥Þª-üŸÔì]´býà,¶ãlX™}Oê¡XvlÝ4Œ®dº-K@ñê©ï=èjÜ…íT0ý;)YÛÄH-Ê.A½e‹ÔkªL'ø>ý\{u®©€.òÅÃf/q:ÖÏwß}÷t¹ÔÀé¡É )×ÉfjàÜ´ïI²kŒ s-Ù)ÎYk`ƒiRîMÐÑ©„{!$0cÌÑ|ƒ¼~¾ÓÉ“=Nžàs0¦÷â…À¯>¤„¬Ùž'î“£³Ã%JŒ{ÛMÙ%FÏqÂoMJ敦À-B­«´I{½GM N††‰¦!UÇ‚Ÿ­ì›”bqÓ;t-Aw\‰ô3ƒ-ÇÄûœ©„ßìnJB¸¼[­JMÜëËe6Úî»}]5_¦1øt£"mÌâ[C‰ñ’¹A†BIìö·×ñ,i{6 ~+-­Ž~‚ÇÍT¦PYå}ª€Xke…”Kj˜ùQÂAçh²ÛàÕw%î†;ì™ãÂáŠ1ºs|ºKæ'—_¶uÚj¸£¼7éˆ Ãér2ì"8´Z £€©Ôƒ‹âÜžJÒe:=¸;6BM›`½ž©Œ¶c/L¸#áÖŃ–5±è‘†X™p™ˆ0€&'E›ˆÌ}_l¬ºwüƒÅ—ë=CA’Ö¶ee~sœN`.}”©|9Öàæðdø68§O™ÀÖsõôèÞÁ*šŽæù,û½„—Ýé§-?—Cª‹Ïv‡"=b½®SáÈTåvHš½[ßJ<Ž^ÿB2«è8ë¤ïîZ´[µî%wd™&ìX›NÌcO¦JlÄW­fAÐ’Ä-LÑHx>‹Ÿqã¸]èã0Mý2™ «©Æn.¾ŠôÁ}y*˜½»Xo½õ¦=P¸ÈMùø¿~æWüÿ‘G1BŒ‰Ç^ 37ÇN”C`—¨°8.òeMÂ*!ik³<6í+d†YÜ5Äšäæd–rz ¤Õe‚ÝÁ´]ìùz€CÀ‹n'ƒ3Çz9Œ¦–©²Ç왢MËÆÌ¸9ˆ57ÚÅ'âLePœ¨ËŽÑÚÎæ’¾’W÷¡9.¾&|¡Ž2<§·Øƒ½0F´ë¹7cwbª“&áw\Œ¯ô†×oë‡RhèÝtN»K‹AP'”ê¨yj–`Ï7Â!“ÍÀ.:ûÀN½›Ù3ÐÄ·N©G|αŸ1í»qd ‘ÞJ&”yôÅ“@\`ÝkOÀfX³¡hq HoEÔI®9PÝ™XâudUµƒ†:œ8Y‡“$Z0’ò…ÞÞ Cày8ÚŽÄk<^ j,òq@ÅŽS¨‰Ù<›Û’¯ õÓQ¦vãÆ2ʈ"æ’ý9¡³úÎÓ§ù«¿úÙ/Ž¢%.º1öø}Óïùç™ñíiî•}óTnmß!SK˜FÆ¢'`G~¬ tYæüì›r…`q®VdÔlÃF"y”:jᯠmÖ‚·ô%7Ø6|ds6ÉêVÉ´Í‘Y¦JÏù:3boSQÜr—LÐ*wû©ÉÇž¹fà¦ÉÒE±[ãhöhyµŽµùÈ ãd é’ d"¾´a\nµ]T±(œâÊC~–8¤Å 1±›Ò GD•pEÅÌp1$Ì}Šnêyîâ´–}¯Q¤jÌÇ`BÄHPRx»7VçÌJ…¹žÏÞ˜·Z(Q¬P·Æó³/]C‚™/ÚÆýŒ3qŽ*!p£1Áþ›k¢÷ûN\SMŠ¢Î…²²#g½¾Nè¾­£9FÝ,ؤMHا±Úž9˜*íÖæƒQ}2¾½§îy¦˜"°Dú«p!muÓ›oŸyôˆ{/º$› 4ÐtafÑ~h'²ñ]¸Å :ŠÖ£:w?4++S>s†×ÞŠç, '(|®C>ÿX©ì²»|«Æ×±ÎÉÖiý“†ÔÉ¿ìØ2OP2£JŠW|(Û)±{P™INÏ”æ¡m*;»§aI¢'LwÈþ}CØ>YõAht7ñ‰dñ,z÷Ö2îùŸÿÓ°gÏÞybMF¡E2ÔdoöÒÏþìÏ=•DJ±¬º º“Ðvöƒ‘€ÖDQÞJ¼{®TAë°±B‰g¢ÂÄqSNügÐà¥iCÌí®AjCܹ4Mƒ’8UìJ•ñÚF7kÛ¡ÚwÂÕlè ¤•åú{ËébÎ$½FÐò|7Tjä2vܨPCú°,ª/á¤i{Ú!¤† ÔN£0Øx}Ø]ù3@ÝŸýÖü¦}ºàÆÌŒ‘bá ¼!ï 5Î¥ä)X›HyÕüúÛ?Ûk¾AzÛÇÈÖÛÛ.,ܾg½èMžãêœC¨i“¼¬l¯Ûä蘇uÖýì!pÕQ ©ð_ \×ÂÄ=:J`om¥øTxÚéä=WVtÑöž—vlX×1žUœŠwèža;9µLr}ŽèZ¯o§„žYØm*p„úÙ%L€}&‡í6¹Ýzãv(܂փš’v‡: ™Á©d-¹‰c4Å'³Š$ÁQèój¦‘ ·ÛvjY@á®pgͬâ–çH?ŽõÌày#ÈFî¾Az+j¬FAér¤SwR#çîd;>”Ãí<žj®³ócO RJÒQ4{}Û3¯];è‚vÏ{V]‘>_ƒØ7³oÿsúžµHu,HR䥎 »›ƒÝ¨ØE.ï"Ô^…mÔ ÞA m1£Ì®j9SgÀhp\Â8w&mµÙÊeÚë3Æœ=pÊéÏ`ÏÏ7~¿t/É6¤jÓÄÆŸ¼ÝRÉ@ÕÔXtÑFˆsop;¹vå¡8ã Ý,²­áÑÖÿ&öV¡É¢[HÐSàN)L-½!7õ6ÌEŸRà5m‰šûCsäŒ àÏ÷ÙìèÎÃdÊcß„TÝQ”„¶Ï‘§£cuváAê~énvWªî¹è<<Å¡(á“¢ËK Úeöž›}v…I'ïû«Â}£¹¥Ñ¥†nhT„ Oªz.£º#fmĨ5ÚÛ9·7扪ƒ”õûÖ>(HŒå ¾²†Â†ð”ȳVÞgÄIØ]#TE<7ì2Lô­€ëðó²Ç^{ñJ¦ß®@E·è×]-§>iš•r„ؤbüvÂËb”¤Ìê³ÒìÅ)SÓ¬C)†Ööï(w ¢ì—×ßà.pèæ-l0{È*q–u9 ;ŠÁè¸òØ|]lBQHâpŒ{²|íK`õÎ wÁm“T½)¹fJvþ¼qV¿¨tçN§¾9*G`õ÷“Q™Žº'"å=ª‘”wšoïåÛ¿Ó†K´›XHEF‰$éZr¨û-–ËM9>)a³¾¤ëï'©Ât° ¸éäö÷ûxMaêL(u®ÏÚ-j4uâE¦R=£ S V,}Fôˆ.otTÇF ót‚õg³u^ál»BBtH½–ôJPΊýËè´Ã>÷é=JÌ‘Òíª h­·7›oaíF ëàLãs¿Ÿ®Y8@õ’†7Cƒ 3¥<©>R)¿²Ž®Nžƒ¶»G¸ßI¯-;{ÂNÏqsj&Cx¤ÛÚ_ö¸9È ¾Ý'>œE=v"íµÖü®¹Ö·Ìugâ>YÅ|XiÏ2o ¢HÓj,Ë£¾nߎ­ý,í× `l`í¾i£Ð áMÕ*1{Di†¢DËx²=™ê>ã°=jÏ‹[Q²ÖÇ@Mc¿·½»ìñéÝý8"Kâcÿo‡\À,õå¿ù¹ý£xyw|킦GHföèŸøÙ_3{ôZZø!sªs«Ç„êª|Oš“ZµŸ±Ú¬®A_‡Mq‘nŽÂGKŠB"‰,ðQ™› yÉNq­§‹þ™c|½µ%ôðüQK;‚¯eƒÞ6ÂD¨WÞù$ÉÙ*ÿ Qw,ëÞæ ŽÂ+Ìô|X-ùLÓ%ãz›MHæpŒÅ¬z®¼%·ÉÛ¦;s¿`wkÜOtК2åp ]TõÉÊ!¦êÔngŠ1~^]0]p‚â²Ý&unj zö&fÓiD§ TO)º¨¡¦¨fˇœÌ Ði²²Ua §6 åÙ!Ÿms7Q\õ8¦O\MHmá•¡»[tÈ{0ày(xÈ‘Q‰ò¹¼±á£Pt¦ècÛrÁ©©~,»cˆXˆ±¬Å4Zœû¶×‡8±æÿu¿¬±ùdY@C0@tή#&L¹!yê’Ý4SuH8­ âšøU[Êü—zp»òžÚ6…‡¨Ý 2Ã=¦Íãyð Sòy}†žCŸFÑÐpB‰eºå 3áš¡çÄÁèê3ÞÊN¸å;ƒmâ§÷[GScŠ.ow}ÎÄV{Áíßž={׿û»þ¾þúëo­"å­5&úür ýÆúúü+½½;1 †p3{í#ù“o~Ó7}øÏº³yíg§PÍítÖoðì˽±Z^—8±ýæØpôÁsãÆÍ¢ í80ÔvtžnOnV­7Pò0awˆ ]°€oC*â:'v€ÚªÍ®TJHVÿËÑs{ZÄiÅ«ì´èP¬óÕ$fânK0€]ƒÄ:r?¥‹°|µÀ‚v*'pÎÚ€ç¼~Ûè¶´Vewö0.}îÏÅS>¨‰bVËd9^ßpÂØVô›‚‘:L«13LRl-ø˜o£WÔJê¨ÝÚ šÌò³jð4HUÒ. =;OÓ‡Šeú¹+½8'"ïÄE–ûÓ6ë³]`£á€§B>{j‰â¨ìZ¨GÌQ:£%{ÚCËþM¨ûÔoÉ›‹5öïÑöh7>ÞÏ.ôäe•õuà&VWÉüaI}ËȜ⚟BŠöîL›¥¬Ã©ÏˆÓ Qøœþß“¸`HA‰.9™FíÁߎ»vZ–ËY+~Ÿë iPK˜þŽfÝiÑzš´5 h©d›íäÂøñ¡Uuh uä\¯ph\Ý  Ï¹\4 1<­¼À®h7þvø»ûû¿ðéOòÖª÷Î긼¹Š˜/,+õ“UØ|i/afùh¼ÿ™Ÿù—ÿí¥—^úÄ·ü©oý¯Ã¹_œ¼qÖIþJO[_ÐUÞÑv6ד½Üx¥·ñ§òȰÓýBa7*jtÒÏ]wŠGMrL¶¼ÂAUYð‘à/œpn§ª:íœËá²íTå^éȳ3%{ÎÀøð“-iÁÑ…_–ç”x10;Ôò¿+nï{•5"Ž#ÇȹøŸYBì¼IšS½~:ñšy‘Î+KÇ[è*÷Eàu‹°lÍìWáMÎïûžÎ«Pü|Þ¶ëCjvËÃ…w#¶O«€„ux/Y±Åwè½²HÌnBÈ!À‹ÄɽùŒ#IÏþÁ’4y³!|tœV}€7¡ ÈR`ŽÍ‡'ãÙ¢òN~O»èFºTs1wãŒÝþ·:2“­i Tq"¹q Í.Vk*©Ú{3Š ¯3ØýWU|@çѨþ¸]ß‘X#S)ËWá%ˆ^TÖ‰ÑÝvÓÜUh,;‘áÌ´<aÅä|î÷aÖŽUP,gÍᵆ—ǹŒŽî uâÄÉÁXV`‚ž"2ô©My¹ØÂý ÀïcJÆß¹jÖn¥_—»v­›GEœ»µ5»ÑóÙ£ˆã3ÇÚ,û†·Nö¥—Ùý³ýÂÇ?þ±|Q¼¼± —×W³ ˜§p!UÃríøÔ§>ùùW^yåß}ôô;}ŧ€¸ò“çéõÁ¸ eÝÆFúÁÊ)¸# 껸k ¼ê}B½yе¥¶W…þhá‚è[9:ˆ©v„»ë¨lÏ͇(MÝž&íðµÓH…‚(ýb¼¶ßƒ#EacK›ƒ3£ÛŠð(9ç QÜD` `Ë‹B›=’’zÄcÚ- ?[™áz»€.†—Þº7;ïS½Ï÷Í84%ƼµÉD±=vkßÃYóÝED¤EõXFŠkuxêž´óFïÝ-énBžõd†ôÛ§:‚Ô|Œq¤C:iWx–]‡,悲zfÌmD `ƒ÷ mL²HîÀÍc¢Ëë#¼ÜcO†'Âú‘}™f"ì09Ý›v>ø}Ž¿ ûßràt$t|KÑwôM'« ûù:tLÆn§›Ú»9¢IãZýЋÇg_:u¥]—]%Þ‡1·~’ÀA‡RGùÔš}œ>V5³œ5Í0éÉúêßú°Ê}ò‹ÉÕZäb3±Ž†eOÃa9oÑOèW†2jÊq1çtÓfDM <ì*ÏC†ù—_z)ÿÑ?üŸýþïÿ;? ÑîSt^ÞX…Ë.^ÞÄè¨40Æ#¼›\Ç'?ùï?÷Ú«ßð¹ß÷û?ø¡W¾îÕ®.âé b¬…³ê ÊuL26ÛôQ­‚0š«àþb³¡ Æ·*ÝCœ}rªÍÁß'W ãUbÒ8n½Qä{t¹F/â):2ÀéYcv6Í&o:,Ž$\b–}ú¡Ên½AYÓ‘jë.èòDQÉJ¬íÏ^scŠ eKq[‰‹ÛMt ±HI­¯_Fw—iÒ4òåRB[½×ê¿l.ÚFÕ¹ ¥5+hòmza¡íªkÀÄPîB(–!…¶fî™âAä£ó–$Ôk&À*0ÜòÍ·Þô¿ñ}ß÷ôŸþÈO®äÝUÀ¼ef_ÅË´Mƒ£ÍºõÏGföòô~ÀÌ~—™û{ÿWàÃð?z”™Ý'oU1Ó']ÔÜ~Ò8 Ír§·ð°q™Añ 3R]0¶þN·sq5D`>]3œ9%Ìf·Œ ÝìØÌîqò™ÅŸO†4:åÁ±¹Àå|3YT[±uâ ]4窔Ùþ™Užt8]hù¹ ÓAòq¦—ßö´ÕO/mVqØé»±%΀Ǚò ÖAèP¸q™uFwŽá”47·*Tæ9¼‘¦.‡3¢Û£ãf¬Œlô5‡î‚ehù0g¯…ÌŽº(öçÓˆo;ÒíRž¥ÂŸb±‘…Róa€äd³tÀÞ\¾ÛkúVcaZ/•@|̸zá´ÁÙ£eŸ¡Ppu!²VÅMËθ+/H5§Ýç½­ÉÃŒÁ6ÄÕé–GœH$(ŸÁ¶¦ÎÖC•*ÊOÕ±P3–â:tIŸ9PZXæ¹ê;ƒá¨òéJ"h’vuZ¶]IÎðÃ$Àm;rt,á"ÀvÁ)”cð0éeô3ÒÝJÆHd /ë5m Mb°íñ_@¡Ç-7nr=#Î'ú kõ1¦A@Ý‘>ÚâÝg6£Ó.º0Qļjf¯­"æ•oû¶oûÖïùž¿ø×?òÑo¶Gglþù3ÐJÖþzøìá¨x©¼šÙ(*ïÉûØOä1NR¦ÅsOh†n¹„TIÚ­ìýJu}¢'>ãdkÝrY'ýÊHÙmkiC™Ñ˜X¢uĆùÜ 0³m›rÎÎJ›€8wl N^ t9qŻȗ0/ñ8N›2Õ§Þ§T·ÓgþàZ¿E¤%Så€à ¡C˜´W,TpîðÄz><ôÊž8°+FÎC]ë4Ïÿó«þæ%ᢻڸúÿòb{ [úÜõÁø¿óó~÷ó†Ÿù¼ <ßãç?ï=yÞÏ~Þë~à¾xÏõÒ©þ¢?ê·ùÊL{ôèQÇá¿üKŸ±ýÐýø§?õÉ_{úô)3޶`÷íÕ]Ù¢ÝÏÃyô:œGïP¼û¼w×Qļ˜WÍìëÝýë3ó‘™}ý÷~ï_þî~èÃì£â#ßüÚ«¯Ù+¯|½ôÒKv<:TD*ó iâ_ÞìÊHÑŠr4ímr®dL3>q ’VÀ¼pzM"®y_=—[¤¿ÀÛð^δûu¿î× ,ï¾ó޽õö[öÆë¯Û/ÿÒö+¿ò™û ?ÿó¿ù™Ïü—_\Í]¸¼ ÁîÛ½1 v^ž®ÿ6æSùP³w/-MÌûW³GJ¯­¯W×ÿ¬¿óòúo­?;ð½^`¼_÷ë~ݯûu¿î×ïôºå=öò—Q´º.ïZÃê¶h÷ :0OÖŸ½9:/qõ3?ç…íjÉжá و߬. C×פ”Ü ˜ûu¿î×ýº_÷ëk·€Ù¶è™*ͺá-kËô2Û.=‹—Ëëñ{¼¸gãÏÒZ|³[@o­æýv9½ßº óغãÏ)Rqä~ݯûu¿î×ýº_¿C¯°ç+ÅË.`X¼°³ÿùöúÚÁ,^òË)`fƒô®J„|¨€yß*`væxÆìÞ¹_÷ë~ݯûu¿¾®|âÆFñÂîËÛøzë¢pyÇм|%EÝI;øñ%|½o|mÝÌ£QÀ/ð3ïEÌýº_÷ë~ݯûõÕW¼Ð£É ›»ˆÙ_O­íÔ,\Þ³xùr ÅÈ#1³¨yl:BzdghÞ½€¹_÷ë~ݯûu¿¾ö ˜-7™˜ýõ.þùîø»/ìür ˜ýOGs `™__N÷å~ݯûu¿î×ýº__ýÅÍì°y6¾fÇå…_iAáãëxÎ×,|î×ýº_÷ë~ݯûõµ]ÀL÷òüʯ´pù¿-`*fv§eŠvý·ðçݯûu¿î×ýº_÷ëwnsUÈÌ¢æ+*Z~« ˜«ïåvSp¿î×ýº_÷ë~ݯÿ? ™çýó·´èøù=ïÎýº_÷ë~ݯûõÕW üvýýûu¿î×ýº_÷ë~ݯ¯½ëÿÄÁiÎtdðIEND®B`‚ruby-gnome-ruby-gnome-25972cb/clutter-gstreamer/sample/2.0/video-player.rb000077500000000000000000000251701511343406000264020ustar00rootroot00000000000000#!/usr/bin/env ruby # # This sample code is a port of clutter-gst/examples/video-player.c. The # image files used in this sample code are copied from clutter-gst/examples. # They are licensed under the terms of the GNU Lesser General Public # License, version 2.1 or (at your option) later. # # The original header: # video-player.c - A simple video player with an OSD. # # Copyright (C) 2007,2008 OpenedHand # Copyright (C) 2013 Collabora # # Copyright (C) 2013-2014 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 require "optparse" require "clutter-gst" ClutterGst.load_version = "2.0" SEEK_H = 14 SEEK_W = 440 GST_PLAY_FLAG_VIS = (1 << 3) class VideoApp attr_accessor :stage attr_accessor :vtexture attr_accessor :control, :control_bg, :control_label attr_accessor :control_play, :control_pause attr_accessor :control_seek1, :control_seek2, :control_seekbar attr_accessor :controls_showing, :paused, :mouse_in_window attr_accessor :controls_timeout def initialize @controls_showing = false @paused = false @mouse_in_window = false @controls_timeout = 0 end end opt_fullscreen = false opt_loop = false parser = OptionParser.new parser.on("-f", "--[no-]fullscreen", "Start the player in fullscreen", "(#{opt_fullscreen})") do |boolean| opt_fullscreen = boolean end parser.on("-l", "--[no-]loop", "Start the video again once reached EOS", "(#{opt_loop})") do |boolean| opt_loop = boolean end parser.parse! def controls_timeout_cb(app) app.controls_timeout = 0 show_controls(app, false) false end def actor_animate(actor, mode, duration, first_property, *args) actor.save_easing_state actor.easing_mode = mode actor.easing_duration = duration actor.set_property(first_property, args.first) end def show_controls(app, vis) return if app.control.nil? if vis == true && app.controls_showing == true if app.controls_timeout == 0 app.controls_timeout = GLib::Timeout.add_seconds(5) do controls_timeout_cb(app) end end return end if vis == true && app.controls_showing == false app.controls_showing = true app.stage.show_cursor actor_animate(app.control, :ease_out_quint, 250, "opacity", 224) return end if vis == false && app.controls_showing == true app.controls_showing = false if app.mouse_in_window app.stage.hide_cursor end actor_animate(app.control, :ease_out_quint, 250, "opacity", 0) return end end def toggle_pause_state(app) return if app.vtexture.nil? if app.paused app.vtexture.playing = true app.paused = false app.control_play.hide app.control_pause.show else app.vtexture.playing = false app.paused = true app.control_pause.hide app.control_play.show end end def position_controls(app, controls) stage_width, stage_height = app.stage.size bg_width, bg_height = app.control.size x = ((stage_width - bg_width) / 2).floor y = stage_height - bg_height - 28 controls.set_position(x, y) end def new_rectangle_with_color(color) actor = Clutter::Actor.new actor.background_color = color actor end stage_color = Clutter::Color.new(0, 0, 0, 0) control_color1 = Clutter::Color.new(73, 74, 77, 0xee) control_color2 = Clutter::Color.new(0xcc, 0xcc, 0xcc, 0xff) if ARGV.length < 1 puts "Usage: #{$0} [OPTIONS] ").match_count) end end sub_test_case "split simple" do test "no options" do split_strings = GLib::Regex.split("\s", "a bc") assert_equal(["a", "bc"], split_strings) end test "match_options" do split_strings = GLib::Regex.split("a?b?", "toto ab") assert_equal(["t", "o", "t", "o", " "], split_strings) split_strings = GLib::Regex.split("a?b?", "toto ab", :match_options => :notempty) assert_equal(["toto ", ""], split_strings) end end sub_test_case "replace" do test "simple" do regex = GLib::Regex.new("\\s") assert_equal("a_bc", regex.replace("a bc", "_")) end test "back reference" do regex = GLib::Regex.new("\\s") assert_equal("a_ _bc", regex.replace("a bc", "_\\0_")) end test "literal" do regex = GLib::Regex.new("\\s") assert_equal("a_\\0_bc", regex.replace("a bc", "_\\0_", :literal => true)) end sub_test_case "eval" do test "all" do regex = GLib::Regex.new("1|2|3|4") modified_string = regex.replace(" 4 3 2 1") do |match_info| "to" end assert_equal(" to to to to", modified_string) end test "break" do regex = GLib::Regex.new("1|2|3|4") modified_string = regex.replace(" 4 3 2 1") do |match_info| break "to" end assert_equal(" to 3 2 1", modified_string) end end end sub_test_case "check_replacement" do test "no references" do assert_true(GLib::Regex.check_replacement("foo\\n")) end test "with references" do assert_true(GLib::Regex.check_replacement("\\0\\1")) end test "invalid" do assert_raise(GLib::Error) do GLib::Regex.check_replacement("\\") end end end sub_test_case "have_reference?" do test "no references" do assert do not GLib::Regex.have_reference?("foo\\n") end end test "with references" do assert do GLib::Regex.have_reference?("\\0\\1") end end end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-signal.rb000066400000000000000000000040271511343406000227540ustar00rootroot00000000000000# Copyright (C) 2015-2018 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 TestSignal < Test::Unit::TestCase def test_signal_flags assert_const_defined(GLib, :SignalFlags) assert_kind_of(GLib::SignalFlags, GLib::Signal::RUN_FIRST) assert_equal(GLib::SignalFlags::MASK, GLib::Signal::FLAGS_MASK) end def test_connect_flags assert_const_defined(GLib, :ConnectFlags) assert_kind_of(GLib::ConnectFlags, GLib::Signal::CONNECT_AFTER) end def test_signal_match_type assert_const_defined(GLib, :SignalMatchType) assert_kind_of(GLib::SignalMatchType, GLib::Signal::MATCH_ID) assert_equal(GLib::SignalMatchType::MASK, GLib::Signal::MATCH_MASK) end class CustomSignalObject < GLib::Object type_register define_signal(:changed, :run_first, nil, nil) attr_reader :n_changed def initialize super @n_changed = 0 end def signal_do_changed @n_changed += 1 end end def test_gc n = 10 custom_signal_object = CustomSignalObject.new n.times do custom_signal_object.signal_emit(:changed) GC.start end assert_equal(n, custom_signal_object.n_changed) end def test_inspect signal = CustomSignalObject.signal(:changed) assert_equal("\#", signal.inspect) end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-source.rb000066400000000000000000000032611511343406000227760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2013-2021 Ruby-GNOME 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 TestGLibSource < Test::Unit::TestCase include GLibTestUtils def test_time context = GLib::MainContext.default source = GLib::Idle.source_new id = source.attach(context) begin time = source.time assert_operator(0, :<, time) ensure GLib::Source.remove(id) end end def test_destroy context = GLib::MainContext.new source = GLib::Idle.source_new id = source.attach(context) assert_not_nil(context.find_source(id)) source.destroy assert_nil(context.find_source(id)) source = nil GC.start end def test_name source = GLib::Idle.source_new source_name = "glib source" source.name = source_name assert_equal(source_name, source.name) end def test_ready_time source = GLib::Idle.source_new ready_time = 5 source.ready_time = 5 assert_equal(ready_time, source.ready_time) end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-spawn.rb000066400000000000000000000035631511343406000226330ustar00rootroot00000000000000# Copyright (C) 2015-2022 Ruby-GNOME 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 require "rbconfig" class TestGLibSpawn < Test::Unit::TestCase include GLibTestUtils def setup end def teardown end def test_async_keep_environment if File.exist?('/bin/true') assert_nothing_raised do GLib::Spawn.async(Dir.pwd, ['/bin/true'], nil, 0) end end end def test_async_clear_environment only_not_windows only_not_scl if RbConfig.respond_to?(:ruby) ruby = RbConfig.ruby else ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['RUBY_INSTALL_NAME'] + RbConfig::CONFIG['EXEEXT']) end test_env_name = "RUBY_GLIB2_TEST" ENV[test_env_name] = "yes" pid = GLib::Spawn.async(Dir.pwd, [ ruby, "-e", "exit(!ENV.key?(#{test_env_name.dump}))", ], [], GLib::Spawn::DO_NOT_REAP_CHILD) _, status = *Process.waitpid2(pid) assert do status.success? end end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-time-zone.rb000066400000000000000000000024771511343406000234150ustar00rootroot00000000000000# Copyright (C) 2016-2024 Ruby-GNOME 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 TestTimeZone < Test::Unit::TestCase include GLibTestUtils sub_test_case "new" do test "local" do local_1 = GLib::TimeZone.local local_2 = GLib::TimeZone.new assert_equal(local_1.abbreviation(0), local_2.abbreviation(0)) end test "UTC" do utc_1 = GLib::TimeZone.utc utc_2 = GLib::TimeZone.new("UTC") assert_equal(utc_1.offset(0), utc_2.offset(0)) end end def test_identifier only_glib_version(2, 58, 0) utc = GLib::TimeZone.new("UTC") assert_equal("UTC", utc.identifier) end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-timeout.rb000066400000000000000000000025621511343406000231670ustar00rootroot00000000000000# Copyright (C) 2015-2021 Ruby-GNOME 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 TestGLibTimeout < Test::Unit::TestCase include GLibTestUtils def setup @id = nil end def teardown GLib::Source.remove(@id) if @id end def test_timeout_add_priority priority = GLib::PRIORITY_HIGH @id = GLib::Timeout.add(10, priority) source = GLib::MainContext.default.find_source(@id) assert_equal(priority, source.priority) end def test_timeout_add_seconds_priority priority = GLib::PRIORITY_HIGH @id = GLib::Timeout.add_seconds(10, priority) source = GLib::MainContext.default.find_source(@id) assert_equal(priority, source.priority) end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-type-interface.rb000066400000000000000000000025001511343406000244100ustar00rootroot00000000000000# Copyright (C) 2017 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 TestTypeInterface < Test::Unit::TestCase sub_test_case("#append_features") do def test_not_instantiatable plain_class = Class.new assert_raise(TypeError.new("Not a subclass of GLib::Instantiatable")) do plain_class.class_eval do include GLib::TypePlugin end end end def test_instantiatable gobject_class = Class.new(GLib::Object) gobject_class.class_eval do include GLib::TypePlugin end assert do gobject_class.method_defined?(:use) end end end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-type.rb000066400000000000000000000034041511343406000224560ustar00rootroot00000000000000# Copyright (C) 2019 Ruby-GNOME 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 TestGLibType < Test::Unit::TestCase sub_test_case(".try_convert") do def test_nil assert_equal(GLib::Type::INVALID, GLib::Type.try_convert(nil)) end def test_type assert_equal(GLib::Type::STRING, GLib::Type.try_convert(GLib::Type::STRING)) end def test_integer assert_equal(GLib::Type::STRING, GLib::Type.try_convert(GLib::Type::STRING.to_i)) end def test_string assert_equal(GLib::Type::STRING, GLib::Type.try_convert("gchararray")) end def test_symbol assert_equal(GLib::Type::STRING, GLib::Type.try_convert(:gchararray)) end def test_nonexistent assert_nil(GLib::Type.try_convert(:nonexistent)) end def test_unconvertable assert_nil(GLib::Type.try_convert([])) end end sub_test_case(".[]") do def test_nil assert_equal(GLib::Type::INVALID, GLib::Type[nil]) end end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-unicode.rb000066400000000000000000000305301511343406000231230ustar00rootroot00000000000000# Copyright (C) 2015-2024 Ruby-GNOME 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 TestGLibUnicode < Test::Unit::TestCase include GLibTestUtils def test_gunicode_type assert_nothing_raised do GLib::Unicode::CONTROL end end def test_gunicode_break_type assert_nothing_raised do GLib::Unicode::BREAK_MANDATORY end end def test_unichar_alnum? assert(GLib::UniChar.alnum?(unichar("a"))) assert(GLib::UniChar.alnum?(unichar("1"))) assert(!GLib::UniChar.alnum?(unichar("!"))) end def test_unichar_alpha? assert(GLib::UniChar.alpha?(unichar("a"))) assert(GLib::UniChar.alpha?(unichar("A"))) assert(!GLib::UniChar.alpha?(unichar("1"))) end def test_unichar_cntrl? assert(GLib::UniChar.cntrl?(unichar("\t"))) assert(!GLib::UniChar.cntrl?(unichar("\h"))) assert(!GLib::UniChar.cntrl?(unichar("a"))) assert(!GLib::UniChar.cntrl?(unichar("1"))) end def test_unichar_digit? assert(GLib::UniChar.digit?(unichar("1"))) assert(!GLib::UniChar.digit?(unichar("a"))) end def test_unichar_graph? assert(GLib::UniChar.graph?(unichar("a"))) assert(!GLib::UniChar.graph?(unichar(" "))) assert(!GLib::UniChar.graph?(unichar("\t"))) end def test_unichar_lower? assert(GLib::UniChar.lower?(unichar("a"))) assert(!GLib::UniChar.lower?(unichar("A"))) assert(!GLib::UniChar.lower?(unichar("1"))) end def test_unichar_print? assert(GLib::UniChar.print?(unichar("a"))) assert(GLib::UniChar.print?(unichar(" "))) assert(!GLib::UniChar.print?(unichar("\t"))) end def test_unichar_punct? assert(GLib::UniChar.punct?(unichar(","))) assert(GLib::UniChar.punct?(unichar("."))) assert(!GLib::UniChar.punct?(unichar("a"))) assert(!GLib::UniChar.punct?(unichar("\t"))) end def test_unichar_space? assert(GLib::UniChar.space?(unichar(" "))) assert(GLib::UniChar.space?(unichar("\t"))) assert(GLib::UniChar.space?(unichar("\r"))) assert(GLib::UniChar.space?(unichar("\n"))) assert(!GLib::UniChar.space?(unichar("a"))) end def test_unichar_upper? assert(GLib::UniChar.upper?(unichar("A"))) assert(!GLib::UniChar.upper?(unichar("a"))) assert(!GLib::UniChar.upper?(unichar("1"))) end def test_unichar_xdigit? assert(GLib::UniChar.xdigit?(unichar("1"))) assert(GLib::UniChar.xdigit?(unichar("a"))) assert(GLib::UniChar.xdigit?(unichar("A"))) assert(GLib::UniChar.xdigit?(unichar("F"))) assert(!GLib::UniChar.xdigit?(unichar("X"))) end def test_unichar_title? end def test_unichar_defined? end def test_unichar_wide? assert(GLib::UniChar.wide?(unichar("ã‚"))) assert(GLib::UniChar.wide?(unichar("A"))) assert(!GLib::UniChar.wide?(unichar("a"))) end def test_unichar_wide_cjk? assert(GLib::UniChar.wide_cjk?(unichar("ã‚"))) assert(GLib::UniChar.wide_cjk?(0xD55C)) # HANGUL SYLLABLE HAN assert(!GLib::UniChar.wide_cjk?(unichar("a"))) end def test_unichar_to_upper assert_equal(unichar("A"), GLib::UniChar.to_upper(unichar("a"))) assert_equal(unichar("A"), GLib::UniChar.to_upper(unichar("A"))) assert_equal(unichar("*"), GLib::UniChar.to_title(unichar("*"))) end def test_unichar_to_lower assert_equal(unichar("a"), GLib::UniChar.to_lower(unichar("A"))) assert_equal(unichar("a"), GLib::UniChar.to_lower(unichar("a"))) assert_equal(unichar("*"), GLib::UniChar.to_title(unichar("*"))) end def test_unichar_to_title assert_equal(unichar("A"), GLib::UniChar.to_title(unichar("a"))) assert_equal(unichar("A"), GLib::UniChar.to_title(unichar("A"))) assert_equal(unichar("*"), GLib::UniChar.to_title(unichar("*"))) end def test_unichar_digit_value assert_equal(0, GLib::UniChar.digit_value(unichar("0"))) assert_equal(9, GLib::UniChar.digit_value(unichar("9"))) assert_equal(-1, GLib::UniChar.digit_value(unichar("a"))) end def test_unichar_xdigit_value assert_equal(0, GLib::UniChar.xdigit_value(unichar("0"))) assert_equal(9, GLib::UniChar.xdigit_value(unichar("9"))) assert_equal(10, GLib::UniChar.xdigit_value(unichar("a"))) assert_equal(15, GLib::UniChar.xdigit_value(unichar("F"))) assert_equal(-1, GLib::UniChar.xdigit_value(unichar("g"))) end def test_unichar_type assert_equal(GLib::Unicode::DECIMAL_NUMBER, GLib::UniChar.type(unichar("0"))) assert_equal(GLib::Unicode::LOWERCASE_LETTER, GLib::UniChar.type(unichar("a"))) assert_equal(GLib::Unicode::UPPERCASE_LETTER, GLib::UniChar.type(unichar("A"))) end def test_unichar_break_type assert_equal(GLib::Unicode::BREAK_HYPHEN, GLib::UniChar.break_type(unichar("-"))) assert_equal(GLib::Unicode::BREAK_NUMERIC, GLib::UniChar.break_type(unichar("0"))) end def test_unicode_canonical_ordering original = [unichar("a"), 0x0308, 0x0323, unichar("e"), 0x0304, 0x0301, 0x0323].pack("U*") expected = [unichar("a"), 0x0323, 0x0308, unichar("e"), 0x0323, 0x0304, 0x0301].pack("U*") assert_equal(utf8_to_utf32(expected), GLib::Unicode.canonical_ordering(utf8_to_utf32(original))) end def test_unichar_compose a_with_acute = 0x00E1 assert_equal(a_with_acute, GLib::UniChar.compose(unichar("a"), 0x0301)) hiragana_ga = 0x304C hiragana_ka = 0x304B assert_equal(hiragana_ga, GLib::UniChar.compose(hiragana_ka, 0x3099)) end def test_unichar_decompose a_with_acute = 0x00E1 expected = [unichar("a"), 0x0301].pack("U*") assert_equal(utf8_to_utf32(expected), GLib::UniChar.decompose(a_with_acute)) hiragana_ga = 0x304C hiragana_ka = 0x304B expected = [hiragana_ka, 0x3099].pack("U*") assert_equal(utf8_to_utf32(expected), GLib::UniChar.decompose(hiragana_ga)) end def test_unichar_get_mirror_char assert_equal(unichar("("), GLib::UniChar.get_mirror_char(unichar(")"))) assert_equal(unichar(")"), GLib::UniChar.get_mirror_char(unichar("("))) assert_equal(unichar("x"), GLib::UniChar.get_mirror_char(unichar("x"))) end def test_unichar_get_script assert_equal(GLib::Unicode::SCRIPT_HIRAGANA, GLib::UniChar.get_script(unichar("ã‚"))) end def test_utf8_get_char assert_equal(utf8_to_utf32("ã‚").unpack("L*")[0], GLib::UTF8.get_char("ã‚")) assert_equal(utf8_to_utf32("ã‚").unpack("L*")[0], GLib::UTF8.get_char("ã‚", true)) partial_input = "ã‚".unpack("c*")[0..-2].pack("c*") assert_equal(-2, GLib::UTF8.get_char(partial_input, true)) invalid_input = "ã‚".unpack("c*")[2..-1].pack("c*") assert_equal(-1, GLib::UTF8.get_char(invalid_input, true)) end def test_utf8_size assert_equal(1, GLib::UTF8.size("ã‚")) assert_equal(2, GLib::UTF8.size("ã‚ã„")) end def test_utf8_reverse assert_equal("ãŠãˆã†ã„ã‚", GLib::UTF8.reverse("ã‚ã„ã†ãˆãŠ")) end def test_utf8_validate assert(GLib::UTF8.validate("ã‚")) assert(!GLib::UTF8.validate(binary("ã‚")[1..-1])) end def test_utf8_upcase assert_equal("ABCã‚ã„ã†", GLib::UTF8.upcase("aBcã‚ã„ã†")) end def test_utf8_downcase assert_equal("abcã‚ã„ã†", GLib::UTF8.downcase("aBcã‚ã„ã†")) end def test_utf8_casefold assert_equal(GLib::UTF8.casefold("AbCã‚ã„ã†"), GLib::UTF8.casefold("aBcã‚ã„ã†")) end def test_utf8_normalize original = [0x00c1].pack("U*") # A with acute nfd = [0x0041, 0x0301].pack("U*") assert_equal(nfd, GLib::UTF8.normalize(original, GLib::NormalizeMode::NFD)) nfc = [0x00c1].pack("U*") assert_equal(nfc, GLib::UTF8.normalize(original, GLib::NormalizeMode::NFC)) nfkd = [0x0041, 0x0301].pack("U*") assert_equal(nfkd, GLib::UTF8.normalize(original, GLib::NormalizeMode::NFKD)) nfkc = [0x00c1].pack("U*") assert_equal(nfkc, GLib::UTF8.normalize(original, GLib::NormalizeMode::NFKC)) end def test_utf8_collate assert_operator(0, :>, GLib::UTF8.collate("ã‚", "ã„")) assert_operator(0, :<, GLib::UTF8.collate("ã„", "ã‚")) assert_equal(0, GLib::UTF8.collate("ã‚", "ã‚")) end def test_utf8_collate_key assert_operator(0, :>, GLib::UTF8.collate_key("ã‚") <=> GLib::UTF8.collate_key("ã„")) assert_operator(0, :<, GLib::UTF8.collate_key("ã„") <=> GLib::UTF8.collate_key("ã‚")) assert_equal(0, GLib::UTF8.collate_key("ã‚") <=> GLib::UTF8.collate_key("ã‚")) end def test_utf8_collate_key_for_filename assert_equal(["event.c", "event.h", "eventgenerator.c"], ["event.c", "eventgenerator.c", "event.h"].sort_by do |f| GLib::UTF8.collate_key(f, true) end) assert_equal(["file1", "file5", "file10"], ["file1", "file10", "file5"].sort_by do |f| GLib::UTF8.collate_key(f, true) end) end def test_utf8_to_utf16 assert_equal(utf8_to_utf16("ã‚ã„ã†ãˆãŠ"), GLib::UTF8.to_utf16("ã‚ã„ã†ãˆãŠ")) end def test_utf8_to_ucs4 assert_equal(utf8_to_utf32("ã‚ã„ã†ãˆãŠ"), GLib::UTF8.to_ucs4("ã‚ã„ã†ãˆãŠ")) assert_raise(GLib::ConvertError) do GLib::UTF8.to_ucs4(binary("ã‚ã„ã†ãˆãŠ")[1..-1]) end assert_nothing_raised do GLib::UTF8.to_ucs4(binary("ã‚ã„ã†ãˆãŠ")[1..-1], true) end end def test_utf16_to_ucs4 assert_equal(utf8_to_utf32("ã‚ã„ã†ãˆãŠ"), GLib::UTF16.to_ucs4(utf8_to_utf16("ã‚ã„ã†ãˆãŠ"))) end def test_utf16_to_utf8 assert_equal("ã‚ã„ã†ãˆãŠ", GLib::UTF16.to_utf8(utf8_to_utf16("ã‚ã„ã†ãˆãŠ"))) end def test_ucs4_to_utf16 assert_equal(utf8_to_utf16("ã‚ã„ã†ãˆãŠ"), GLib::UCS4.to_utf16(utf8_to_utf32("ã‚ã„ã†ãˆãŠ"))) assert_raise(GLib::ConvertError) do GLib::UCS4.to_utf16(binary(utf8_to_utf32("ã‚ã„ã†ãˆãŠ"))[1..-1]) end end def test_ucs4_to_utf8 assert_equal("ã‚ã„ã†ãˆãŠ", GLib::UCS4.to_utf8(utf8_to_utf32("ã‚ã„ã†ãˆãŠ"))) end def test_unichar_to_utf8 assert_equal("ã‚", GLib::UniChar.to_utf8(utf8_to_utf32("ã‚").unpack("L*")[0])) end def test_unichar_combining_class assert_equal(0, GLib::UniChar.combining_class(unichar("a"))) assert_equal(230, GLib::UniChar.combining_class(unichar("Ì"))) end def test_unichar_mark? assert(!GLib::UniChar.mark?(unichar("a"))) assert(!GLib::UniChar.mark?(0x200E)) # LEFT-TO-RIGHT MARK assert(GLib::UniChar.mark?(0x1DC3)) # COMBINING SUSPENSION MARK end def test_unichar_zero_width? assert(!GLib::UniChar.zero_width?(unichar("a"))) assert(GLib::UniChar.zero_width?(0x200B)) # ZERO WIDTH SPACE end private def unichar(char) GLib::UTF8.get_char(char) end def utf8_to_utf32(string) if string.respond_to?(:encode) if little_endian? string.encode("UTF-32LE") else string.encode("UTF-32BE") end else require_uconv Uconv.u8tou4(string) end end def utf8_to_utf16(string) if string.respond_to?(:encode) if little_endian? string.encode("UTF-16LE") else string.encode("UTF-16BE") end else require_uconv Uconv.u8tou16(string) end end def require_uconv require 'uconv' rescue LoadError omit("Need uconv to run this test.") end def binary(string) if string.respond_to?(:b) string.b else string end end def little_endian? [1].pack("v") == [1].pack("S") end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-utils.rb000066400000000000000000000031711511343406000226360ustar00rootroot00000000000000# Copyright (C) 2015-2024 Ruby-GNOME 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 TestGLibUtils < Test::Unit::TestCase include GLibTestUtils def test_user_cache_dir assert_kind_of(String, GLib.user_cache_dir) end def test_user_data_dir assert_kind_of(String, GLib.user_data_dir) end def test_user_config_dir assert_kind_of(String, GLib.user_config_dir) end def test_system_data_dirs assert_kind_of(Array, GLib.system_data_dirs) end def test_system_config_dirs assert_kind_of(Array, GLib.system_config_dirs) end def test_get_user_special_dir assert_nothing_raised do GLib.get_user_special_dir(GLib::UserDirectory::DESKTOP) end end def test_get_os_info only_glib_version(2, 64, 0) assert_kind_of(String, GLib.get_os_info(GLib::OSInfoKey::NAME)) end def test_get_os_info_symbol only_glib_version(2, 64, 0) assert_kind_of(String, GLib.get_os_info(:name)) end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-value.rb000066400000000000000000000042001511343406000226040ustar00rootroot00000000000000# Copyright (C) 2013-2025 Ruby-GNOME 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 TestGLibValue < Test::Unit::TestCase include GLibTestUtils sub_test_case(".try_convert") do def test_string assert_equal(GLib::Type::STRING, GLib::Value.try_convert("Hello").type) end def test_integer_negative_small assert_equal(GLib::Type::INT, GLib::Value.try_convert(-(2 ** 31)).type) end def test_integer_negative_large assert_equal(GLib::Type::INT64, GLib::Value.try_convert(-(2 ** 31 + 1)).type) end def test_integer_zero assert_equal(GLib::Type::UINT, GLib::Value.try_convert(0).type) end def test_integer_positive_small assert_equal(GLib::Type::UINT, GLib::Value.try_convert(2 ** 32 - 1).type) end def test_integer_positive_large assert_equal(GLib::Type::UINT64, GLib::Value.try_convert(2 ** 32).type) end def test_float assert_equal(GLib::Type::DOUBLE, GLib::Value.try_convert(-0.0).type) end end def test_type value = GLib::Value.new(GLib::Type::UINT, 29) assert_equal(GLib::Type::UINT, value.type) end def test_value value = GLib::Value.new(GLib::Type::UINT, 29) assert_equal(29, value.value) end def test_no_value value = GLib::Value.new(GLib::Type::UINT) assert_equal(0, value.value) end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-variant-dict.rb000066400000000000000000000023121511343406000240570ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 TestGLibVariantDict < Test::Unit::TestCase include GLibTestUtils def setup @dict = GLib::VariantDict.new @dict.insert("hello", GLib::Variant.new("world", "s")) end def test_lookup assert_equal("world", @dict.lookup("hello", "s")) end def test_contains_true assert do @dict.contains?("hello") end end def test_contains_false assert do not @dict.contains?("nonexistent") end end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-variant-type.rb000066400000000000000000000203601511343406000241200ustar00rootroot00000000000000# Copyright (C) 2015-2025 Ruby-GNOME 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 TestGLibVariantType < Test::Unit::TestCase include GLibTestUtils sub_test_case "constants" do test "BOOLEAN" do assert_equal("b", GLib::VariantType::BOOLEAN.to_s) end test "BYTE" do assert_equal("y", GLib::VariantType::BYTE.to_s) end test "INT16" do assert_equal("n", GLib::VariantType::INT16.to_s) end test "UINT16" do assert_equal("q", GLib::VariantType::UINT16.to_s) end test "INT32" do assert_equal("i", GLib::VariantType::INT32.to_s) end test "UINT32" do assert_equal("u", GLib::VariantType::UINT32.to_s) end test "INT64" do assert_equal("x", GLib::VariantType::INT64.to_s) end test "UINT64" do assert_equal("t", GLib::VariantType::UINT64.to_s) end test "HANDLE" do assert_equal("h", GLib::VariantType::HANDLE.to_s) end test "DOUBLE" do assert_equal("d", GLib::VariantType::DOUBLE.to_s) end test "STRING" do assert_equal("s", GLib::VariantType::STRING.to_s) end test "OBJECT_PATH" do assert_equal("o", GLib::VariantType::OBJECT_PATH.to_s) end test "SIGNATURE" do assert_equal("g", GLib::VariantType::SIGNATURE.to_s) end test "VARIANT" do assert_equal("v", GLib::VariantType::VARIANT.to_s) end test "ANY" do assert_equal("*", GLib::VariantType::ANY.to_s) end test "BASIC" do assert_equal("?", GLib::VariantType::BASIC.to_s) end test "MAYBE" do assert_equal("m*", GLib::VariantType::MAYBE.to_s) end test "ARRAY" do assert_equal("a*", GLib::VariantType::ARRAY.to_s) end test "TUPLE" do assert_equal("r", GLib::VariantType::TUPLE.to_s) end test "UNIT" do assert_equal("()", GLib::VariantType::UNIT.to_s) end test "DICT_ENTRY" do assert_equal("{?*}", GLib::VariantType::DICT_ENTRY.to_s) end test "DICTIONARY" do assert_equal("a{?*}", GLib::VariantType::DICTIONARY.to_s) end test "STRING_ARRAY" do assert_equal("as", GLib::VariantType::STRING_ARRAY.to_s) end test "OBJECT_PATH_ARRAY" do assert_equal("ao", GLib::VariantType::OBJECT_PATH_ARRAY.to_s) end test "BYTESTRING" do assert_equal("ay", GLib::VariantType::BYTESTRING.to_s) end test "BYTESTRING_ARRAY" do assert_equal("aay", GLib::VariantType::BYTESTRING_ARRAY.to_s) end test "VARDICT" do assert_equal("a{sv}", GLib::VariantType::VARDICT.to_s) end end sub_test_case ".valid?" do test "valid" do assert do GLib::VariantType.valid?("s") end end test "invalid" do assert do !GLib::VariantType.valid?("X") end end end sub_test_case ".scan" do test "found" do assert_equal("X", GLib::VariantType.scan("sX")) end test "not found" do assert_nil(GLib::VariantType.scan("X")) end end sub_test_case ".try_convert" do test "String" do assert_equal(GLib::VariantType::STRING, GLib::VariantType.try_convert("s")) end test "Symbol: found" do assert_equal(GLib::VariantType::STRING, GLib::VariantType.try_convert(:string)) end test "Symbol: not found" do assert_nil(GLib::VariantType.try_convert(:nonexistent)) end end sub_test_case "#initialize" do test "invalid" do assert_raise(ArgumentError.new("invalid type string: \"X\"")) do GLib::VariantType.new("X") end end end test "#to_s" do variant_type = GLib::VariantType.new("s") assert_equal("s", variant_type.to_s) end sub_test_case "#definite?" do test "definite" do variant_type = GLib::VariantType.new("s") assert do variant_type.definite? end end test "not definite" do variant_type = GLib::VariantType.new("?") assert do !variant_type.definite? end end end sub_test_case "#container?" do test "container" do variant_type = GLib::VariantType.new("a*") assert do variant_type.container? end end test "not container" do variant_type = GLib::VariantType.new("s") assert do !variant_type.container? end end end sub_test_case "#basic?" do test "basic" do variant_type = GLib::VariantType.new("s") assert do variant_type.basic? end end test "not basic" do variant_type = GLib::VariantType.new("as") assert do !variant_type.basic? end end end sub_test_case "#maybe?" do test "maybe" do variant_type = GLib::VariantType.new("ms") assert do variant_type.maybe? end end test "not maybe" do variant_type = GLib::VariantType.new("s") assert do !variant_type.maybe? end end end sub_test_case "#array?" do test "array" do variant_type = GLib::VariantType.new("as") assert do variant_type.array? end end test "not array" do variant_type = GLib::VariantType.new("s") assert do !variant_type.array? end end end sub_test_case "#tuple?" do test "tuple" do variant_type = GLib::VariantType.new("(s)") assert do variant_type.tuple? end end test "not tuple" do variant_type = GLib::VariantType.new("s") assert do !variant_type.tuple? end end end sub_test_case "#dict_entry?" do test "dictionary entry" do variant_type = GLib::VariantType.new("{ss}") assert do variant_type.dict_entry? end end test "not dictionary entry" do variant_type = GLib::VariantType.new("s") assert do !variant_type.dict_entry? end end end sub_test_case "#variant?" do test "variant" do variant_type = GLib::VariantType.new("v") assert do variant_type.variant? end end test "not variant" do variant_type = GLib::VariantType.new("s") assert do !variant_type.variant? end end end sub_test_case "#==" do test "same" do variant_type = GLib::VariantType.new("s") assert_equal(variant_type, variant_type) end test "equivalence" do assert_equal(GLib::VariantType.new("s"), GLib::VariantType.new("s")) end test "not VariantType" do assert_not_equal(GLib::VariantType.new("s"), "s") end end sub_test_case "#hash and #eql?" do test "Hash key" do hash = { GLib::VariantType.new("s") => :s, } assert_equal(:s, hash[GLib::VariantType.new("s")]) end end sub_test_case "#is_subtype_of?" do test "subtype" do string = GLib::VariantType.new("s") basic = GLib::VariantType.new("?") assert do string.is_subtype_of?(basic) end end test "not subtype" do string = GLib::VariantType.new("s") int32 = GLib::VariantType.new("i") assert do !string.is_subtype_of?(int32) end end end sub_test_case "#element" do test "array" do assert_equal(GLib::VariantType.new("s"), GLib::VariantType.new("as").element) end test "maybe" do assert_equal(GLib::VariantType.new("s"), GLib::VariantType.new("ms").element) end test "unexpected" do assert_raise(ArgumentError.new("must be array or maybe type: ")) do GLib::VariantType.new("s").element end end end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-variant.rb000066400000000000000000000042461511343406000231460ustar00rootroot00000000000000# Copyright (C) 2018-2022 Ruby-GNOME 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 TestGLibVariant < Test::Unit::TestCase include GLibTestUtils sub_test_case ".parse" do test "no type" do variant = GLib::Variant.parse("'hello'") assert_equal([GLib::VariantType::STRING, "hello"], [variant.type, variant.value]) end test "type" do variant = GLib::Variant.parse("29", "y") assert_equal([GLib::VariantType::BYTE, 29], [variant.type, variant.value]) end test "garbage" do message = <<-MESSAGE expected end of input: 29 hello ^ MESSAGE assert_raise(GLib::VariantParseError::InputNotAtEnd.new(message)) do GLib::Variant.parse("29 hello", "y") end end end sub_test_case "#initialize" do test "type: string" do variant = GLib::Variant.new("hello", "s") assert_equal([GLib::VariantType::STRING, "hello"], [variant.type, variant.value]) end end sub_test_case "#to_s" do test "default" do variant = GLib::Variant.new(29, "y") assert_equal("0x1d", variant.to_s) end test "type_annotate:" do variant = GLib::Variant.new(29, "y") assert_equal("byte 0x1d", variant.to_s(type_annotate: true)) end end test "#inspect" do variant = GLib::Variant.new(29, "y") assert_equal("#", variant.inspect.gsub(/0x\h+/, "0x00")) end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-version.rb000066400000000000000000000033671511343406000231720ustar00rootroot00000000000000# Copyright (C) 2015 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 TestGLibVersion < Test::Unit::TestCase include GLibTestUtils test "STRING" do major = GLib::Version::MAJOR minor = GLib::Version::MINOR micro = GLib::Version::MICRO assert_equal([major, minor, micro].join("."), GLib::Version::STRING) end sub_test_case("#or_later?") do test "same" do assert_true(GLib::Version.or_later?(GLib::Version::MAJOR, GLib::Version::MINOR, GLib::Version::MICRO)) end test "later" do assert_true(GLib::Version.or_later?(GLib::Version::MAJOR, GLib::Version::MINOR - 1, GLib::Version::MICRO)) end test "earlier" do assert_false(GLib::Version.or_later?(GLib::Version::MAJOR, GLib::Version::MINOR + 1, GLib::Version::MICRO)) end end end ruby-gnome-ruby-gnome-25972cb/glib2/test/test-win32.rb000066400000000000000000000023051511343406000224360ustar00rootroot00000000000000# Copyright (C) 2015-2025 Ruby-GNOME 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 TestGLibWin32 < Test::Unit::TestCase include GLibTestUtils def test_get_package_install_directory_of_module only_windows if ENV["GITHUB_ACTIONS"] == "true" omit("We can't detect suitable expected on GitHub Actions") end expected = Pathname(RbConfig.ruby).parent.parent.to_s actual = GLib::Win32.get_package_installation_directory_of_module assert_equal(expected, normalize_path(actual)) end end ruby-gnome-ruby-gnome-25972cb/glib2/version.rb000066400000000000000000000022551511343406000212310ustar00rootroot00000000000000# Copyright (C) 2018 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 def ruby_glib2_version env_version = ENV["RUBY_GLIB2_VERSION"] return env_version if env_version versions = {} File.open("#{__dir__}/ext/glib2/rbglib.h") do |rbglib_h| rbglib_h.each_line do |line| if /#define\s+RBGLIB_([A-Z]+)_VERSION\s+(\d+)/ =~ line versions[$1.downcase] = $2.to_i end end end ["major", "minor", "micro"].collect {|type| versions[type]}.compact.join(".") end ruby-gnome-ruby-gnome-25972cb/gnumeric/000077500000000000000000000000001511343406000200255ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gnumeric/.yardopts000066400000000000000000000016531511343406000217000ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/Gnumeric lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/gnumeric/COPYING.LIB000066400000000000000000000636421511343406000215000ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/gnumeric/README.md000066400000000000000000000010111511343406000212750ustar00rootroot00000000000000# Ruby/Gnumeric Ruby/Gnumeric is a Ruby binding of Gnumeric. ## Requirements * Ruby/GOffice in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [Gnumeric](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 * https://ruby-gnome.github.io/ * https://github.com/ruby-gnome/ruby-gnome ruby-gnome-ruby-gnome-25972cb/gnumeric/Rakefile000066400000000000000000000020111511343406000214640ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2016-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/gnumeric/dependency-check/000077500000000000000000000000001511343406000232165ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gnumeric/dependency-check/Rakefile000066400000000000000000000030011511343406000246550ustar00rootroot00000000000000# Copyright (C) 2017 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 require "pkg-config" require "native-package-installer" if File.exist?(File.join(__dir__, "..", "vendor")) task :default => "nothing" else task :default => "dependency:check" end task :nothing do end namespace :dependency do desc "Check dependency" task :check do require "gobject-introspection" repository = GObjectIntrospection::Repository.default begin repository.require("Gnm") rescue GObjectIntrospection::RepositoryError::TypelibNotFound unless NativePackageInstaller.install(:arch_linux => "gnumeric", :debian => "gir1.2-gnumeric", :redhat => "pkgconfig(libspreadsheet-1.12)") exit(false) end end end end ruby-gnome-ruby-gnome-25972cb/gnumeric/gnumeric.gemspec000066400000000000000000000035761511343406000232160ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "gnumeric" s.summary = "Ruby/Gnumeric is a Ruby binding of Gnumeric." s.description = "Ruby/Gnumeric is a Ruby binding of Gnumeric." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["dependency-check/Rakefile"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "dependency-check/Rakefile", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("goffice", "= #{s.version}") s.add_runtime_dependency("rake") [ ["alpine_linux", "gnumeric-dev"], ["arch_linux", "gnumeric"], ["debian", "gir1.2-gnumeric"], ["rhel", "pkgconfig(libspreadsheet-1.12)"], ].each do |platform, package| s.requirements << "system: libspreadsheet-1.12: #{platform}: #{package}" end end ruby-gnome-ruby-gnome-25972cb/gnumeric/lib/000077500000000000000000000000001511343406000205735ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gnumeric/lib/gnm.rb000066400000000000000000000025631511343406000217070ustar00rootroot00000000000000# Copyright (C) 2016-2018 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 require "goffice" require "gnm/loader" module Gnm LOG_DOMAIN = "Gnumeric" GLib::Log.set_log_domain(LOG_DOMAIN) 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 GOffice.init if GOffice.respond_to?(:init) loader = Loader.new(self) loader.load("Gnm") init class << self remove_method(:init) end end end end ruby-gnome-ruby-gnome-25972cb/gnumeric/lib/gnm/000077500000000000000000000000001511343406000213545ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gnumeric/lib/gnm/loader.rb000066400000000000000000000033671511343406000231600ustar00rootroot00000000000000# Copyright (C) 2016-2021 Ruby-GNOME 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_info(info) case info.name when "signtest_type", "ttest_type", /_t\z/ # Ignore enum that don't support introspection return end super end def load_enum_value(value_info, enum_module) name = value_info.name.upcase case name when "3D_NAME" name = "NAME_3D" end enum_module.const_set(name, value_info.value) end def load_flags_info(info) case info.name when /_t\z/ # Ignore flags that don't support introspection return end super end def rubyish_method_name(function_info, options={}) name = super case name when /\A\d/ "_#{$POSTMATCH}" else name end end end end ruby-gnome-ruby-gnome-25972cb/gnumeric/lib/gnumeric.rb000066400000000000000000000014301511343406000227270ustar00rootroot00000000000000# 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 require "gnm" ruby-gnome-ruby-gnome-25972cb/gnumeric/test/000077500000000000000000000000001511343406000210045ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gnumeric/test/fixtures/000077500000000000000000000000001511343406000226555ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gnumeric/test/fixtures/hello.gnumeric000066400000000000000000000034131511343406000255140ustar00rootroot00000000000000‹íZ_oÛ6ï§Ð4 oñß8mÔÄ…“8‰Ç1l%]; -Ñ6ŠÔ(:Žû¸¾ìíeߦ_dGR’e9iÒµ@[L ˆÇ»ãÇ»ã@^ß…ÔºÅ"&œÚõJͶ0óy@ØìоrOw^Ú¯ÛÏf,tÞpq3áüÆ; :´çRFNµº\.+3¶± ~…‹Yõ¶^«2°Ý»˜lè.›Z«Q«Õ«¿\ôÇþ‡h‡°X"æc°Š‰kaŸûHjl.µ_¹‹»ý̲4Ìk³«q[²­ ô;ðÕ€OÂÔgcß¶N”ª×V3ûŽ”‚LÇJTY"e(Äí4,×/'žó¥7炼çL"êžà”N8¨fy·ˆ.pÛ]u‚›…«÷¬üÐÀéJâX—X‰<‰&ñ7p-$÷|F«Ôú&0HìE‚áK|Ài§?~‚‚HgïŸN‰aÓ>T “;!–(©I3uh/s8ŠI¬ÄŽôa–š8ymG7ˆ¤¦)a7÷Uu}¿ªgSÕÀÏô¢… Z+ð«˜bµB\…"¬¦º áSA)Ý<$Îy¶R7 ÓV³[5cÛJ6“k{ ;‰k2¥2¸A~Mb2!”ÈÕ¡}6¸ðÆçÝ®ë]÷ƽ£^¿ç¾5Ÿý®m)h€H]¾5~íV§£X<ûA±!BÞ‚‹vÍL'£‚ì1§ Fy…wœ‡íĽþ.‚ˆSIX&Ê·ó¡ Lz(ßíö]há?º§?mµðœZÄc¢j¯ÝI°e‚5š­<ŠP'ŽçIñ£Ÿÿ±àòÕúÌø«c^KâÐë`öز|˜“3 ‡[$¬!S•½ Èé¡ÀÓ+F 9ÃÐÔÔ†þ„KÉÃÏ2¡x*3ƒGõ…ªÏ1˜ëŠü‹)Þð4‹´ á3}îlÉU>‡{Íàr\›«¡Z°»U³°¾N ÕIŠ óÇfÐ žÅ·˜ydêqFW^,WÇ+‡œËÐ^Ö ‚3|pZªùÄ@µ[ƒp?¬¥§=¸8gÕ‡£ÞÀõ:Çnïºkºã–%pþíÀ“sØwBͬ¨GÔ±èòˆ¸™j¯g6mL»·úć¶zýdÏQ½úÕíýf[I3ß‚uj²¬h:„¼°Œý°sÖý„ƒA&µI |{7éZ²©4\s@ î"_ÓÁ|àŽ//.ºwìõÞ°ß9îng‹\Ä–n ]ý݉óº£ÑåhìuÆÞIo .ÞvOÖ> ¬‡š©€ÅÒQž)ÆOV!á"ÒwªŒÔ¥©ßÑ–7Z-=ÐrÅ%ZöVMkÖy‡’3ðÏ;ýÞÙÀ;뺣N®ÚÜܵ™;ºtÝË Ûz#Päâ;©WÏa;7.?%f<â2a~zòA)‚ÂŒ<±op ïs` ÖR`8½«­#äÕ?…'û]IH¶q­+;#àÄ x$ÝØj–ZPI¦]Õ•sN kéÁƒ™Úzð„¢6¼in° u¾˜ÍÄ$ÒðÛcÄ’—¤ò»ÙjÚbKÌàf2lž÷AÊ ­ .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) opener = nil # TODO: omit("opener can be nil but .gir file doesn't mark as nullable") io_context = GOffice::IOContext.new(command_context) view = Gnm::WorkbookView.new("file://#{input_path}", opener, 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 ruby-gnome-ruby-gnome-25972cb/gobject-introspection/000077500000000000000000000000001511343406000225275ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/.yardopts000066400000000000000000000016671511343406000244070ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/GObjectIntrospection lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/gobject-introspection/COPYING.LIB000066400000000000000000000636421511343406000242020ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/gobject-introspection/README.md000066400000000000000000000010431511343406000240040ustar00rootroot00000000000000# Ruby/GObjectIntrospection Ruby/GObjectIntrospection is a Ruby binding of GObject Introspect. ## Requirements * Ruby/GLib2 in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [GObject Introspection](http://live.gnome.org/GObjectIntrospection) ## Install gem install gobject-introspection ## License Copyright (c) 2013 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 https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/gobject-introspection/Rakefile000066400000000000000000000020111511343406000241660ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2012-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/000077500000000000000000000000001511343406000233275ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/000077500000000000000000000000001511343406000276425ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/depend000066400000000000000000000004511511343406000310240ustar00rootroot00000000000000install-so: install-headers install-headers: $(INSTALL_DATA) $(srcdir)/rb-gobject-introspection.h $(RUBYARCHDIR) install: install-pc install-pc: if test -n "$(pkgconfigdir)"; then \ $(MAKEDIRS) $(pkgconfigdir); \ $(INSTALL_DATA) ruby-gobject-introspection.pc $(pkgconfigdir);\ fi ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/extconf.rb000077500000000000000000000117711511343406000316470ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2012-2023 Ruby-GNOME 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 require "pathname" source_dir = Pathname(__FILE__).dirname base_dir = source_dir.parent.parent.expand_path top_dir = base_dir.parent.expand_path top_build_dir = Pathname(".").parent.parent.parent.expand_path mkmf_gnome2_dir = top_dir + "glib2" + "lib" $LOAD_PATH.unshift(mkmf_gnome2_dir.to_s) if mkmf_gnome2_dir.exist? module_name = "gobject_introspection" package_id = "gobject-introspection-1.0" require "mkmf-gnome" ["glib2"].each do |package| add_depend_package(package, "#{package}/ext/#{package}", top_dir.to_s, top_build_dir: top_build_dir.to_s) end unless required_pkg_config_package(package_id, :alt_linux => "gobject-introspection-devel", :conda => "gobject-introspection", :debian => "libgirepository1.0-dev", :redhat => "pkgconfig(gobject-introspection-1.0)", :homebrew => "gobject-introspection", :arch_linux => "gobject-introspection", :macports => "gobject-introspection", :msys2 => "gobject-introspection") exit(false) end # TODO: Remove this when we dropped support for GObject Introspection < 1.60 make_version_header("GI", package_id, ".") enum_type_prefix = "gobject-introspection-enum-types" include_paths = PKGConfig.cflags_only_I(package_id) headers = include_paths.split.inject([]) do |result, path| result + Dir.glob(File.join(path.sub(/^-I/, ""), "gi{repository,types}.h")) end glib_mkenums(enum_type_prefix, headers, "G_TYPE_", ["girepository.h"]) create_pkg_config_file("Ruby/GObjectIntrospection", package_id, ruby_gnome_version, "ruby-gobject-introspection.pc") ensure_objs $defs << "-DRUBY_GOBJECT_INTROSPECTION_COMPILATION" case RUBY_PLATFORM when /darwin/ symbols_in_external_bundles = [ "_g_rclosure_attach", "_g_rclosure_attach_gobject", "_g_rclosure_new", "_g_signal_flags_get_type", "_rbg_cGLibObject", "_rbg_cstr2rval", "_rbg_cstr2rval_free", "_rbg_define_method", "_rbg_define_singleton_method", "_rbg_filename_from_ruby", "_rbg_filename_to_ruby", "_rbg_glist2rval", "_rbg_glist2rval_with_type", "_rbg_gslist2rval", "_rbg_gslist2rval_with_type", "_rbg_inspect", "_rbg_is_bytes", "_rbg_is_object", "_rbg_is_value", "_rbg_mGLib", "_rbg_rval2cstr", "_rbg_rval2cstr_accept_nil", "_rbg_rval2cstr_accept_symbol", "_rbg_rval2filenamev", "_rbg_rval2glist", "_rbg_rval2gslist", "_rbg_rval2strv", "_rbg_rval2strv_dup", "_rbg_scan_options", "_rbg_strv2rval", "_rbg_to_array", "_rbg_variant_from_ruby", "_rbg_variant_to_ruby", "_rbgerr_define_gerror", "_rbgerr_gerror2exception", "_rbgerr_ruby_error_quark", "_rbgobj_add_relative", "_rbgobj_boxed_get", "_rbgobj_boxed_unown", "_rbgobj_constant_remap", "_rbgobj_convert_define", "_rbgobj_define_class", "_rbgobj_get_enum", "_rbgobj_get_flags", "_rbgobj_get_ruby_object_from_gobject", "_rbgobj_gobject_initialize", "_rbgobj_gtype_from_ruby", "_rbgobj_gtype_new", "_rbgobj_initialize_gvalue", "_rbgobj_initialize_object", "_rbgobj_instance_from_ruby_object", "_rbgobj_instance_unref", "_rbgobj_lookup_class", "_rbgobj_make_boxed", "_rbgobj_make_boxed_default", "_rbgobj_make_boxed_raw", "_rbgobj_make_enum", "_rbgobj_make_flags", "_rbgobj_object_add_relative", "_rbgobj_object_alloc_func", "_rbgobj_object_remove_relative", "_rbgobj_remove_relative", "_rbgobj_ruby_object_from_instance", "_rbgobj_ruby_object_from_instance2", "_rbgutil_invoke_callback", "_rbgutil_on_callback_error", "_rbgutil_start_callback_dispatch_thread", ] symbols_in_external_bundles.each do |symbol| $DLDFLAGS << " -Wl,-U,#{symbol}" end end create_makefile(module_name) pkg_config_dir = with_config("pkg-config-dir") if pkg_config_dir.is_a?(String) File.open("Makefile", "ab") do |makefile| makefile.puts makefile.puts("pkgconfigdir=#{pkg_config_dir}") end end gobject_introspection.def000066400000000000000000000003241511343406000346370ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspectionEXPORTS Init_gobject_introspection rb_gi_callback_data_free rb_gi_callback_data_get_metadata rb_gi_callback_data_get_rb_callback rb_gi_callback_register_finder rb_gi_struct_new_raw rb_gi_struct_get_raw ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-arg-info.c000066400000000000000000000125671511343406000325210ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIArgInfo #define SELF(self) (RVAL2GI_ARG_INFO(self)) gboolean rb_gi_arg_info_is_input_buffer(GIArgInfo *info) { if (g_arg_info_get_direction(info) != GI_DIRECTION_IN) { return FALSE; } /* Heuristic */ const gchar *name = g_base_info_get_name((GIBaseInfo *)info); if (strcmp(name, "buffer") != 0) { return FALSE; } GITypeInfo type_info; g_arg_info_load_type(info, &type_info); if (g_type_info_get_tag(&type_info) != GI_TYPE_TAG_ARRAY) { return FALSE; } GIArrayType array_type = g_type_info_get_array_type(&type_info); if (array_type != GI_ARRAY_TYPE_C) { return FALSE; } gint length_index = g_type_info_get_array_length(&type_info); if (length_index == -1) { return FALSE; } GITypeInfo *element_type_info = g_type_info_get_param_type(&type_info, 0); GITypeTag element_type_tag = g_type_info_get_tag(element_type_info); g_base_info_unref(element_type_info); return element_type_tag == GI_TYPE_TAG_UINT8; } gboolean rb_gi_arg_info_is_output_buffer(GIArgInfo *info) { if (g_arg_info_get_direction(info) != GI_DIRECTION_OUT) { return FALSE; } if (!g_arg_info_is_caller_allocates(info)) { return FALSE; } GITypeInfo type_info; g_arg_info_load_type(info, &type_info); if (g_type_info_get_tag(&type_info) != GI_TYPE_TAG_ARRAY) { return FALSE; } GITypeInfo *element_type_info = g_type_info_get_param_type(&type_info, 0); GITypeTag element_type_tag = g_type_info_get_tag(element_type_info); g_base_info_unref(element_type_info); return element_type_tag == GI_TYPE_TAG_UINT8; } GType gi_arg_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIArgInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_direction(VALUE self) { GIArgInfo *info; info = SELF(self); return GI_DIRECTION2RVAL(g_arg_info_get_direction(info)); } static VALUE rg_caller_allocates_p(VALUE self) { GIArgInfo *info; info = SELF(self); return CBOOL2RVAL(g_arg_info_is_caller_allocates(info)); } static VALUE rg_return_value_p(VALUE self) { GIArgInfo *info; info = SELF(self); return CBOOL2RVAL(g_arg_info_is_return_value(info)); } static VALUE rg_optional_p(VALUE self) { GIArgInfo *info; info = SELF(self); return CBOOL2RVAL(g_arg_info_is_optional(info)); } static VALUE rg_may_be_null_p(VALUE self) { GIArgInfo *info; info = SELF(self); return CBOOL2RVAL(g_arg_info_may_be_null(info)); } static VALUE rg_ownership_transfer(VALUE self) { GIArgInfo *info; info = SELF(self); return GI_TRANSFER2RVAL(g_arg_info_get_ownership_transfer(info)); } static VALUE rg_scope(VALUE self) { GIArgInfo *info; info = SELF(self); return GI_SCOPE_TYPE2RVAL(g_arg_info_get_scope(info)); } static VALUE rg_closure(VALUE self) { GIArgInfo *info; info = SELF(self); return INT2NUM(g_arg_info_get_closure(info)); } static VALUE rg_destroy(VALUE self) { GIArgInfo *info; info = SELF(self); return INT2NUM(g_arg_info_get_destroy(info)); } static VALUE rg_type(VALUE self) { GIArgInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_arg_info_get_type(info)); } static VALUE rg_input_buffer_p(VALUE self) { GIArgInfo *info = SELF(self); return CBOOL2RVAL(rb_gi_arg_info_is_input_buffer(info)); } static VALUE rg_output_buffer_p(VALUE self) { GIArgInfo *info = SELF(self); return CBOOL2RVAL(rb_gi_arg_info_is_output_buffer(info)); } void rb_gi_arg_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_ARG_INFO, "ArgInfo", rb_mGI, rb_cGIBaseInfo); RG_DEF_METHOD(direction, 0); RG_DEF_METHOD_P(caller_allocates, 0); RG_DEF_METHOD_P(return_value, 0); RG_DEF_METHOD_P(optional, 0); RG_DEF_METHOD_P(may_be_null, 0); RG_DEF_METHOD(ownership_transfer, 0); RG_DEF_METHOD(scope, 0); RG_DEF_METHOD(closure, 0); RG_DEF_METHOD(destroy, 0); RG_DEF_METHOD(type, 0); RG_DEF_METHOD_P(input_buffer, 0); RG_DEF_METHOD_P(output_buffer, 0); G_DEF_CLASS(G_TYPE_I_DIRECTION, "Direction", rb_mGI); G_DEF_CLASS(G_TYPE_I_SCOPE_TYPE, "ScopeType", rb_mGI); G_DEF_CLASS(G_TYPE_I_TRANSFER, "Transfer", rb_mGI); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-arguments-in.c000066400000000000000000002345261511343406000334310ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" static void rb_gi_callback_data_destroy_notify(gpointer data) { RBGICallbackData *callback_data = data; rb_gi_callback_data_free(callback_data); } VALUE rb_gi_arguments_in_to_ruby(RBGIArguments *args) { VALUE rb_in_args; guint i; rb_in_args = rb_ary_new_capa(args->metadata->len); for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; VALUE rb_arg; metadata = g_ptr_array_index(args->metadata, i); if (metadata->direction == GI_DIRECTION_OUT) { continue; } if (metadata->closure_p) { continue; } if (metadata->array_length_p) { continue; } rb_arg = rb_gi_arguments_convert_arg(args, metadata->in_arg, metadata, FALSE); rb_ary_push(rb_in_args, rb_arg); } return rb_in_args; } static void rb_gi_arguments_in_init_arg_ruby_callback(RBGIArguments *args, RBGIArgMetadata *metadata) { gpointer callback_function; GIArgInfo *arg_info; GIArgument *callback_argument; GIArgument *closure_argument = NULL; GIArgument *destroy_argument = NULL; RBGICallback *callback = NULL; /* TODO: metadata->free_func = ...; */ arg_info = &(metadata->arg_info); callback_argument = metadata->in_arg; if (metadata->closure_in_arg_index != -1) { closure_argument = &(g_array_index(args->in_args, GIArgument, metadata->closure_in_arg_index)); } if (metadata->destroy_in_arg_index != -1) { destroy_argument = &(g_array_index(args->in_args, GIArgument, metadata->destroy_in_arg_index)); } if (!rb_block_given_p() && g_arg_info_may_be_null(arg_info)) { callback_argument->v_pointer = NULL; if (closure_argument) { closure_argument->v_pointer = NULL; } if (destroy_argument) { destroy_argument->v_pointer = NULL; } return; } callback_function = rb_gi_callback_find(arg_info); if (callback_function) { callback_argument->v_pointer = callback_function; } else { GITypeInfo *type_info = g_arg_info_get_type(arg_info); GICallbackInfo *callback_info = g_type_info_get_interface(type_info); callback = rb_gi_callback_new(callback_info, NULL); g_base_info_unref(callback_info); g_base_info_unref(type_info); callback_argument->v_pointer = callback->closure_native_address; } if (closure_argument) { closure_argument->v_pointer = rb_gi_callback_data_new(args, callback, metadata); } if (destroy_argument) { destroy_argument->v_pointer = rb_gi_callback_data_destroy_notify; } } static void rb_gi_arguments_in_init_arg_ruby_void(RBGIArguments *args, RBGIArgMetadata *metadata) { gpointer *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gpointer); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_pointer); } if (!g_type_info_is_pointer(metadata->type.info)) { *target = NULL; return; } if (RB_TYPE_P(metadata->rb_arg, RUBY_T_STRING)) { *target = RSTRING_PTR(metadata->rb_arg); } else if (rbg_is_object(metadata->rb_arg)) { *target = RVAL2GOBJ(metadata->rb_arg); } else { *target = (gpointer)(NUM2ULL(metadata->rb_arg)); } } static void rb_gi_arguments_in_free_array_c_value(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((gpointer *)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: xfree(target); break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_free_array_c_string(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { if (metadata->direction == GI_DIRECTION_INOUT) { xfree(metadata->in_arg->v_pointer); } } static void rb_gi_arguments_in_free_array_c_strv(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((gpointer *)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: g_free(target); break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_free_array_c_filename(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gchar **target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((gchar ***)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: g_strfreev(target); break; case GI_TRANSFER_CONTAINER: { gsize i; for (i = 0; target[i]; i++) { g_free(target[i]); } } break; case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_init_arg_ruby_array_set_length(RBGIArguments *args, RBGIArgMetadata *metadata, gint64 length) { GIArgument *length_argument = metadata->array_length_arg; if (!length_argument) { return; } RBGIArgMetadata *length_metadata = metadata->array_length_metadata; switch (length_metadata->type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: rb_raise(rb_eNotImpError, "TODO: invalid argument?: length[%s]", g_type_tag_to_string(length_metadata->type.tag)); break; case GI_TYPE_TAG_INT8: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(gint8); *((gint8 *)length_argument->v_pointer) = length; } else { length_argument->v_int8 = length; } break; case GI_TYPE_TAG_UINT8: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(guint8); *((guint8 *)length_argument->v_pointer) = length; } else { length_argument->v_uint8 = length; } break; case GI_TYPE_TAG_INT16: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(gint16); *((gint16 *)length_argument->v_pointer) = length; } else { length_argument->v_int16 = length; } break; case GI_TYPE_TAG_UINT16: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(guint16); *((guint16 *)length_argument->v_pointer) = length; } else { length_argument->v_uint16 = length; } break; case GI_TYPE_TAG_INT32: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(gint32); *((gint32 *)length_argument->v_pointer) = (gint32)length; } else { length_argument->v_int32 = (gint32)length; } break; case GI_TYPE_TAG_UINT32: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(guint32); *((guint32 *)length_argument->v_pointer) = (guint32)length; } else { length_argument->v_uint32 = (guint32)length; } break; case GI_TYPE_TAG_INT64: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(gint64); *((gint64 *)length_argument->v_pointer) = length; } else { length_argument->v_int64 = length; } break; case GI_TYPE_TAG_UINT64: if (metadata->direction == GI_DIRECTION_INOUT) { length_argument->v_pointer = ALLOC(guint64); *((guint64 *)length_argument->v_pointer) = length; } else { length_argument->v_uint64 = length; } break; case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: case GI_TYPE_TAG_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: invalid argument?: length[%s]", g_type_tag_to_string(length_metadata->type.tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_in_init_arg_ruby_array_c_generic(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array, gpointer raw_array) { GIArgument *array_argument; long n_elements; array_argument = &(g_array_index(args->in_args, GIArgument, metadata->in_arg_index)); if (metadata->direction == GI_DIRECTION_INOUT) { array_argument->v_pointer = ALLOC(gpointer); *((gpointer *)(array_argument->v_pointer)) = raw_array; } else { array_argument->v_pointer = raw_array; } n_elements = RARRAY_LEN(rb_array); rb_gi_arguments_in_init_arg_ruby_array_set_length(args, metadata, n_elements); } static void rb_gi_arguments_in_init_arg_ruby_array_c_boolean(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gboolean *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(gboolean, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = RVAL2CBOOL(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_int8(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gint8 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(gint8, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2CHR(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_uint8(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { guint8 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(guint8, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = (guint8)NUM2CHR(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_int16(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gint16 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(gint16, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2SHORT(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_uint16(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { guint16 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(guint16, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2USHORT(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_int32(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gint32 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(gint32, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2INT(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_uint32(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { guint32 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(guint32, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2UINT(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_int64(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gint64 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(gint64, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2LL(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_uint64(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { guint64 *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(guint64, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2ULL(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_float(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gfloat *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(gfloat, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2DBL(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_double(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gdouble *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(gdouble, n_elements); for (i = 0; i < n_elements; i++) { raw_array[i] = NUM2DBL(RARRAY_AREF(rb_array, i)); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_init_arg_ruby_array_c_gtype(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { GType *raw_array; long i, n_elements; n_elements = RARRAY_LEN(rb_array); raw_array = ALLOC_N(GType, n_elements); for (i = 0; i < n_elements; i++) { VALUE rb_type = RARRAY_AREF(rb_array, i); raw_array[i] = rbgobj_gtype_from_ruby(rb_type); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } static void rb_gi_arguments_in_free_array_c_interface_struct(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((gpointer *)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: xfree(target); break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_init_arg_ruby_array_c_interface_struct(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { GIStructInfo *struct_info = (GIStructInfo *)(metadata->element_type.interface_info); long i, n_elements; n_elements = RARRAY_LEN(rb_array); if (metadata->element_type.pointer_p) { if (metadata->transfer != GI_TRANSFER_NOTHING) { rb_raise(rb_eNotImpError, "TODO: [%s::%s] %s " "Ruby -> GIArgument(array/%s)[interface(%s)](%s)[%s]", args->name, metadata->name, rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype), rb_gi_transfer_to_string(metadata->transfer)); } gpointer *raw_array = ALLOC_N(gpointer, n_elements); for (i = 0; i < n_elements; i++) { VALUE rb_element = RARRAY_AREF(rb_array, i); gpointer element; element = rb_gi_struct_info_from_ruby(struct_info, rb_element); raw_array[i] = element; } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } else { gsize struct_size = g_struct_info_get_size(struct_info); guint8 *raw_array = ALLOC_N(guint8, struct_size * n_elements); for (i = 0; i < n_elements; i++) { VALUE rb_element = RARRAY_AREF(rb_array, i); gpointer element; element = rb_gi_struct_info_from_ruby(struct_info, rb_element); memcpy(raw_array + (struct_size * i), element, struct_size); } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); } metadata->free_func = rb_gi_arguments_in_free_array_c_interface_struct; } static void rb_gi_arguments_in_free_array_c_interface_object(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((gpointer *)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: xfree(target); break; case GI_TRANSFER_CONTAINER: /* raw_array.each(&:unref)? */ rb_raise(rb_eNotImpError, "TODO: %s Ruby -> GIArgument(array/%s)[interface(%s)](%s)", rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype)); break; case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_init_arg_ruby_array_c_interface_object(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { gpointer *raw_array; long i, n_elements, size; n_elements = RARRAY_LEN(rb_array); size = n_elements; if (metadata->zero_terminated_p) { size++; } raw_array = ALLOC_N(gpointer, size); for (i = 0; i < n_elements; i++) { VALUE rb_element = RARRAY_AREF(rb_array, i); raw_array[i] = RVAL2GOBJ(rb_element); } if (metadata->zero_terminated_p) { raw_array[i] = NULL; } rb_gi_arguments_in_init_arg_ruby_array_c_generic(args, metadata, rb_array, raw_array); metadata->free_func = rb_gi_arguments_in_free_array_c_interface_object; } static void rb_gi_arguments_in_init_arg_ruby_array_c_interface(RBGIArguments *args, RBGIArgMetadata *metadata, VALUE rb_array) { switch (metadata->element_type.interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: %s Ruby -> GIArgument(array/%s)[interface(%s)](%s)", rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype)); break; case GI_INFO_TYPE_STRUCT: rb_gi_arguments_in_init_arg_ruby_array_c_interface_struct(args, metadata, rb_array); break; case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: rb_raise(rb_eNotImpError, "TODO: %s Ruby -> GIArgument(array/%s)[interface(%s)](%s)", rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype)); break; case GI_INFO_TYPE_OBJECT: rb_gi_arguments_in_init_arg_ruby_array_c_interface_object(args, metadata, rb_array); break; case GI_INFO_TYPE_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: %s Ruby -> GIArgument(array/%s)[interface(%s)](%s)", rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_in_init_arg_ruby_array_c(RBGIArguments *args, RBGIArgMetadata *metadata) { VALUE rb_arg = metadata->rb_arg; metadata->free_func = rb_gi_arguments_in_free_array_c_value; switch (metadata->element_type.tag) { case GI_TYPE_TAG_VOID: rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(array/%s)[%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_type_tag_to_string(metadata->element_type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; case GI_TYPE_TAG_BOOLEAN: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_boolean(args, metadata, rb_arg); break; case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: if (RB_TYPE_P(rb_arg, RUBY_T_STRING)) { gchar *raw_array = RSTRING_PTR(rb_arg); gsize length = RSTRING_LEN(rb_arg); if (metadata->transfer != GI_TRANSFER_NOTHING) { rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(array/%s)[%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_type_tag_to_string(metadata->element_type.tag), rb_gi_transfer_to_string(metadata->transfer)); } if (metadata->direction == GI_DIRECTION_INOUT) { metadata->in_arg->v_pointer = ALLOC(gpointer); *((gpointer *)(metadata->in_arg->v_pointer)) = raw_array; } else { metadata->in_arg->v_pointer = raw_array; } rb_gi_arguments_in_init_arg_ruby_array_set_length(args, metadata, length); metadata->free_func = rb_gi_arguments_in_free_array_c_string; } else { rb_arg = rbg_to_array(rb_arg); if (metadata->element_type.tag == GI_TYPE_TAG_INT8) { rb_gi_arguments_in_init_arg_ruby_array_c_int8(args, metadata, rb_arg); } else { rb_gi_arguments_in_init_arg_ruby_array_c_uint8(args, metadata, rb_arg); } } break; case GI_TYPE_TAG_INT16: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_int16(args, metadata, rb_arg); break; case GI_TYPE_TAG_UINT16: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_uint16(args, metadata, rb_arg); break; case GI_TYPE_TAG_INT32: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_int32(args, metadata, rb_arg); break; case GI_TYPE_TAG_UINT32: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_uint32(args, metadata, rb_arg); break; case GI_TYPE_TAG_INT64: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_int64(args, metadata, rb_arg); break; case GI_TYPE_TAG_UINT64: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_uint64(args, metadata, rb_arg); break; case GI_TYPE_TAG_FLOAT: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_float(args, metadata, rb_arg); break; case GI_TYPE_TAG_DOUBLE: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_double(args, metadata, rb_arg); break; case GI_TYPE_TAG_GTYPE: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_gtype(args, metadata, rb_arg); break; case GI_TYPE_TAG_UTF8: /* Workaround for rsvg_handle_set_stylesheet(): https://gitlab.gnome.org/GNOME/librsvg/-/issues/596 */ if (strcmp(metadata->name, "css") == 0) { metadata->in_arg->v_pointer = (char *)RVAL2CSTR(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_set_length(args, metadata, RSTRING_LEN(rb_arg)); metadata->free_func = NULL; } else { GIArgument *array_argument = metadata->in_arg; gchar **raw_array; long length; rb_arg = rbg_to_array(rb_arg); if (metadata->transfer == GI_TRANSFER_EVERYTHING) { raw_array = rbg_rval2strv_dup(&rb_arg, &length); } else { raw_array = rbg_rval2strv(&rb_arg, &length); } if (metadata->direction == GI_DIRECTION_INOUT) { array_argument->v_pointer = ALLOC(gpointer); *((gpointer *)(array_argument->v_pointer)) = raw_array; } else { array_argument->v_pointer = raw_array; } rb_gi_arguments_in_init_arg_ruby_array_set_length(args, metadata, length); metadata->free_func = rb_gi_arguments_in_free_array_c_strv; } break; case GI_TYPE_TAG_FILENAME: { GIArgument *array_argument = metadata->in_arg; gchar **raw_array; long length; rb_arg = rbg_to_array(rb_arg); raw_array = rbg_rval2filenamev(&rb_arg, &length); if (metadata->direction == GI_DIRECTION_INOUT) { array_argument->v_pointer = ALLOC(gpointer); *((gpointer *)(array_argument->v_pointer)) = raw_array; } else { array_argument->v_pointer = raw_array; } rb_gi_arguments_in_init_arg_ruby_array_set_length(args, metadata, length); metadata->free_func = rb_gi_arguments_in_free_array_c_filename; } break; case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: [%s::%s](%s) %s Ruby -> GIArgument(array/%s)[%s]", args->namespace, args->name, metadata->name, rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_type_tag_to_string(metadata->element_type.tag)); break; case GI_TYPE_TAG_INTERFACE: rb_arg = rbg_to_array(rb_arg); rb_gi_arguments_in_init_arg_ruby_array_c_interface(args, metadata, rb_arg); 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: rb_raise(rb_eNotImpError, "TODO: %s Ruby -> GIArgument(array/%s)[%s][%s]", rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_type_tag_to_string(metadata->element_type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_in_init_arg_ruby_array(RBGIArguments *args, RBGIArgMetadata *metadata) { if (NIL_P(metadata->rb_arg) && metadata->may_be_null_p) { memset(metadata->in_arg, 0, sizeof(GIArgument)); if (metadata->array_length_arg) { memset(metadata->array_length_arg, 0, sizeof(GIArgument)); } return; } switch (metadata->array_type) { case GI_ARRAY_TYPE_C: rb_gi_arguments_in_init_arg_ruby_array_c(args, metadata); break; case GI_ARRAY_TYPE_ARRAY: case GI_ARRAY_TYPE_PTR_ARRAY: case GI_ARRAY_TYPE_BYTE_ARRAY: rb_raise(rb_eNotImpError, "TODO: %s Ruby -> GIArgument(array/%s)[%s][%s]", rb_gi_direction_to_string(metadata->direction), rb_gi_array_type_to_string(metadata->array_type), g_type_tag_to_string(metadata->element_type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_in_free_default(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { if (metadata->direction == GI_DIRECTION_INOUT) { xfree(metadata->in_arg->v_pointer); } } static void rb_gi_arguments_in_free_filename(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gchar *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((gchar **)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_string; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: g_free(target); break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_free_interface_struct(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { if (metadata->direction == GI_DIRECTION_INOUT) { xfree(metadata->in_arg->v_pointer); } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: if (metadata->type.interface_gtype == G_TYPE_NONE) { rb_raise(rb_eNotImpError, "TODO: [%s] free %s " "Ruby -> GIArgument(interface)[%s][%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type), g_type_name(metadata->type.interface_gtype), rb_gi_transfer_to_string(metadata->transfer)); } rbgobj_boxed_unown(metadata->rb_arg); break; } } static void rb_gi_arguments_in_free_interface_struct_gvalue(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { GValue *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((GValue **)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: g_value_unset(target); xfree(target); break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_free_interface_struct_gbytes(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { GBytes *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((GBytes **)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: g_bytes_unref(target); break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_free_interface_object(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { if (metadata->direction == GI_DIRECTION_INOUT) { xfree(metadata->in_arg->v_pointer); } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: break; } } static void rb_gi_arguments_in_init_arg_ruby_interface(RBGIArguments *args, RBGIArgMetadata *metadata) { switch (metadata->type.interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(interface)[%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type), rb_gi_transfer_to_string(metadata->transfer)); break; case GI_INFO_TYPE_STRUCT: metadata->free_func = rb_gi_arguments_in_free_interface_struct; if (metadata->type.interface_gtype == G_TYPE_VALUE) { GValue *gvalue; if (rbg_is_value(metadata->rb_arg)) { gvalue = RVAL2BOXED(metadata->rb_arg, G_TYPE_VALUE); } else { gvalue = ALLOC(GValue); memset(gvalue, 0, sizeof(GValue)); rbgobj_initialize_gvalue(gvalue, metadata->rb_arg); metadata->free_func = rb_gi_arguments_in_free_interface_struct_gvalue; } metadata->in_arg->v_pointer = gvalue; } else if (metadata->type.interface_gtype == G_TYPE_BYTES) { if (rbg_is_bytes(metadata->rb_arg)) { metadata->in_arg->v_pointer = RVAL2BOXED(metadata->rb_arg, G_TYPE_BYTES); } else { VALUE rb_string; GBytes *gbytes; rb_string = StringValue(metadata->rb_arg); gbytes = g_bytes_new(RSTRING_PTR(rb_string), RSTRING_LEN(rb_string)); metadata->in_arg->v_pointer = gbytes; metadata->free_func = rb_gi_arguments_in_free_interface_struct_gbytes; } } else if (metadata->type.interface_gtype == G_TYPE_CLOSURE) { GClosure *rclosure = g_rclosure_new(metadata->rb_arg, Qnil, NULL); if (RVAL2CBOOL(rb_obj_is_kind_of(args->rb_receiver, rbg_cGLibObject()))) { g_rclosure_attach_gobject(rclosure, args->rb_receiver); } else { g_rclosure_attach(rclosure, args->rb_receiver); } metadata->in_arg->v_pointer = rclosure; } else { metadata->in_arg->v_pointer = rb_gi_struct_get_raw(metadata->rb_arg, metadata->type.interface_gtype); } break; case GI_INFO_TYPE_BOXED: rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(interface)[%s][%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type), g_type_name(metadata->type.interface_gtype), rb_gi_transfer_to_string(metadata->transfer)); break; case GI_INFO_TYPE_ENUM: if (metadata->type.interface_gtype == G_TYPE_NONE) { metadata->in_arg->v_int32 = NUM2INT(metadata->rb_arg); } else { metadata->in_arg->v_int32 = RVAL2GENUM(metadata->rb_arg, metadata->type.interface_gtype); } break; case GI_INFO_TYPE_FLAGS: if (metadata->type.interface_gtype == G_TYPE_NONE) { metadata->in_arg->v_int32 = NUM2INT(metadata->rb_arg); } else { metadata->in_arg->v_int32 = RVAL2GFLAGS(metadata->rb_arg, metadata->type.interface_gtype); } break; case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: metadata->in_arg->v_pointer = RVAL2GOBJ(metadata->rb_arg); if (metadata->in_arg->v_pointer && metadata->type.interface_gtype != G_TYPE_NONE && !G_TYPE_CHECK_INSTANCE_TYPE(metadata->in_arg->v_pointer, metadata->type.interface_gtype)) { rb_raise(rb_eArgError, "must be <%s> object: <%" PRIsVALUE ">", g_type_name(metadata->type.interface_gtype), metadata->rb_arg); } if (metadata->in_arg->v_pointer && metadata->transfer != GI_TRANSFER_NOTHING) { g_object_ref(metadata->in_arg->v_pointer); } metadata->free_func = rb_gi_arguments_in_free_interface_object; break; case GI_INFO_TYPE_CONSTANT: rb_raise(rb_eNotImpError, "TODO: [%s][%s](%s) %s " "Ruby -> GIArgument(interface)[%s][%s][%s]", args->namespace, args->name, metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type), g_type_name(metadata->type.interface_gtype), rb_gi_transfer_to_string(metadata->transfer)); break; case GI_INFO_TYPE_INVALID_0: g_assert_not_reached(); break; case GI_INFO_TYPE_UNION: if (metadata->transfer != GI_TRANSFER_NOTHING) { rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(interface)[%s][%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type), g_type_name(metadata->type.interface_gtype), rb_gi_transfer_to_string(metadata->transfer)); } if (metadata->type.interface_gtype == G_TYPE_NONE) { rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(interface)[%s][%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type), g_type_name(metadata->type.interface_gtype), rb_gi_transfer_to_string(metadata->transfer)); } else { metadata->in_arg->v_pointer = RVAL2BOXED(metadata->rb_arg, metadata->type.interface_gtype); } break; 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: default: rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(interface)[%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type), rb_gi_transfer_to_string(metadata->transfer)); break; } if (metadata->direction == GI_DIRECTION_INOUT) { gpointer target = metadata->in_arg->v_pointer; metadata->in_arg->v_pointer = ALLOC(gpointer); *((gpointer *)(metadata->in_arg->v_pointer)) = target; } } static void rb_gi_arguments_in_free_list(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((gpointer *)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } switch (metadata->transfer) { case GI_TRANSFER_NOTHING: if (metadata->type.tag == GI_TYPE_TAG_GLIST) { g_list_free(target); } else { g_slist_free(target); } break; case GI_TRANSFER_CONTAINER: break; default: rb_raise(rb_eNotImpError, "TODO: [%s] free %s " "Ruby -> GIArgument(%s)[%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), g_type_tag_to_string(metadata->element_type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; } } static void rb_gi_arguments_in_init_arg_ruby_list(RBGIArguments *args, RBGIArgMetadata *metadata) { GType gtype = metadata->element_type.interface_gtype; metadata->free_func = rb_gi_arguments_in_free_list; switch (metadata->element_type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(%s)[%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), g_type_tag_to_string(metadata->element_type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; case GI_TYPE_TAG_INTERFACE: if (metadata->type.tag == GI_TYPE_TAG_GLIST) { metadata->in_arg->v_pointer = RVAL2GOBJGLIST(metadata->rb_arg); } else { metadata->in_arg->v_pointer = RVAL2GOBJGSLIST(metadata->rb_arg); } if (gtype != G_TYPE_NONE) { if (metadata->type.tag == GI_TYPE_TAG_GLIST) { GList *node; for (node = metadata->in_arg->v_pointer; node; node = g_list_next(node)) { GObject *object = node->data; if (!G_TYPE_CHECK_INSTANCE_TYPE(object, gtype)) { g_list_free(metadata->in_arg->v_pointer); rb_raise(rb_eArgError, "must be <%s> objects: <%" PRIsVALUE ">", g_type_name(gtype), metadata->rb_arg); } } } else { GSList *node; for (node = metadata->in_arg->v_pointer; node; node = g_slist_next(node)) { GObject *object = node->data; if (!G_TYPE_CHECK_INSTANCE_TYPE(object, gtype)) { g_slist_free(metadata->in_arg->v_pointer); rb_raise(rb_eArgError, "must be <%s> objects: <%" PRIsVALUE ">", g_type_name(gtype), metadata->rb_arg); } } } } 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: rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(%s)[%s][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), g_type_tag_to_string(metadata->element_type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; default: g_assert_not_reached(); break; } if (metadata->direction == GI_DIRECTION_INOUT) { gpointer target = metadata->in_arg->v_pointer; metadata->in_arg->v_pointer = ALLOC(gpointer); *((gpointer *)(metadata->in_arg->v_pointer)) = target; } } typedef struct { VALUE rb_value; RBGIArgMetadataType *type; const gchar *context; } RubyToCData; typedef gpointer (*RubyToCFunc)(RubyToCData *data); static gpointer ruby_to_c_utf8(RubyToCData *data) { return g_strdup(RVAL2CSTR(data->rb_value)); } static gpointer ruby_to_c_interface_enum(RubyToCData *data) { gint32 value; if (data->type->interface_gtype == G_TYPE_NONE) { value = NUM2INT(data->rb_value); } else { value = RVAL2GENUM(data->rb_value, data->type->interface_gtype); } return GINT_TO_POINTER(value); } typedef struct { GIArgument *argument; GITypeInfo *type_info; VALUE rb_argument; VALUE self; } ArgumentFromRubyData; typedef struct { GHashTable *hash_table; RubyToCFunc key_ruby_to_c_func; RubyToCData *key_ruby_to_c_data; RubyToCFunc value_ruby_to_c_func; RubyToCData *value_ruby_to_c_data; } ArgumentFromRubyGHashData; static int rb_gi_arguments_in_init_arg_ruby_ghash_convert(VALUE rb_key, VALUE rb_value, VALUE user_data) { ArgumentFromRubyGHashData *data = (ArgumentFromRubyGHashData *)user_data; gpointer key; gpointer value; data->key_ruby_to_c_data->rb_value = rb_key; key = data->key_ruby_to_c_func(data->key_ruby_to_c_data); data->value_ruby_to_c_data->rb_value = rb_value; value = data->value_ruby_to_c_func(data->value_ruby_to_c_data); g_hash_table_insert(data->hash_table, key, value); return ST_CONTINUE; } static VALUE rb_gi_arguments_in_init_arg_ruby_ghash_body(VALUE value_data) { RBGIArgMetadata *metadata = (RBGIArgMetadata *)value_data; GHashFunc hash_func = NULL; GEqualFunc equal_func = NULL; GDestroyNotify key_destroy_func = NULL; GDestroyNotify value_destroy_func = NULL; RubyToCFunc key_ruby_to_c_func = NULL; RubyToCData key_ruby_to_c_data; RubyToCFunc value_ruby_to_c_func = NULL; RubyToCData value_ruby_to_c_data; ArgumentFromRubyGHashData convert_data; key_ruby_to_c_data.type = &(metadata->key_type); switch (metadata->key_type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: Ruby -> GIArgument(GHash)[key][%s]", g_type_tag_to_string(metadata->key_type.tag)); break; case GI_TYPE_TAG_UTF8: hash_func = g_str_hash; equal_func = g_str_equal; key_destroy_func = g_free; key_ruby_to_c_func = ruby_to_c_utf8; key_ruby_to_c_data.context = "Ruby -> GIArgument(GHash)[key][utf8]"; break; case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: case GI_TYPE_TAG_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: Ruby -> GIArgument(GHash)[key][%s]", g_type_tag_to_string(metadata->key_type.tag)); break; default: g_assert_not_reached(); break; } value_ruby_to_c_data.type = &(metadata->value_type); switch (metadata->value_type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: Ruby -> GIArgument(GHash)[value][%s]", g_type_tag_to_string(metadata->value_type.tag)); break; case GI_TYPE_TAG_UTF8: value_destroy_func = g_free; value_ruby_to_c_func = ruby_to_c_utf8; value_ruby_to_c_data.context = "Ruby -> GIArgument(GHash)[value][utf8]"; break; case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: Ruby -> GIArgument(GHash)[value][%s]", g_type_tag_to_string(metadata->value_type.tag)); break; case GI_TYPE_TAG_INTERFACE: switch (metadata->value_type.interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_BOXED: rb_raise(rb_eNotImpError, "TODO: Ruby -> GIArgument(GHash)[value][%s][%s]", g_type_tag_to_string(metadata->value_type.tag), g_info_type_to_string(metadata->value_type.interface_type)); break; case GI_INFO_TYPE_ENUM: value_destroy_func = NULL; value_ruby_to_c_func = ruby_to_c_interface_enum; value_ruby_to_c_data.context = "Ruby -> GIArgument(GHash)[value][interface]"; break; case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: Ruby -> GIArgument(GHash)[value][%s][%s]", g_type_tag_to_string(metadata->value_type.tag), g_info_type_to_string(metadata->value_type.interface_type)); break; default: g_assert_not_reached(); break; } 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: rb_raise(rb_eNotImpError, "TODO: Ruby -> GIArgument(GHash)[value][%s]", g_type_tag_to_string(metadata->value_type.tag)); break; default: g_assert_not_reached(); break; } metadata->in_arg->v_pointer = g_hash_table_new_full(hash_func, equal_func, key_destroy_func, value_destroy_func); convert_data.hash_table = metadata->in_arg->v_pointer; convert_data.key_ruby_to_c_func = key_ruby_to_c_func; convert_data.key_ruby_to_c_data = &key_ruby_to_c_data; convert_data.value_ruby_to_c_func = value_ruby_to_c_func; convert_data.value_ruby_to_c_data = &value_ruby_to_c_data; rb_hash_foreach(metadata->rb_arg, rb_gi_arguments_in_init_arg_ruby_ghash_convert, (VALUE)&convert_data); return Qnil; } static VALUE rb_gi_arguments_in_init_arg_ruby_ghash_rescue(VALUE value_data, VALUE exception) { RBGIArgMetadata *metadata = (RBGIArgMetadata *)value_data; if (metadata->in_arg->v_pointer) { g_hash_table_unref(metadata->in_arg->v_pointer); metadata->in_arg->v_pointer = NULL; } rb_exc_raise(exception); return Qnil; } static void rb_gi_arguments_in_free_ghash(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { GHashTable *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = *((GHashTable **)(metadata->in_arg->v_pointer)); xfree(metadata->in_arg->v_pointer); } else { target = metadata->in_arg->v_pointer; } g_hash_table_unref(target); } static void rb_gi_arguments_in_init_arg_ruby_ghash(RBGIArguments *args, RBGIArgMetadata *metadata) { if (metadata->transfer != GI_TRANSFER_NOTHING) { rb_raise(rb_eNotImpError, "TODO: [%s] free %s " "Ruby -> GIArgument(%s){%s,%s}[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), g_type_tag_to_string(metadata->key_type.tag), g_type_tag_to_string(metadata->value_type.tag), rb_gi_transfer_to_string(metadata->transfer)); } metadata->in_arg->v_pointer = NULL; rb_rescue(rb_gi_arguments_in_init_arg_ruby_ghash_body, (VALUE)metadata, rb_gi_arguments_in_init_arg_ruby_ghash_rescue, (VALUE)metadata); if (metadata->direction == GI_DIRECTION_INOUT) { GHashTable *target = metadata->in_arg->v_pointer; metadata->in_arg->v_pointer = ALLOC(GHashTable *); *((GHashTable **)(metadata->in_arg->v_pointer)) = target; } metadata->free_func = rb_gi_arguments_in_free_ghash; } static void rb_gi_arguments_in_init_arg_ruby(RBGIArguments *args, RBGIArgMetadata *metadata) { if (metadata->callback_p && !metadata->destroy_p) { rb_gi_arguments_in_init_arg_ruby_callback(args, metadata); return; } if (metadata->rb_arg_index == -1) { return; } if (metadata->array_p) { rb_gi_arguments_in_init_arg_ruby_array(args, metadata); return; } if (NIL_P(metadata->rb_arg)) { GIBaseInfo *klass; const char *suffix; if (metadata->may_be_null_p) { memset(metadata->in_arg, 0, sizeof(GIArgument)); return; } klass = g_base_info_get_container(args->info); if (metadata->rb_arg_index == 1) { suffix = "st"; } else if (metadata->rb_arg_index == 2) { suffix = "nd"; } else if (metadata->rb_arg_index == 3) { suffix = "rd"; } else { suffix = "th"; } rb_raise(rb_eArgError, "<%s%s%s%s%s>: the %u%s argument must not nil: <%s>", g_base_info_get_namespace(args->info), klass ? "::" : "", klass ? g_base_info_get_name(klass) : "", klass ? "#" : ".", g_base_info_get_name(args->info), metadata->rb_arg_index, suffix, metadata->name); } metadata->free_func = rb_gi_arguments_in_free_default; switch (metadata->type.tag) { case GI_TYPE_TAG_VOID: rb_gi_arguments_in_init_arg_ruby_void(args, metadata); break; case GI_TYPE_TAG_BOOLEAN: { gboolean *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gboolean); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_boolean); } *target = RVAL2CBOOL(metadata->rb_arg); } break; case GI_TYPE_TAG_INT8: { gint8 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gint8); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_int8); } *target = NUM2CHR(metadata->rb_arg); } break; case GI_TYPE_TAG_UINT8: { guint8 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(guint8); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_uint8); } *target = (guint8)NUM2CHR(metadata->rb_arg); } break; case GI_TYPE_TAG_INT16: { gint16 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gint16); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_int16); } *target = NUM2SHORT(metadata->rb_arg); } break; case GI_TYPE_TAG_UINT16: { guint16 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(guint16); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_uint16); } *target = NUM2USHORT(metadata->rb_arg); } break; case GI_TYPE_TAG_INT32: { gint32 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gint32); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_int32); } *target = NUM2INT(metadata->rb_arg); } break; case GI_TYPE_TAG_UINT32: { guint32 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(guint32); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_uint32); } *target = NUM2UINT(metadata->rb_arg); } break; case GI_TYPE_TAG_INT64: { gint64 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gint64); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_int64); } *target = NUM2LL(metadata->rb_arg); } break; case GI_TYPE_TAG_UINT64: { guint64 *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(guint64); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_uint64); } *target = NUM2ULL(metadata->rb_arg); } break; case GI_TYPE_TAG_FLOAT: { gfloat *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gfloat); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_float); } *target = NUM2DBL(metadata->rb_arg); } break; case GI_TYPE_TAG_DOUBLE: { gdouble *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gdouble); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_double); } *target = NUM2DBL(metadata->rb_arg); } break; case GI_TYPE_TAG_GTYPE: { GType *target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(GType); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_size); } *target = rbgobj_gtype_from_ruby(metadata->rb_arg); } break; case GI_TYPE_TAG_UTF8: { gchar **target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gchar *); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_string); } *target = (gchar *)RVAL2CSTR_ACCEPT_SYMBOL(metadata->rb_arg); } break; case GI_TYPE_TAG_FILENAME: { gchar **target; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gchar *); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_string); } *target = rbg_filename_from_ruby(metadata->rb_arg); metadata->free_func = rb_gi_arguments_in_free_filename; } break; case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "should not be reached: Ruby -> GIArgument(%s)", g_type_tag_to_string(metadata->type.tag)); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_in_init_arg_ruby_interface(args, metadata); break; case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: rb_gi_arguments_in_init_arg_ruby_list(args, metadata); break; case GI_TYPE_TAG_GHASH: rb_gi_arguments_in_init_arg_ruby_ghash(args, metadata); break; case GI_TYPE_TAG_ERROR: rb_raise(rb_eNotImpError, "TODO: [%s] %s Ruby -> GIArgument(%s)", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag)); break; case GI_TYPE_TAG_UNICHAR: { gunichar *target; VALUE rb_unichar; if (metadata->direction == GI_DIRECTION_INOUT) { target = ALLOC(gunichar); metadata->in_arg->v_pointer = target; } else { target = &(metadata->in_arg->v_uint32); } if (RB_TYPE_P(metadata->rb_arg, RUBY_T_STRING)) { VALUE rb_codepoints; if (rb_str_strlen(metadata->rb_arg) != 1) { rb_raise(rb_eArgError, "[%s][%s] must be one character: %+" PRIsVALUE, metadata->name, g_type_tag_to_string(metadata->type.tag), metadata->rb_arg); } rb_codepoints = rb_funcall(metadata->rb_arg, rb_intern("codepoints"), 0); rb_unichar = RARRAY_PTR(rb_codepoints)[0]; } else { rb_unichar = metadata->rb_arg; } *target = NUM2UINT(rb_unichar); } break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_in_init_arg_raw_interface(RBGIArguments *args, RBGIArgMetadata *metadata) { switch (metadata->type.interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: %s::%s: raw argument -> GIArgument(interface)[%s]: <%s>", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_info_type_to_string(metadata->type.interface_type), g_base_info_get_name(metadata->type.interface_info)); break; case GI_INFO_TYPE_STRUCT: metadata->in_arg->v_pointer = *((gpointer *)(args->raw_args[metadata->index])); break; case GI_INFO_TYPE_BOXED: rb_raise(rb_eNotImpError, "TODO: %s::%s: raw argument -> GIArgument(interface)[%s]: <%s>", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_info_type_to_string(metadata->type.interface_type), g_base_info_get_name(metadata->type.interface_info)); break; case GI_INFO_TYPE_ENUM: metadata->in_arg->v_int32 = *((gint32 *)(args->raw_args[metadata->index])); break; case GI_INFO_TYPE_FLAGS: metadata->in_arg->v_int32 = *((gint32 *)(args->raw_args[metadata->index])); break; case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: metadata->in_arg->v_pointer = *((gpointer *)(args->raw_args[metadata->index])); break; case GI_INFO_TYPE_CONSTANT: rb_raise(rb_eNotImpError, "TODO: %s::%s: raw argument -> GIArgument(interface)[%s]: <%s>", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_info_type_to_string(metadata->type.interface_type), g_base_info_get_name(metadata->type.interface_info)); break; case GI_INFO_TYPE_INVALID_0: g_assert_not_reached(); break; 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: default: rb_raise(rb_eNotImpError, "TODO: %s::%s: raw argument -> GIArgument(interface)[%s]: <%s>", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_info_type_to_string(metadata->type.interface_type), g_base_info_get_name(metadata->type.interface_info)); break; } } static void rb_gi_arguments_in_init_arg_raw(RBGIArguments *args, RBGIArgMetadata *metadata) { switch (metadata->type.tag) { case GI_TYPE_TAG_VOID: metadata->in_arg->v_pointer = *((gpointer *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_BOOLEAN: metadata->in_arg->v_boolean = *((gboolean *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_INT8: metadata->in_arg->v_int8 = *((gint8 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_UINT8: metadata->in_arg->v_uint8 = *((guint8 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_INT16: metadata->in_arg->v_int16 = *((gint16 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_UINT16: metadata->in_arg->v_uint16 = *((guint16 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_INT32: metadata->in_arg->v_int32 = *((gint32 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_UINT32: metadata->in_arg->v_uint32 = *((guint32 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_INT64: metadata->in_arg->v_int64 = *((gint64 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_UINT64: metadata->in_arg->v_uint64 = *((guint64 *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_FLOAT: metadata->in_arg->v_float = *((gfloat *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_DOUBLE: metadata->in_arg->v_double = *((gdouble *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_GTYPE: metadata->in_arg->v_size = *((gsize *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: metadata->in_arg->v_string = *((gchar **)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_ARRAY: metadata->in_arg->v_pointer = *((gpointer *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_in_init_arg_raw_interface(args, metadata); break; case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: case GI_TYPE_TAG_GHASH: metadata->in_arg->v_pointer = *((gpointer *)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_ERROR: metadata->in_arg->v_pointer = *((GError **)(args->raw_args[metadata->index])); break; case GI_TYPE_TAG_UNICHAR: metadata->in_arg->v_uint32 = *((gunichar *)(args->raw_args[metadata->index])); break; default: g_assert_not_reached(); break; } } void rb_gi_arguments_in_init(RBGIArguments *args) { guint i; for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; metadata = g_ptr_array_index(args->metadata, i); if (metadata->direction == GI_DIRECTION_OUT) { continue; } if (args->rb_mode_p) { rb_gi_arguments_in_init_arg_ruby(args, metadata); } else { rb_gi_arguments_in_init_arg_raw(args, metadata); } } } void rb_gi_arguments_in_clear(RBGIArguments *args) { if (!args->metadata) { return; } if (!args->rb_mode_p) { return; } guint i; for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; metadata = g_ptr_array_index(args->metadata, i); if (metadata->direction == GI_DIRECTION_OUT) { continue; } if (metadata->in_arg_index == -1) { continue; } if (metadata->free_func) { metadata->free_func(args, metadata, metadata->free_func_data); } } } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-arguments-out.c000066400000000000000000001003561511343406000336230ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" static void rb_gi_arguments_out_free_immediate_value(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { xfree(metadata->out_arg->v_pointer); } static void rb_gi_arguments_out_free_string(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gchar **target = metadata->out_arg->v_pointer; if (metadata->transfer != GI_TRANSFER_NOTHING) { g_free(*target); } xfree(target); } static void rb_gi_arguments_out_free_array_c_uint8(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { guint8 **target = metadata->out_arg->v_pointer; switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: g_free(*target); break; default: rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer)); } xfree(target); } static void rb_gi_arguments_out_free_array_c_string(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gchar ***target = metadata->out_arg->v_pointer; switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: g_free(*target); break; case GI_TRANSFER_EVERYTHING: g_strfreev(*target); break; default: rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer)); } xfree(target); } static void rb_gi_arguments_out_free_array_c_interface(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer **target = metadata->out_arg->v_pointer; switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: g_free(*target); break; case GI_TRANSFER_EVERYTHING: if (metadata->element_type.interface_gtype == G_TYPE_NONE) { /* This assumes that this memory was allocated by * g_new0(MyStruct, n). */ g_free(*target); } else { rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s/%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_array_type_to_string(metadata->array_type), rb_gi_transfer_to_string(metadata->transfer)); } break; } xfree(target); } static void rb_gi_arguments_out_free_array_array_interface_struct(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { GArray *target = metadata->out_arg->v_pointer; GType gtype = metadata->element_type.interface_gtype; switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: break; case GI_TRANSFER_EVERYTHING: if (gtype == G_TYPE_NONE) { /* If the target struct is raw (not GType-ed) struct, we * can't know how to free fields in the target struct. We * assume that the target struct doesn't allocate nothing * for its fields. * * e.g.: The attributes out argument in * vte_terminal_get_text_range(): * https://developer.gnome.org/vte/unstable/VteTerminal.html#vte-terminal-get-text-range */ break; } G_GNUC_FALLTHROUGH; default: rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s/%s)[interface(%s)](%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_array_type_to_string(metadata->array_type), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype), rb_gi_transfer_to_string(metadata->transfer)); break; } g_array_free(target, TRUE); } static void rb_gi_arguments_out_free_interface_struct(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer *target = metadata->out_arg->v_pointer; GType gtype = metadata->type.interface_gtype; switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: if (gtype == G_TYPE_VALUE) { g_value_unset((GValue *)target); break; } else if (G_TYPE_IS_BOXED(gtype)) { if (*target) { g_boxed_free(gtype, *target); } break; } default: rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; } xfree(target); } static void rb_gi_arguments_out_free_interface_object(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { GObject **target = metadata->out_arg->v_pointer; switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: case GI_TRANSFER_EVERYTHING: if (*target) { g_object_unref(*target); } break; default: rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer)); } xfree(target); } static void rb_gi_arguments_out_free_list(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { gpointer *target = metadata->out_arg->v_pointer; switch (metadata->transfer) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: if (metadata->type.tag == GI_TYPE_TAG_GLIST) { g_list_free(*((GList **)target)); } else { g_slist_free(*((GSList **)target)); } break; default: rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer)); break; } xfree(target); } static void rb_gi_arguments_out_free_hash(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { GHashTable *target = metadata->out_arg->v_pointer; if (metadata->transfer != GI_TRANSFER_NOTHING) { rb_raise(rb_eNotImpError, "TODO: [%s] %s free GIArgument(%s)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer)); } xfree(target); } static void rb_gi_arguments_out_free_error(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data) { GError **target = metadata->out_arg->v_pointer; xfree(target); } static void rb_gi_arguments_out_init_arg_array_c(RBGIArguments *args, RBGIArgMetadata *metadata) { GIArgument *argument = metadata->out_arg; switch (metadata->element_type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[c][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; case GI_TYPE_TAG_UINT8: if (metadata->output_buffer_p) { if (!rb_type_p(metadata->rb_arg, RUBY_T_STRING)) { rb_raise(rb_eNotImpError, "[%s::%s] %s allocates GIArgument(%s)[%s]: " "output buffer isn't String: <%" PRIsVALUE ">", args->name, metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer), metadata->rb_arg); } RBGIArgMetadata *length_metadata = metadata->array_length_metadata; if (!length_metadata) { rb_raise(rb_eNotImpError, "TODO: [%s::%s] %s allocates GIArgument(%s)[%s]: " "output buffer without length", args->name, metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->type.tag), rb_gi_transfer_to_string(metadata->transfer)); } argument->v_pointer = RSTRING_PTR(metadata->rb_arg); if (length_metadata->in_arg) { length_metadata->in_arg->v_size = RSTRING_LEN(metadata->rb_arg); } if (length_metadata->out_arg) { length_metadata->out_arg->v_size = RSTRING_LEN(metadata->rb_arg); } } else { argument->v_pointer = ALLOC(guint8 *); metadata->free_func = rb_gi_arguments_out_free_array_c_uint8; } break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[c][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; case GI_TYPE_TAG_UTF8: argument->v_pointer = ALLOC(gchar **); *((gchar **)(argument->v_pointer)) = NULL; metadata->free_func = rb_gi_arguments_out_free_array_c_string; break; case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[c][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; case GI_TYPE_TAG_INTERFACE: argument->v_pointer = ALLOC(gpointer *); *((gpointer *)(argument->v_pointer)) = NULL; metadata->free_func = rb_gi_arguments_out_free_array_c_interface; 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: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[c][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_out_init_arg_array_array_interface(RBGIArguments *args, RBGIArgMetadata *metadata) { GIArgument *argument = metadata->out_arg; switch (metadata->element_type.interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates " "GIArgument(array)[array][interface(%s)](%s)", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype)); break; case GI_INFO_TYPE_STRUCT: { gsize raw_struct_size; guint struct_size; raw_struct_size = g_struct_info_get_size(metadata->element_type.interface_info); struct_size = (guint)raw_struct_size; argument->v_pointer = g_array_new(metadata->zero_terminated_p, TRUE, struct_size); metadata->free_func = rb_gi_arguments_out_free_array_array_interface_struct; } break; case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates " "GIArgument(array)[array][interface(%s)](%s)", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->element_type.interface_type), g_type_name(metadata->element_type.interface_gtype)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_out_init_arg_array_array(RBGIArguments *args, RBGIArgMetadata *metadata) { switch (metadata->element_type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[array][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_out_init_arg_array_array_interface(args, metadata); 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: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[array][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_out_init_arg_array(RBGIArguments *args, RBGIArgMetadata *metadata) { switch (metadata->array_type) { case GI_ARRAY_TYPE_C: rb_gi_arguments_out_init_arg_array_c(args, metadata); break; case GI_ARRAY_TYPE_ARRAY: rb_gi_arguments_out_init_arg_array_array(args, metadata); break; case GI_ARRAY_TYPE_PTR_ARRAY: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[ptr-array][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; case GI_ARRAY_TYPE_BYTE_ARRAY: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(array)[byte-array][%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_type_tag_to_string(metadata->element_type.tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_out_init_arg_interface(RBGIArguments *args, RBGIArgMetadata *metadata) { GIArgument *argument = metadata->out_arg; switch (metadata->type.interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: allocates GIArgument(interface)[%s] for output", g_info_type_to_string(metadata->type.interface_type)); break; case GI_INFO_TYPE_STRUCT: /* Should we care gtype? */ if (metadata->type.pointer_p) { gpointer *struct_location = RB_ALLOC(gpointer); *struct_location = NULL; argument->v_pointer = struct_location; } else { gsize struct_size = g_struct_info_get_size(metadata->type.interface_info); argument->v_pointer = xmalloc(struct_size); memset(argument->v_pointer, 0, struct_size); } metadata->free_func = rb_gi_arguments_out_free_interface_struct; break; case GI_INFO_TYPE_BOXED: rb_raise(rb_eNotImpError, "TODO: allocates GIArgument(interface)[%s] for output", g_info_type_to_string(metadata->type.interface_type)); break; case GI_INFO_TYPE_ENUM: { gint *pointer = ALLOC(gint); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_INFO_TYPE_FLAGS: { guint *pointer = ALLOC(guint); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: { gpointer *pointer = ALLOC(gpointer); *pointer = NULL; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_interface_object; } 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: rb_raise(rb_eNotImpError, "TODO: [%s] %s allocates GIArgument(interface)[%s]", metadata->name, rb_gi_direction_to_string(metadata->direction), g_info_type_to_string(metadata->type.interface_type)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_out_init_arg(RBGIArguments *args, RBGIArgMetadata *metadata) { GIArgument *argument = metadata->out_arg; if (metadata->array_length_p && metadata->array_metadata && metadata->array_metadata->output_buffer_p) { return; } memset(argument, 0, sizeof(GIArgument)); switch (metadata->type.tag) { case GI_TYPE_TAG_VOID: if (metadata->type.pointer_p) { gpointer *pointer = ALLOC(gpointer); *pointer = NULL; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_BOOLEAN: { gboolean *pointer = ALLOC(gboolean); *pointer = FALSE; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_INT8: { gint8 *pointer = ALLOC(gint8); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_UINT8: { guint8 *pointer = ALLOC(guint8); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_INT16: { gint16 *pointer = ALLOC(gint16); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_UINT16: { guint16 *pointer = ALLOC(guint16); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_INT32: { gint32 *pointer = ALLOC(gint32); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_UINT32: { guint32 *pointer = ALLOC(guint32); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_INT64: { gint64 *pointer = ALLOC(gint64); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_UINT64: { guint64 *pointer = ALLOC(guint64); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_FLOAT: { gfloat *pointer = ALLOC(gfloat); *pointer = 0.0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_DOUBLE: { gdouble *pointer = ALLOC(gdouble); *pointer = 0.0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_GTYPE: { GType *pointer = ALLOC(GType); *pointer = G_TYPE_INVALID; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: { gchar **pointer = ALLOC(gchar *); *pointer = NULL; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_string; } break; case GI_TYPE_TAG_ARRAY: rb_gi_arguments_out_init_arg_array(args, metadata); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_out_init_arg_interface(args, metadata); break; case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: { gpointer *pointer = ALLOC(gpointer); *pointer = NULL; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_list; } break; case GI_TYPE_TAG_GHASH: { gpointer *pointer = ALLOC(gpointer); *pointer = NULL; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_hash; } break; case GI_TYPE_TAG_ERROR: { GError **pointer = ALLOC(GError *); *pointer = NULL; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_error; } break; case GI_TYPE_TAG_UNICHAR: { gunichar *pointer = ALLOC(gunichar); *pointer = 0; argument->v_pointer = pointer; metadata->free_func = rb_gi_arguments_out_free_immediate_value; } break; default: g_assert_not_reached(); break; } } void rb_gi_arguments_out_init(RBGIArguments *args) { guint i; for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; metadata = g_ptr_array_index(args->metadata, i); if (metadata->direction != GI_DIRECTION_OUT) { continue; } if (args->rb_mode_p) { rb_gi_arguments_out_init_arg(args, metadata); } else { GIArgument *argument = &(g_array_index(args->out_args, GIArgument, metadata->out_arg_index)); argument->v_pointer = *((gpointer *)(args->raw_args[i])); } } } void rb_gi_arguments_out_clear(RBGIArguments *args) { if (!args->metadata) { return; } guint i; for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; metadata = g_ptr_array_index(args->metadata, i); if (metadata->direction != GI_DIRECTION_OUT) { continue; } if (metadata->free_func) { metadata->free_func(args, metadata, metadata->free_func_data); } } } static VALUE rb_gi_arguments_out_to_ruby_arg(RBGIArguments *args, RBGIArgMetadata *metadata, GIArgument *argument) { /* TODO */ if (metadata->output_buffer_p) { return metadata->rb_arg; } GIArgument normalized_argument; gboolean duplicate = FALSE; memset(&normalized_argument, 0, sizeof(GIArgument)); switch (metadata->type.tag) { case GI_TYPE_TAG_VOID: if (metadata->type.pointer_p) { normalized_argument.v_pointer = *((gpointer *)(argument->v_pointer)); } break; case GI_TYPE_TAG_BOOLEAN: normalized_argument.v_boolean = *((gboolean *)(argument->v_pointer)); break; case GI_TYPE_TAG_INT8: normalized_argument.v_int8 = *((gint8 *)(argument->v_pointer)); break; case GI_TYPE_TAG_UINT8: normalized_argument.v_uint8 = *((guint8 *)(argument->v_pointer)); break; case GI_TYPE_TAG_INT16: normalized_argument.v_int16 = *((gint16 *)(argument->v_pointer)); break; case GI_TYPE_TAG_UINT16: normalized_argument.v_uint16 = *((guint16 *)(argument->v_pointer)); break; case GI_TYPE_TAG_INT32: normalized_argument.v_int32 = *((gint32 *)(argument->v_pointer)); break; case GI_TYPE_TAG_UINT32: normalized_argument.v_uint32 = *((guint32 *)(argument->v_pointer)); break; case GI_TYPE_TAG_INT64: normalized_argument.v_int64 = *((gint64 *)(argument->v_pointer)); break; case GI_TYPE_TAG_UINT64: normalized_argument.v_uint64 = *((guint64 *)(argument->v_pointer)); break; case GI_TYPE_TAG_FLOAT: normalized_argument.v_float = *((gfloat *)(argument->v_pointer)); break; case GI_TYPE_TAG_DOUBLE: normalized_argument.v_double = *((gdouble *)(argument->v_pointer)); break; case GI_TYPE_TAG_GTYPE: normalized_argument.v_size = *((GType *)(argument->v_pointer)); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: normalized_argument.v_string = *((gchar **)(argument->v_pointer)); break; case GI_TYPE_TAG_ARRAY: case GI_TYPE_TAG_INTERFACE: case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: case GI_TYPE_TAG_GHASH: if (metadata->caller_allocates_p) { duplicate = TRUE; normalized_argument.v_pointer = argument->v_pointer; } else { normalized_argument.v_pointer = *((gpointer *)(argument->v_pointer)); } break; case GI_TYPE_TAG_ERROR: normalized_argument.v_pointer = *((GError **)(argument->v_pointer)); break; case GI_TYPE_TAG_UNICHAR: normalized_argument.v_uint32 = *((guint32 *)(argument->v_pointer)); break; default: g_assert_not_reached(); break; } return rb_gi_arguments_convert_arg(args, &normalized_argument, metadata, duplicate); } VALUE rb_gi_arguments_out_to_ruby(RBGIArguments *args) { gint i, n_args; VALUE rb_out_args; rb_out_args = rb_ary_new(); n_args = g_callable_info_get_n_args(args->info); for (i = 0; i < n_args; i++) { RBGIArgMetadata *metadata; GIArgument *argument = NULL; VALUE rb_argument; metadata = g_ptr_array_index(args->metadata, i); if (metadata->array_length_p) { continue; } switch (metadata->direction) { case GI_DIRECTION_IN: break; case GI_DIRECTION_OUT: argument = &g_array_index(args->out_args, GIArgument, metadata->out_arg_index); break; case GI_DIRECTION_INOUT: argument = &g_array_index(args->in_args, GIArgument, metadata->in_arg_index); break; default: g_assert_not_reached(); break; } if (!argument) { continue; } rb_argument = rb_gi_arguments_out_to_ruby_arg(args, metadata, argument); rb_ary_push(rb_out_args, rb_argument); } if (RARRAY_LEN(rb_out_args) == 0) { return Qnil; } else { return rb_out_args; } } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-arguments.c000066400000000000000000003301601511343406000330140ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2024 Ruby-GNOME 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 */ #include "rb-gi-private.h" static gboolean rb_gi_is_registered_type(GIInfoType type) { switch (type) { case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_UNION: return TRUE; default: return FALSE; } } static void rb_gi_arg_metadata_type_init(RBGIArgMetadataType *type, GITypeInfo *type_info) { type->info = type_info; type->pointer_p = FALSE; type->tag = GI_TYPE_TAG_VOID; type->interface_info = NULL; type->interface_type = GI_INFO_TYPE_INVALID; type->interface_gtype = G_TYPE_INVALID; if (type->info) { type->pointer_p = g_type_info_is_pointer(type->info); type->tag = g_type_info_get_tag(type->info); } if (type->tag == GI_TYPE_TAG_INTERFACE) { type->interface_info = g_type_info_get_interface(type_info); type->interface_type = g_base_info_get_type(type->interface_info); if (rb_gi_is_registered_type(type->interface_type)) { type->interface_gtype = g_registered_type_info_get_g_type(type->interface_info); } } } static void rb_gi_arg_metadata_type_clear(RBGIArgMetadataType *type) { if (type->interface_info) { g_base_info_unref(type->interface_info); } if (type->info) { g_base_info_unref(type->info); } } void rb_gi_arg_metadata_init_type_info(RBGIArgMetadata *metadata, GITypeInfo *type_info) { metadata->type_info = type_info; rb_gi_arg_metadata_type_init(&(metadata->type), type_info); rb_gi_arg_metadata_type_init(&(metadata->element_type), NULL); rb_gi_arg_metadata_type_init(&(metadata->key_type), NULL); rb_gi_arg_metadata_type_init(&(metadata->value_type), NULL); metadata->scope_type = GI_SCOPE_TYPE_INVALID; metadata->direction = GI_DIRECTION_IN; metadata->transfer = GI_TRANSFER_NOTHING; metadata->array_type = GI_ARRAY_TYPE_C; metadata->callback_p = FALSE; metadata->closure_p = FALSE; metadata->destroy_p = FALSE; metadata->interface_p = (metadata->type.tag == GI_TYPE_TAG_INTERFACE); metadata->array_p = (metadata->type.tag == GI_TYPE_TAG_ARRAY); metadata->array_length_p = FALSE; metadata->may_be_null_p = FALSE; metadata->caller_allocates_p = FALSE; metadata->zero_terminated_p = FALSE; metadata->input_buffer_p = FALSE; metadata->output_buffer_p = FALSE; metadata->in_arg_index = -1; metadata->closure_in_arg_index = -1; metadata->destroy_in_arg_index = -1; metadata->rb_arg_index = -1; metadata->out_arg_index = -1; metadata->in_arg = NULL; metadata->out_arg = NULL; metadata->rb_arg = Qnil; metadata->array_metadata = NULL; metadata->array_length_metadata = NULL; metadata->array_length_arg = NULL; metadata->free_func = NULL; metadata->free_func_data = NULL; switch (metadata->type.tag) { case GI_TYPE_TAG_ARRAY: metadata->zero_terminated_p = g_type_info_is_zero_terminated(type_info); metadata->array_type = g_type_info_get_array_type(type_info); rb_gi_arg_metadata_type_init(&(metadata->element_type), g_type_info_get_param_type(type_info, 0)); break; case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: rb_gi_arg_metadata_type_init(&(metadata->element_type), g_type_info_get_param_type(type_info, 0)); break; case GI_TYPE_TAG_GHASH: rb_gi_arg_metadata_type_init(&(metadata->key_type), g_type_info_get_param_type(type_info, 0)); rb_gi_arg_metadata_type_init(&(metadata->value_type), g_type_info_get_param_type(type_info, 1)); break; default: break; } } void rb_gi_arg_metadata_init_struct_info(RBGIArgMetadata *metadata, GIStructInfo *struct_info, gpointer struct_memory) { metadata->struct_info = struct_info; metadata->struct_memory = struct_memory; } static RBGIArgMetadata * rb_gi_arg_metadata_new(GICallableInfo *callable_info, gint i) { /* We can't use ALLOC() (Ruby API) here because this may be called in a thread that isn't the Ruby's main thread. */ RBGIArgMetadata *metadata = g_new(RBGIArgMetadata, 1); metadata->callable_info = callable_info; GIArgInfo *arg_info = &(metadata->arg_info); g_callable_info_load_arg(callable_info, i, arg_info); metadata->name = g_base_info_get_name(arg_info); metadata->struct_info = NULL; metadata->struct_memory = NULL; metadata->index = i; rb_gi_arg_metadata_init_type_info(metadata, g_arg_info_get_type(arg_info)); metadata->scope_type = g_arg_info_get_scope(arg_info); metadata->direction = g_arg_info_get_direction(arg_info); metadata->transfer = g_arg_info_get_ownership_transfer(arg_info); metadata->callback_p = (metadata->scope_type != GI_SCOPE_TYPE_INVALID); metadata->may_be_null_p = g_arg_info_may_be_null(arg_info); metadata->caller_allocates_p = g_arg_info_is_caller_allocates(arg_info); metadata->input_buffer_p = rb_gi_arg_info_is_input_buffer(arg_info); metadata->output_buffer_p = rb_gi_arg_info_is_output_buffer(arg_info); return metadata; } void rb_gi_arg_metadata_clear(RBGIArgMetadata *metadata) { rb_gi_arg_metadata_type_clear(&(metadata->value_type)); rb_gi_arg_metadata_type_clear(&(metadata->key_type)); rb_gi_arg_metadata_type_clear(&(metadata->element_type)); rb_gi_arg_metadata_type_clear(&(metadata->type)); } void rb_gi_arg_metadata_free(RBGIArgMetadata *metadata) { rb_gi_arg_metadata_clear(metadata); g_free(metadata); } static void rb_gi_arguments_allocate(RBGIArguments *args) { if (!args->info) { return; } gint n_args = g_callable_info_get_n_args(args->info); gint i; for (i = 0; i < n_args; i++) { GIArgument argument = {0}; RBGIArgMetadata *metadata; GIDirection direction; metadata = rb_gi_arg_metadata_new(args->info, i); direction = metadata->direction; if (direction == GI_DIRECTION_IN || direction == GI_DIRECTION_INOUT) { metadata->in_arg_index = args->in_args->len; g_array_append_val(args->in_args, argument); } if (direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT) { metadata->out_arg_index = args->out_args->len; g_array_append_val(args->out_args, argument); } g_ptr_array_add(args->metadata, metadata); } for (i = 0; i < n_args; i++) { RBGIArgMetadata *metadata; GIDirection direction; metadata = g_ptr_array_index(args->metadata, i); direction = metadata->direction; if (direction == GI_DIRECTION_IN || direction == GI_DIRECTION_INOUT) { metadata->in_arg = &g_array_index(args->in_args, GIArgument, metadata->in_arg_index); } if (direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT) { metadata->out_arg = &g_array_index(args->out_args, GIArgument, metadata->out_arg_index); } } } static void rb_gi_arguments_fill_metadata_callback(RBGIArguments *args) { GPtrArray *metadata = args->metadata; guint i; for (i = 0; i < metadata->len; i++) { RBGIArgMetadata *callback_metadata; GIArgInfo *arg_info; gint closure_index; gint destroy_index; callback_metadata = g_ptr_array_index(metadata, i); arg_info = &(callback_metadata->arg_info); closure_index = g_arg_info_get_closure(arg_info); if (closure_index != -1) { RBGIArgMetadata *closure_metadata; closure_metadata = g_ptr_array_index(metadata, closure_index); closure_metadata->closure_p = TRUE; callback_metadata->closure_in_arg_index = closure_metadata->in_arg_index; } destroy_index = g_arg_info_get_destroy(arg_info); if (destroy_index != -1) { RBGIArgMetadata *destroy_metadata; destroy_metadata = g_ptr_array_index(args->metadata, destroy_index); destroy_metadata->destroy_p = TRUE; callback_metadata->destroy_in_arg_index = destroy_metadata->in_arg_index; } } } static void rb_gi_arguments_fill_metadata_array(RBGIArguments *args) { GPtrArray *metadata = args->metadata; guint i; for (i = 0; i < metadata->len; i++) { RBGIArgMetadata *array_metadata; RBGIArgMetadata *array_length_metadata; GITypeInfo *type_info; gint array_length_index = -1; array_metadata = g_ptr_array_index(metadata, i); type_info = array_metadata->type.info; if (!array_metadata->array_p) { continue; } array_length_index = g_type_info_get_array_length(type_info); if (array_length_index == -1) { continue; } array_length_metadata = g_ptr_array_index(metadata, array_length_index); array_length_metadata->array_length_p = TRUE; array_length_metadata->rb_arg_index = -1; array_length_metadata->array_metadata = array_metadata; array_metadata->array_length_metadata = array_length_metadata; if (array_length_metadata->in_arg) { array_metadata->array_length_arg = array_length_metadata->in_arg; } else { array_metadata->array_length_arg = array_length_metadata->out_arg; } } } static void rb_gi_arguments_fill_metadata_array_from_callable_info(RBGIArguments *args) { GICallbackInfo *info = args->info; GPtrArray *metadata = args->metadata; 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(metadata, array_length_index); array_length_metadata->array_length_p = TRUE; array_length_metadata->rb_arg_index = -1; } static void rb_gi_arguments_fill_metadata_rb_arg_index(RBGIArguments *args) { guint i; gint rb_arg_index = 0; for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; metadata = g_ptr_array_index(args->metadata, i); if (metadata->callback_p) { continue; } if (metadata->closure_p) { continue; } if (metadata->destroy_p) { continue; } if (metadata->array_length_p) { continue; } if (metadata->in_arg_index == -1 && !metadata->output_buffer_p) { continue; } metadata->rb_arg_index = rb_arg_index; if (RARRAY_LEN(args->rb_args) > metadata->rb_arg_index) { metadata->rb_arg = RARRAY_AREF(args->rb_args, metadata->rb_arg_index); } rb_arg_index++; } } static void rb_gi_arguments_fill_metadata(RBGIArguments *args) { if (!args->metadata) { return; } rb_gi_arguments_fill_metadata_callback(args); rb_gi_arguments_fill_metadata_array(args); rb_gi_arguments_fill_metadata_array_from_callable_info(args); if (args->rb_mode_p) { rb_gi_arguments_fill_metadata_rb_arg_index(args); } } static void rb_gi_arguments_fill_rb_args(RBGIArguments *args) { rb_gi_arguments_in_init(args); rb_gi_arguments_out_init(args); } static void rb_gi_arguments_fill_raw_args(RBGIArguments *args) { guint i; for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; metadata = g_ptr_array_index(args->metadata, i); if (metadata->direction == GI_DIRECTION_INOUT) { GIArgument *argument = &g_array_index(args->in_args, GIArgument, metadata->in_arg_index); argument->v_pointer = *((gpointer *)(args->raw_args[i])); } } rb_gi_arguments_in_init(args); rb_gi_arguments_out_init(args); } static void rb_gi_arguments_metadata_free(gpointer data) { RBGIArgMetadata *metadata = data; if (metadata->scope_type == GI_SCOPE_TYPE_ASYNC) { /* We can't free async scope argument's metadata immediately * because async scope argument is called later and it uses its * metadata. Its metadata is freed when async scope argument is called. * * Exception: We can free GDestroyNotify's metadata * immediately because GDestroyNotify is only used in * Ruby/GObjectIntrospection and Ruby/GObjectIntorspection * doesn't use GDestroyNotify's metadata. */ if (!metadata->destroy_p) { return; } } /* We can't free notified scope argument's metadata immediately * because notified scope argument is called later and it uses its * metadata. Its metadata is freed when its GDestroyNotify is called. */ if (metadata->scope_type == GI_SCOPE_TYPE_NOTIFIED) { return; } rb_gi_arg_metadata_free(metadata); } static gboolean rb_gi_arguments_gobject_based_p(RBGIArguments *args) { GIBaseInfo *container_info; GIRegisteredTypeInfo *registered_type_info; container_info = g_base_info_get_container(args->info); if (g_base_info_get_type(container_info) != GI_INFO_TYPE_STRUCT) { return TRUE; } registered_type_info = (GIRegisteredTypeInfo *)container_info; if (g_registered_type_info_get_type_init(registered_type_info)) { return TRUE; } return FALSE; } void rb_gi_arguments_init(RBGIArguments *args, GICallableInfo *info, VALUE rb_receiver, VALUE rb_args, void **raw_args) { args->info = info; if (info) { args->namespace = g_base_info_get_namespace(info); if (GI_IS_FUNCTION_INFO(info)) { args->name = g_function_info_get_symbol((GIFunctionInfo *)info); } else { args->name = g_base_info_get_name(info); } } else { args->namespace = NULL; args->name = NULL; } args->rb_receiver = rb_receiver; args->receiver_type_class = NULL; args->rb_args = rb_args; args->raw_args = raw_args; if (NIL_P(rb_args) && !raw_args) { args->in_args = NULL; args->out_args = NULL; args->metadata = NULL; } else { args->in_args = g_array_new(FALSE, FALSE, sizeof(GIArgument)); args->out_args = g_array_new(FALSE, FALSE, sizeof(GIArgument)); args->metadata = g_ptr_array_new_with_free_func(rb_gi_arguments_metadata_free); } args->rb_mode_p = !(NIL_P(rb_args)); if (!NIL_P(rb_receiver)) { GIArgument receiver; VALUE rb_receiver_class; rb_receiver_class = rb_class_of(rb_receiver); if (rb_gi_arguments_gobject_based_p(args) || rb_respond_to(rb_receiver_class, rb_intern("gtype"))) { receiver.v_pointer = RVAL2GOBJ(rb_receiver); } else if (RVAL2CBOOL(rb_obj_is_kind_of(rb_receiver, rb_cClass)) && rb_respond_to(rb_receiver, rb_intern("gtype"))) { args->receiver_type_class = g_type_class_ref(CLASS2GTYPE(rb_receiver)); receiver.v_pointer = args->receiver_type_class; } else { receiver.v_pointer = rb_gi_struct_get_raw(rb_receiver, G_TYPE_NONE); } if (receiver.v_pointer) { g_array_append_val(args->in_args, receiver); } } rb_gi_arguments_allocate(args); rb_gi_arguments_fill_metadata(args); if (!NIL_P(rb_args)) { rb_gi_arguments_fill_rb_args(args); } else if (raw_args) { rb_gi_arguments_fill_raw_args(args); } } void rb_gi_arguments_clear(RBGIArguments *args) { rb_gi_arguments_in_clear(args); rb_gi_arguments_out_clear(args); if (args->receiver_type_class) { g_type_class_unref(args->receiver_type_class); } if (args->in_args) { g_array_unref(args->in_args); } if (args->out_args) { g_array_unref(args->out_args); } if (args->metadata) { g_ptr_array_unref(args->metadata); } } VALUE rb_gi_arguments_get_rb_in_args(RBGIArguments *args) { return rb_gi_arguments_in_to_ruby(args); } VALUE rb_gi_arguments_get_rb_out_args(RBGIArguments *args) { return rb_gi_arguments_out_to_ruby(args); } typedef struct { RBGIArguments *args; GIArgument *arg; RBGIArgMetadata *arg_metadata; gboolean duplicate; GIInterfaceInfo *interface_info; } InterfaceToRubyData; static VALUE rb_gi_arguments_convert_arg_interface_body(VALUE user_data) { InterfaceToRubyData *data = (InterfaceToRubyData *)user_data; GIInfoType interface_type = g_base_info_get_type(data->interface_info); GType gtype = g_registered_type_info_get_g_type(data->interface_info); switch (interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: GIArgument(interface)[%s] -> Ruby", g_info_type_to_string(interface_type)); return Qnil; case GI_INFO_TYPE_STRUCT: return rb_gi_struct_info_to_ruby(data->interface_info, data->arg->v_pointer, !data->duplicate); case GI_INFO_TYPE_BOXED: rb_raise(rb_eNotImpError, "TODO: GIArgument(interface)[%s] -> Ruby", g_info_type_to_string(interface_type)); return Qnil; case GI_INFO_TYPE_ENUM: if (gtype == G_TYPE_NONE) { return INT2NUM(data->arg->v_int32); } else { return GENUM2RVAL(data->arg->v_int32, gtype); } case GI_INFO_TYPE_FLAGS: if (gtype == G_TYPE_NONE) { return INT2NUM(data->arg->v_int32); } else { return GFLAGS2RVAL(data->arg->v_int32, gtype); } case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: if (!G_IS_OBJECT(data->arg->v_pointer)) { GIObjectInfoRefFunction ref = g_object_info_get_ref_function_pointer(data->arg_metadata->type.interface_info); if (ref) { ref(data->arg->v_pointer); } } return GOBJ2RVAL(data->arg->v_pointer); case GI_INFO_TYPE_CONSTANT: rb_raise(rb_eNotImpError, "TODO: GIArgument(interface)[%s] -> Ruby", g_info_type_to_string(interface_type)); return Qnil; case GI_INFO_TYPE_INVALID_0: g_assert_not_reached(); return Qnil; case GI_INFO_TYPE_UNION: return BOXED2RVAL(data->arg->v_pointer, gtype); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(interface)[%s] -> Ruby", g_info_type_to_string(interface_type)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_interface_ensure(VALUE user_data) { InterfaceToRubyData *data = (InterfaceToRubyData *)user_data; if (data->interface_info) { g_base_info_unref(data->interface_info); } return Qnil; } static VALUE rb_gi_arguments_convert_arg_interface(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata, gboolean duplicate) { InterfaceToRubyData data; data.args = args; data.arg = arg; data.arg_metadata = arg_metadata; data.duplicate = duplicate; data.interface_info = g_type_info_get_interface(arg_metadata->type_info); return rb_ensure(rb_gi_arguments_convert_arg_interface_body, (VALUE)&data, rb_gi_arguments_convert_arg_interface_ensure, (VALUE)&data); } typedef struct { RBGIArguments *args; GIArgument *arg; RBGIArgMetadata *arg_metadata; GITypeInfo *element_type_info; GITypeTag element_type_tag; GITypeInfo *interface_type_info; } ArrayLikeToRubyData; static VALUE rb_gi_arguments_convert_arg_array_like_ensure(VALUE user_data) { ArrayLikeToRubyData *data = (ArrayLikeToRubyData *)user_data; if (data->element_type_info) { g_base_info_unref(data->element_type_info); } if (data->interface_type_info) { g_base_info_unref(data->interface_type_info); } return Qnil; } gint64 rb_gi_argument_out_array_get_length(GIArgument *arg, RBGIArgMetadata *metadata, gboolean is_pointer) { switch (metadata->type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: rb_raise(rb_eNotImpError, "TODO: invalid out array length argument?: <%s>", g_type_tag_to_string(metadata->type.tag)); return -1; case GI_TYPE_TAG_INT8: if (is_pointer) { return *((gint8 *)(arg->v_pointer)); } else { return arg->v_int8; } case GI_TYPE_TAG_UINT8: if (is_pointer) { return *((guint8 *)(arg->v_pointer)); } else { return arg->v_uint8; } case GI_TYPE_TAG_INT16: if (is_pointer) { return *((gint16 *)(arg->v_pointer)); } else { return arg->v_int16; } case GI_TYPE_TAG_UINT16: if (is_pointer) { return *((guint16 *)(arg->v_pointer)); } else { return arg->v_uint16; } case GI_TYPE_TAG_INT32: if (is_pointer) { return *((gint32 *)(arg->v_pointer)); } else { return arg->v_int32; } case GI_TYPE_TAG_UINT32: if (is_pointer) { return *((guint32 *)(arg->v_pointer)); } else { return arg->v_uint32; } case GI_TYPE_TAG_INT64: if (is_pointer) { return *((gint64 *)(arg->v_pointer)); } else { return arg->v_int64; } case GI_TYPE_TAG_UINT64: if (is_pointer) { return *((guint64 *)(arg->v_pointer)); } else { return arg->v_uint64; } case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: case GI_TYPE_TAG_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: invalid out array length argument?: <%s>", g_type_tag_to_string(metadata->type.tag)); return -1; default: g_assert_not_reached(); return -1; } } static gint64 rb_gi_arguments_convert_arg_array_body_get_length(ArrayLikeToRubyData *data) { GITypeInfo *type_info = data->arg_metadata->type_info; gint length_index = g_type_info_get_array_length(type_info); if (length_index == -1) { return -1; } if (!data->args->metadata && data->arg_metadata->struct_info) { GIFieldInfo *field_info = g_struct_info_get_field(data->arg_metadata->struct_info, length_index); GIArgument value; g_field_info_get_field(field_info, data->arg_metadata->struct_memory, &value); RBGIArgMetadata length_metadata; GITypeInfo *length_type_info = g_field_info_get_type(field_info); rb_gi_arg_metadata_init_type_info(&length_metadata, length_type_info); rb_gi_arg_metadata_init_struct_info(&length_metadata, data->arg_metadata->struct_info, data->arg_metadata->struct_memory); int64_t length = rb_gi_argument_out_array_get_length(&value, &length_metadata, FALSE); /* TODO: Use ensure */ rb_gi_arg_metadata_clear(&length_metadata); g_base_info_unref(field_info); return length; } GIArgument *length_arg = NULL; RBGIArgMetadata *length_metadata = g_ptr_array_index(data->args->metadata, length_index); if (length_metadata->direction == GI_DIRECTION_OUT) { length_arg = &g_array_index(data->args->out_args, GIArgument, length_metadata->out_arg_index); } else if (length_metadata->direction == GI_DIRECTION_INOUT) { length_arg = &g_array_index(data->args->in_args, GIArgument, length_metadata->in_arg_index); } if (length_arg) { gboolean is_pointer = !(length_metadata->array_metadata && length_metadata->array_metadata->output_buffer_p); return rb_gi_argument_out_array_get_length(length_arg, length_metadata, is_pointer); } else { length_arg = &g_array_index(data->args->in_args, GIArgument, length_metadata->in_arg_index); return rb_gi_argument_out_array_get_length(length_arg, length_metadata, FALSE); } } static VALUE rb_gi_arguments_convert_arg_array_body_c_sized_interface( ArrayLikeToRubyData *data, gint64 length, const char *array_c_type) { gconstpointer *elements = data->arg->v_pointer; data->interface_type_info = g_type_info_get_interface(data->element_type_info); GIInfoType type = g_base_info_get_type(data->interface_type_info); GType gtype = g_registered_type_info_get_g_type(data->interface_type_info); switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][interface(%s)](%s) -> Ruby", array_c_type, g_info_type_to_string(type), g_type_name(gtype)); return Qnil; case GI_INFO_TYPE_STRUCT: if (gtype == G_TYPE_NONE) { VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, rb_gi_struct_info_to_ruby(data->interface_type_info, (gpointer)elements[i], TRUE)); } return rb_arg; } else { /* TODO: Should we check caller_allocates? */ gsize struct_size = g_struct_info_get_size(data->interface_type_info); VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { gpointer element = ((gchar *)elements) + struct_size * i; rb_ary_push(rb_arg, BOXED2RVAL(element, gtype)); } return rb_arg; } case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][interface(%s)](%s) -> Ruby", array_c_type, g_info_type_to_string(type), g_type_name(gtype)); return Qnil; case GI_INFO_TYPE_OBJECT: { VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, GOBJ2RVAL((GObject *)(elements[i]))); } return rb_arg; } case GI_INFO_TYPE_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][interface(%s)](%s) -> Ruby", array_c_type, g_info_type_to_string(type), g_type_name(gtype)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_array_body_c_sized(ArrayLikeToRubyData *data, gint64 length) { const char *array_c_type = "length"; gconstpointer elements = data->arg->v_pointer; switch (data->element_type_tag) { case GI_TYPE_TAG_VOID: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][%s] -> Ruby", array_c_type, g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_BOOLEAN: { const gboolean *booleans = (const gboolean *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, CBOOL2RVAL(booleans[i])); } return rb_arg; } case GI_TYPE_TAG_INT8: { const gint8 *numbers = (const gint8 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, INT2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_UINT8: if (data->arg_metadata->input_buffer_p) { VALUE rb_arg = rb_str_new_static(elements, length); rb_str_freeze(rb_arg); return rb_arg; } else { const guint8 *numbers = (const guint8 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, UINT2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_INT16: { const gint16 *numbers = (const gint16 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, INT2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_UINT16: { const guint16 *numbers = (const guint16 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, UINT2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_INT32: { const gint32 *numbers = (const gint32 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, INT2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_UINT32: { const guint32 *numbers = (const guint32 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, UINT2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_INT64: { const gint64 *numbers = (const gint64 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, LL2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_UINT64: { const guint64 *numbers = (const guint64 *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, ULL2NUM(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_FLOAT: { const gfloat *numbers = (const gfloat *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, rb_float_new(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_DOUBLE: { const gdouble *numbers = (const gdouble *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, rb_float_new(numbers[i])); } return rb_arg; } case GI_TYPE_TAG_GTYPE: { const GType *types = (const GType *)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, rbgobj_gtype_new(types[i])); } return rb_arg; } case GI_TYPE_TAG_UTF8: { const gchar **strings = (const gchar **)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, CSTR2RVAL(strings[i])); } return rb_arg; } case GI_TYPE_TAG_FILENAME: { const gchar **filenames = (const gchar **)elements; VALUE rb_arg = rb_ary_new_capa(length); gint64 i; for (i = 0; i < length; i++) { rb_ary_push(rb_arg, CSTRFILENAME2RVAL(filenames[i])); } return rb_arg; } case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][%s] -> Ruby", array_c_type, g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_INTERFACE: return rb_gi_arguments_convert_arg_array_body_c_sized_interface( data, length, array_c_type); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][%s] -> Ruby", array_c_type, g_type_tag_to_string(data->element_type_tag)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_array_body_c_fixed_size(ArrayLikeToRubyData *data, gint fixed_size) { const char *array_c_type = "fixed-size"; switch (data->element_type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][%s] -> Ruby", array_c_type, g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_INT8: { gint8 *array = (gint8 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_INT2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_UINT8: { guint8 *array = (guint8 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_UINT2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_INT16: { gint16 *array = (gint16 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_INT2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_UINT16: { guint16 *array = (guint16 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_UINT2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_INT32: { gint32 *array = (gint32 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_INT2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_UINT32: { guint32 *array = (guint32 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_UINT2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_INT64: { gint64 *array = (gint64 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_LL2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_UINT64: { guint64 *array = (guint64 *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, RB_ULL2NUM(array[i])); } return rb_array; } case GI_TYPE_TAG_FLOAT: { float *array = (float *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, rb_float_new(array[i])); } return rb_array; } case GI_TYPE_TAG_DOUBLE: { double *array = (double *)(data->arg->v_pointer); VALUE rb_array = rb_ary_new_capa(fixed_size); gint i; for (i = 0; i < fixed_size; i++) { rb_ary_push(rb_array, rb_float_new(array[i])); } return rb_array; } case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][%s] -> Ruby", array_c_type, g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_INTERFACE: return rb_gi_arguments_convert_arg_array_body_c_sized_interface( data, fixed_size, array_c_type); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c][%s][%s] -> Ruby", array_c_type, g_type_tag_to_string(data->element_type_tag)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_array_body_c(ArrayLikeToRubyData *data, gint64 length) { gconstpointer *elements = data->arg->v_pointer; if (!elements) { return rb_ary_new(); } GITypeInfo *type_info = data->arg_metadata->type_info; gint fixed_size = g_type_info_get_array_fixed_size(type_info); gboolean zero_terminated_p = g_type_info_is_zero_terminated(type_info); if (length != -1) { return rb_gi_arguments_convert_arg_array_body_c_sized(data, length); } else if (zero_terminated_p) { return STRV2RVAL((const gchar **)elements); } else if (fixed_size != -1) { return rb_gi_arguments_convert_arg_array_body_c_fixed_size(data, fixed_size); } else { rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[c] -> Ruby: " "zero-terminated: %s " "fixed-size: %d " "length: %" G_GINT64_FORMAT, zero_terminated_p ? "true" : "false", fixed_size, length); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_array_body_array_interface(ArrayLikeToRubyData *data) { GArray *elements = data->arg->v_pointer; data->interface_type_info = g_type_info_get_interface(data->element_type_info); GIInfoType type = g_base_info_get_type(data->interface_type_info); GType gtype = g_registered_type_info_get_g_type(data->interface_type_info); switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; case GI_INFO_TYPE_STRUCT: if (gtype == G_TYPE_NONE) { VALUE rb_arg = rb_ary_new_capa(elements->len); guint element_size = g_array_get_element_size(elements); guint i; for (i = 0; i < elements->len; i++) { gpointer element; element = elements->data + (element_size * i); rb_ary_push(rb_arg, rb_gi_struct_info_to_ruby(data->interface_type_info, element, FALSE)); } return rb_arg; } else { rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; } case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_array_body_array(ArrayLikeToRubyData *data) { GArray *elements = data->arg->v_pointer; if (!elements) { return Qnil; } switch (data->element_type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[array][%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_INTERFACE: return rb_gi_arguments_convert_arg_array_body_array_interface(data); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[array][%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_array_body(VALUE user_data) { ArrayLikeToRubyData *data = (ArrayLikeToRubyData *)user_data; GITypeInfo *type_info = data->arg_metadata->type_info; GIArrayType array_type = g_type_info_get_array_type(type_info); switch (array_type) { case GI_ARRAY_TYPE_C: { gint64 length = rb_gi_arguments_convert_arg_array_body_get_length(data); return rb_gi_arguments_convert_arg_array_body_c(data, length); } case GI_ARRAY_TYPE_ARRAY: return rb_gi_arguments_convert_arg_array_body_array(data); case GI_ARRAY_TYPE_PTR_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[ptr-array] -> Ruby"); return Qnil; case GI_ARRAY_TYPE_BYTE_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[byte-array] -> Ruby"); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_array(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata) { ArrayLikeToRubyData data; data.args = args; data.arg = arg; data.arg_metadata = arg_metadata; data.element_type_info = g_type_info_get_param_type(arg_metadata->type_info, 0); data.element_type_tag = g_type_info_get_tag(data.element_type_info); data.interface_type_info = NULL; return rb_ensure(rb_gi_arguments_convert_arg_array_body, (VALUE)&data, rb_gi_arguments_convert_arg_array_like_ensure, (VALUE)&data); } static VALUE rb_gi_arguments_convert_arg_glist_body_interface(ArrayLikeToRubyData *data) { data->interface_type_info = g_type_info_get_interface(data->element_type_info); GIInfoType type = g_base_info_get_type(data->interface_type_info); GType gtype = g_registered_type_info_get_g_type(data->interface_type_info); switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: GIArgument(GList)[interface(%s)](%s) -> Ruby", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; case GI_INFO_TYPE_STRUCT: if (gtype == G_TYPE_NONE) { VALUE rb_arg = rb_ary_new(); GList *node; for (node = data->arg->v_pointer; node; node = g_list_next(node)) { rb_ary_push(rb_arg, rb_gi_struct_info_to_ruby(data->interface_type_info, node->data, TRUE)); } return rb_arg; } else if (gtype == G_TYPE_VARIANT) { VALUE rb_arg = rb_ary_new(); GList *node; for (node = data->arg->v_pointer; node; node = g_list_next(node)) { rb_ary_push(rb_arg, rbg_variant_to_ruby(node->data)); } return rb_arg; } else { return BOXEDGLIST2RVAL(data->arg->v_pointer, gtype); } case GI_INFO_TYPE_BOXED: return BOXEDGLIST2RVAL(data->arg->v_pointer, gtype); case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: return GOBJGLIST2RVAL(data->arg->v_pointer); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(GList)[interface(%s)](%s) -> Ruby", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_glist_body(VALUE user_data) { ArrayLikeToRubyData *data = (ArrayLikeToRubyData *)user_data; switch (data->element_type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: GIArgument(GList)[%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_UTF8: return CSTRGLIST2RVAL(data->arg->v_pointer); case GI_TYPE_TAG_FILENAME: return FILENAMEGLIST2RVAL(data->arg->v_pointer); case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(GList)[%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_INTERFACE: return rb_gi_arguments_convert_arg_glist_body_interface(data); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(GList)[%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_glist(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata) { ArrayLikeToRubyData data; data.args = args; data.arg = arg; data.arg_metadata = arg_metadata; data.element_type_info = g_type_info_get_param_type(arg_metadata->type_info, 0); data.element_type_tag = g_type_info_get_tag(data.element_type_info); data.interface_type_info = NULL; return rb_ensure(rb_gi_arguments_convert_arg_glist_body, (VALUE)&data, rb_gi_arguments_convert_arg_array_like_ensure, (VALUE)&data); } static VALUE rb_gi_arguments_convert_arg_gslist_body_interface(ArrayLikeToRubyData *data) { data->interface_type_info = g_type_info_get_interface(data->element_type_info); GIInfoType type = g_base_info_get_type(data->interface_type_info); GType gtype = g_registered_type_info_get_g_type(data->interface_type_info); switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: GIArgument(GSList)[interface(%s)](%s) -> Ruby", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; case GI_INFO_TYPE_STRUCT: if (gtype == G_TYPE_NONE) { VALUE rb_arg = rb_ary_new(); GSList *node; for (node = data->arg->v_pointer; node; node = g_slist_next(node)) { rb_ary_push(rb_arg, rb_gi_struct_info_to_ruby(data->interface_type_info, node->data, TRUE)); } return rb_arg; } else if (gtype == G_TYPE_VARIANT) { VALUE rb_arg = rb_ary_new(); GSList *node; for (node = data->arg->v_pointer; node; node = g_slist_next(node)) { rb_ary_push(rb_arg, rbg_variant_to_ruby(node->data)); } return rb_arg; } else { return BOXEDGSLIST2RVAL(data->arg->v_pointer, gtype); } case GI_INFO_TYPE_BOXED: return BOXEDGSLIST2RVAL(data->arg->v_pointer, gtype); case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: return GOBJGSLIST2RVAL(data->arg->v_pointer); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(GSList)[interface(%s)](%s) -> Ruby", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_gslist_body(VALUE user_data) { ArrayLikeToRubyData *data = (ArrayLikeToRubyData *)user_data; switch (data->element_type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: GIArgument(GSList)[%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_UTF8: return CSTRGSLIST2RVAL(data->arg->v_pointer); case GI_TYPE_TAG_FILENAME: return FILENAMEGSLIST2RVAL(data->arg->v_pointer); case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(GSList)[%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; case GI_TYPE_TAG_INTERFACE: return rb_gi_arguments_convert_arg_gslist_body_interface(data); 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(GSList)[%s] -> Ruby", g_type_tag_to_string(data->element_type_tag)); return Qnil; default: g_assert_not_reached(); return Qnil; } } static VALUE rb_gi_arguments_convert_arg_gslist(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata) { ArrayLikeToRubyData data; data.args = args; data.arg = arg; data.arg_metadata = arg_metadata; data.element_type_info = g_type_info_get_param_type(arg_metadata->type_info, 0); data.element_type_tag = g_type_info_get_tag(data.element_type_info); data.interface_type_info = NULL; return rb_ensure(rb_gi_arguments_convert_arg_gslist_body, (VALUE)&data, rb_gi_arguments_convert_arg_array_like_ensure, (VALUE)&data); } typedef struct { RBGIArguments *args; GIArgument *arg; RBGIArgMetadata *arg_metadata; VALUE rb_table; RBGIArgMetadata *key_metadata; RBGIArgMetadata *value_metadata; } GHashToRubyData; static void rb_gi_arguments_convert_arg_ghash_foreach_body(gpointer key, gpointer value, gpointer user_data) { GHashToRubyData *data = user_data; VALUE rb_key; VALUE rb_value; switch (data->key_metadata->type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: GIArgument(GHash)[%s][%s] -> Ruby", g_type_tag_to_string(data->key_metadata->type.tag), g_type_tag_to_string(data->value_metadata->type.tag)); break; case GI_TYPE_TAG_UTF8: rb_key = CSTR2RVAL(key); break; case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(GHash)[%s][%s] -> Ruby", g_type_tag_to_string(data->key_metadata->type.tag), g_type_tag_to_string(data->value_metadata->type.tag)); break; case GI_TYPE_TAG_INTERFACE: { GIArgument key_arg; key_arg.v_pointer = key; rb_key = rb_gi_arguments_convert_arg_interface(data->args, &key_arg, data->key_metadata, FALSE); } 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(GHash)[%s][%s] -> Ruby", g_type_tag_to_string(data->key_metadata->type.tag), g_type_tag_to_string(data->value_metadata->type.tag)); break; default: g_assert_not_reached(); break; } switch (data->value_metadata->type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: GIArgument(GHash)[%s][%s] -> Ruby", g_type_tag_to_string(data->key_metadata->type.tag), g_type_tag_to_string(data->value_metadata->type.tag)); break; case GI_TYPE_TAG_UTF8: rb_value = CSTR2RVAL(value); break; case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: GIArgument(GHash)[%s][%s] -> Ruby", g_type_tag_to_string(data->key_metadata->type.tag), g_type_tag_to_string(data->value_metadata->type.tag)); break; case GI_TYPE_TAG_INTERFACE: { GIArgument value_arg; value_arg.v_pointer = value; rb_value = rb_gi_arguments_convert_arg_interface( data->args, &value_arg, data->value_metadata, FALSE); } 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: rb_raise(rb_eNotImpError, "TODO: GIArgument(GHash)[%s][%s] -> Ruby", g_type_tag_to_string(data->key_metadata->type.tag), g_type_tag_to_string(data->value_metadata->type.tag)); break; default: g_assert_not_reached(); break; } rb_hash_aset(data->rb_table, rb_key, rb_value); } static VALUE rb_gi_arguments_convert_arg_ghash_body(VALUE user_data) { GHashToRubyData *data = (GHashToRubyData *)user_data; g_hash_table_foreach(data->arg->v_pointer, rb_gi_arguments_convert_arg_ghash_foreach_body, data); return data->rb_table; } static VALUE rb_gi_arguments_convert_arg_ghash_ensure(VALUE user_data) { GHashToRubyData *data = (GHashToRubyData *)user_data; rb_gi_arg_metadata_clear(data->key_metadata); rb_gi_arg_metadata_clear(data->value_metadata); return Qnil; } static VALUE rb_gi_arguments_convert_arg_ghash(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata) { if (arg_metadata->may_be_null_p && !arg->v_pointer) { return Qnil; } GHashToRubyData data; data.args = args; data.arg = arg; data.arg_metadata = arg_metadata; data.rb_table = rb_hash_new(); GITypeInfo *type_info = arg_metadata->type_info; RBGIArgMetadata key_metadata; rb_gi_arg_metadata_init_type_info(&key_metadata, g_type_info_get_param_type(type_info, 0)); rb_gi_arg_metadata_init_struct_info(&key_metadata, NULL, NULL); data.key_metadata = &key_metadata; RBGIArgMetadata value_metadata; rb_gi_arg_metadata_init_type_info(&value_metadata, g_type_info_get_param_type(type_info, 1)); rb_gi_arg_metadata_init_struct_info(&value_metadata, NULL, NULL); data.value_metadata = &value_metadata; return rb_ensure(rb_gi_arguments_convert_arg_ghash_body, (VALUE)&data, rb_gi_arguments_convert_arg_ghash_ensure, (VALUE)&data); } static VALUE rb_gi_arguments_convert_arg_unichar(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata) { GError *error = NULL; gunichar ucs4_character = arg->v_uint32; gchar *utf8_string = g_ucs4_to_utf8(&ucs4_character, 1, NULL, NULL, &error); if (error) { RG_RAISE_ERROR(error); } return CSTR2RVAL_FREE(utf8_string); } VALUE rb_gi_arguments_convert_arg(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata, gboolean duplicate) { GITypeTag type_tag = g_type_info_get_tag(arg_metadata->type_info); switch (type_tag) { case GI_TYPE_TAG_VOID: if (g_type_info_is_pointer(arg_metadata->type_info)) { return POINTER2NUM(arg->v_pointer); } else { return Qnil; } case GI_TYPE_TAG_BOOLEAN: return CBOOL2RVAL(arg->v_boolean); case GI_TYPE_TAG_INT8: return INT2NUM(arg->v_int8); case GI_TYPE_TAG_UINT8: return UINT2NUM(arg->v_uint8); case GI_TYPE_TAG_INT16: return INT2NUM(arg->v_int16); case GI_TYPE_TAG_UINT16: return UINT2NUM(arg->v_uint16); case GI_TYPE_TAG_INT32: return INT2NUM(arg->v_int32); case GI_TYPE_TAG_UINT32: return UINT2NUM(arg->v_uint32); case GI_TYPE_TAG_INT64: return LL2NUM(arg->v_int64); case GI_TYPE_TAG_UINT64: return ULL2NUM(arg->v_uint64); case GI_TYPE_TAG_FLOAT: return DBL2NUM(arg->v_float); case GI_TYPE_TAG_DOUBLE: return DBL2NUM(arg->v_double); case GI_TYPE_TAG_GTYPE: if (arg->v_size == G_TYPE_INVALID) { return Qnil; } else { return rbgobj_gtype_new(arg->v_size); } case GI_TYPE_TAG_UTF8: return CSTR2RVAL(arg->v_string); case GI_TYPE_TAG_FILENAME: return CSTRFILENAME2RVAL(arg->v_string); case GI_TYPE_TAG_ARRAY: return rb_gi_arguments_convert_arg_array(args, arg, arg_metadata); case GI_TYPE_TAG_INTERFACE: return rb_gi_arguments_convert_arg_interface(args, arg, arg_metadata, duplicate); case GI_TYPE_TAG_GLIST: return rb_gi_arguments_convert_arg_glist(args, arg, arg_metadata); case GI_TYPE_TAG_GSLIST: return rb_gi_arguments_convert_arg_gslist(args, arg, arg_metadata); case GI_TYPE_TAG_GHASH: return rb_gi_arguments_convert_arg_ghash(args, arg, arg_metadata); case GI_TYPE_TAG_ERROR: return GERROR2RVAL(arg->v_pointer); case GI_TYPE_TAG_UNICHAR: return rb_gi_arguments_convert_arg_unichar(args, arg, arg_metadata); default: g_assert_not_reached(); return Qnil; } } typedef struct { RBGIArguments *args; GIArgument *value; RBGIArgMetadata *metadata; } ReturnValueToRubyData; static VALUE rb_gi_arguments_convert_return_value_body(VALUE user_data) { ReturnValueToRubyData *data = (ReturnValueToRubyData *)user_data; return rb_gi_arguments_convert_arg(data->args, data->value, data->metadata, FALSE); } static void rb_gi_arguments_convert_return_value_free_container(ReturnValueToRubyData *data) { GITypeTag type_tag = data->metadata->type.tag; switch (type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: rb_raise(rb_eNotImpError, "TODO: free GIArgument(%s) as container", g_type_tag_to_string(type_tag)); break; case GI_TYPE_TAG_ARRAY: g_free(data->value->v_pointer); break; case GI_TYPE_TAG_INTERFACE: rb_raise(rb_eNotImpError, "TODO: free GIArgument(%s) as container", g_type_tag_to_string(type_tag)); break; case GI_TYPE_TAG_GLIST: g_list_free(data->value->v_pointer); break; case GI_TYPE_TAG_GSLIST: g_slist_free(data->value->v_pointer); break; case GI_TYPE_TAG_GHASH: g_hash_table_unref(data->value->v_pointer); break; case GI_TYPE_TAG_ERROR: case GI_TYPE_TAG_UNICHAR: rb_raise(rb_eNotImpError, "TODO: free GIArgument(%s) as container", g_type_tag_to_string(type_tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_convert_return_value_free_everything_array_c( ReturnValueToRubyData *data) { GITypeTag element_type_tag = data->metadata->element_type.tag; switch (element_type_tag) { case GI_TYPE_TAG_VOID: rb_raise(rb_eNotImpError, "TODO: free GIArgument(array)[c][%s] everything", g_type_tag_to_string(element_type_tag)); break; case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: g_free(data->value->v_pointer); break; case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: free GIArgument(array)[c][%s] everything", g_type_tag_to_string(element_type_tag)); break; case GI_TYPE_TAG_UTF8: g_strfreev(data->value->v_pointer); break; case GI_TYPE_TAG_FILENAME: g_strfreev(data->value->v_pointer); break; case GI_TYPE_TAG_ARRAY: case GI_TYPE_TAG_INTERFACE: 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: rb_raise(rb_eNotImpError, "TODO: free GIArgument(array)[c][%s] everything", g_type_tag_to_string(element_type_tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_convert_return_value_free_everything_array( ReturnValueToRubyData *data) { switch (data->metadata->array_type) { case GI_ARRAY_TYPE_C: rb_gi_arguments_convert_return_value_free_everything_array_c(data); break; case GI_ARRAY_TYPE_ARRAY: g_array_free(data->value->v_pointer, TRUE); break; case GI_ARRAY_TYPE_PTR_ARRAY: g_ptr_array_free(data->value->v_pointer, TRUE); break; case GI_ARRAY_TYPE_BYTE_ARRAY: g_byte_array_free(data->value->v_pointer, TRUE); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_convert_return_value_free_everything_interface( ReturnValueToRubyData *data) { if (!data->value->v_pointer) { return; } GIInfoType type = data->metadata->type.interface_type; GType gtype = data->metadata->type.interface_gtype; switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: free GIArgument(interface(%s))(%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; case GI_INFO_TYPE_STRUCT: if (gtype == G_TYPE_INVALID) { xfree(data->value->v_pointer); } else if (gtype == G_TYPE_VARIANT) { g_variant_unref(data->value->v_pointer); } else { if (G_TYPE_IS_BOXED(gtype)) { g_boxed_free(gtype, data->value->v_pointer); } else { rbgobj_instance_unref(data->value->v_pointer); } } break; case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: rb_raise(rb_eNotImpError, "TODO: free GIArgument(interface(%s))(%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; case GI_INFO_TYPE_OBJECT: { GObject *object = data->value->v_pointer; if (G_IS_OBJECT(object)) { if (g_object_is_floating(object)) { g_object_ref_sink(object); } g_object_unref(object); } else { GIObjectInfoUnrefFunction unref = g_object_info_get_unref_function_pointer(data->metadata->type.interface_info); if (unref) { unref(object); } } } break; case GI_INFO_TYPE_INTERFACE: g_object_unref(data->value->v_pointer); break; case GI_INFO_TYPE_CONSTANT: rb_raise(rb_eNotImpError, "TODO: free GIArgument(interface(%s))(%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; case GI_INFO_TYPE_INVALID_0: g_assert_not_reached(); break; case GI_INFO_TYPE_UNION: if (gtype == G_TYPE_NONE) { rb_raise(rb_eNotImpError, "TODO: free GIArgument(interface(%s))(%s) everything", g_info_type_to_string(type), g_type_name(gtype)); } else { g_boxed_free(gtype, data->value->v_pointer); } break; 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: rb_raise(rb_eNotImpError, "TODO: free GIArgument(interface(%s))(%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; default: g_assert_not_reached(); break; } } static void rb_gi_boxed_free_callback(gpointer boxed, gpointer user_data) { GType *gtype = user_data; g_boxed_free(*gtype, boxed); } static void rb_gi_arguments_convert_return_value_free_everything_glist_interface( ReturnValueToRubyData *data) { GIInfoType type = data->metadata->element_type.interface_type; GType gtype = data->metadata->element_type.interface_gtype; switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; case GI_INFO_TYPE_STRUCT: if (gtype == G_TYPE_NONE) { rb_raise(rb_eNotImpError, "TODO: free GIArgument(GList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); } else if (gtype == G_TYPE_VARIANT) { g_list_free_full(data->value->v_pointer, (GDestroyNotify)g_variant_unref); } else { g_list_foreach(data->value->v_pointer, rb_gi_boxed_free_callback, >ype); g_list_free(data->value->v_pointer); } break; case GI_INFO_TYPE_BOXED: g_list_foreach(data->value->v_pointer, rb_gi_boxed_free_callback, >ype); g_list_free(data->value->v_pointer); break; case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: g_list_free_full(data->value->v_pointer, g_object_unref); 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: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_convert_return_value_free_everything_glist( ReturnValueToRubyData *data) { if (!data->value->v_pointer) return; GITypeTag element_type_tag = data->metadata->element_type.tag; switch (element_type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GList)[%s] everything", g_type_tag_to_string(element_type_tag)); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: g_list_free_full(data->value->v_pointer, g_free); break; case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GList)[%s] everything", g_type_tag_to_string(element_type_tag)); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_convert_return_value_free_everything_glist_interface(data); 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: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GList)[%s] everything", g_type_tag_to_string(element_type_tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_convert_return_value_free_everything_gslist_interface( ReturnValueToRubyData *data) { GIInfoType type = data->metadata->element_type.interface_type; GType gtype = data->metadata->element_type.interface_gtype; switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GSList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; case GI_INFO_TYPE_STRUCT: if (gtype == G_TYPE_NONE) { rb_raise(rb_eNotImpError, "TODO: free GIArgument(GSList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); } else { g_slist_foreach(data->value->v_pointer, rb_gi_boxed_free_callback, >ype); g_slist_free(data->value->v_pointer); } break; case GI_INFO_TYPE_BOXED: g_slist_foreach(data->value->v_pointer, rb_gi_boxed_free_callback, >ype); g_slist_free(data->value->v_pointer); break; case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GSList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: g_slist_free_full(data->value->v_pointer, g_object_unref); 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: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GSList)[interface(%s)](%s) everything", g_info_type_to_string(type), g_type_name(gtype)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_convert_return_value_free_everything_gslist( ReturnValueToRubyData *data) { if (!data->value->v_pointer) return; GITypeTag element_type_tag = data->metadata->element_type.tag; switch (element_type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GSList)[%s] everything", g_type_tag_to_string(element_type_tag)); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: g_slist_free_full(data->value->v_pointer, g_free); break; case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GSList)[%s] everything", g_type_tag_to_string(element_type_tag)); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_convert_return_value_free_everything_gslist_interface(data); 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: rb_raise(rb_eNotImpError, "TODO: free GIArgument(GSList)[%s] everything", g_type_tag_to_string(element_type_tag)); break; default: g_assert_not_reached(); break; } } static void rb_gi_arguments_convert_return_value_free_everything(ReturnValueToRubyData *data) { GITypeTag type_tag = data->metadata->type.tag; switch (type_tag) { case GI_TYPE_TAG_VOID: break; case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: /* We need to do nothing. */ break; case GI_TYPE_TAG_GTYPE: rb_raise(rb_eNotImpError, "TODO: free GIArgument(%s) everything", g_type_tag_to_string(type_tag)); break; case GI_TYPE_TAG_UTF8: g_free(data->value->v_string); break; case GI_TYPE_TAG_FILENAME: g_free(data->value->v_string); break; case GI_TYPE_TAG_ARRAY: rb_gi_arguments_convert_return_value_free_everything_array(data); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_convert_return_value_free_everything_interface(data); break; case GI_TYPE_TAG_GLIST: rb_gi_arguments_convert_return_value_free_everything_glist(data); break; case GI_TYPE_TAG_GSLIST: rb_gi_arguments_convert_return_value_free_everything_gslist(data); break; case GI_TYPE_TAG_GHASH: g_hash_table_unref(data->value->v_pointer); break; case GI_TYPE_TAG_ERROR: case GI_TYPE_TAG_UNICHAR: rb_raise(rb_eNotImpError, "TODO: free GIArgument(%s) everything", g_type_tag_to_string(type_tag)); break; default: g_assert_not_reached(); break; } } static VALUE rb_gi_arguments_convert_return_value_ensure_body(VALUE user_data) { ReturnValueToRubyData *data = (ReturnValueToRubyData *)user_data; switch (g_callable_info_get_caller_owns(data->args->info)) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: rb_gi_arguments_convert_return_value_free_container(data); break; case GI_TRANSFER_EVERYTHING: rb_gi_arguments_convert_return_value_free_everything(data); break; default: g_assert_not_reached(); break; } return Qnil; } static VALUE rb_gi_arguments_convert_return_value_ensure_ensure(VALUE user_data) { ReturnValueToRubyData *data = (ReturnValueToRubyData *)user_data; rb_gi_arg_metadata_clear(data->metadata); return Qnil; } static VALUE rb_gi_arguments_convert_return_value_ensure(VALUE user_data) { return rb_ensure(rb_gi_arguments_convert_return_value_ensure_body, user_data, rb_gi_arguments_convert_return_value_ensure_ensure, user_data); } VALUE rb_gi_arguments_convert_return_value(RBGIArguments *args, GIArgument *return_value) { if (g_callable_info_may_return_null(args->info) && !return_value->v_pointer) { GITypeInfo return_value_info; g_callable_info_load_return_type(args->info, &return_value_info); GITypeTag return_value_tag = g_type_info_get_tag(&return_value_info); switch (return_value_tag) { case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: return rb_ary_new(); default: return Qnil; } } ReturnValueToRubyData data; data.args = args; data.value = return_value; RBGIArgMetadata metadata; GITypeInfo *return_value_info = g_callable_info_get_return_type(args->info); rb_gi_arg_metadata_init_type_info(&metadata, return_value_info); rb_gi_arg_metadata_init_struct_info(&metadata, NULL, NULL); data.metadata = &metadata; return rb_ensure(rb_gi_arguments_convert_return_value_body, (VALUE)&data, rb_gi_arguments_convert_return_value_ensure, (VALUE)&data); } void rb_gi_arguments_fill_raw_out_gerror(RBGIArguments *args, VALUE rb_error) { if (!g_callable_info_can_throw_gerror(args->info)) { return; } gint n_args = g_callable_info_get_n_args(args->info); /* GError ** isn't listed in args. */ GError **gerror = *((gpointer *)(args->raw_args[n_args])); VALUE cGLibErrorInfo = rb_const_get(rbg_mGLib(), rb_intern("ErrorInfo")); if (NIL_P(rb_error)) { g_set_error(gerror, RBG_RUBY_ERROR, RBG_RUBY_ERROR_UNKNOWN, "Unknown error"); } else { VALUE message = rb_funcall(rb_error, rb_intern("message"), 0); VALUE backtrace = rb_funcall(rb_error, rb_intern("backtrace"), 0); VALUE formatted_backtrace = rb_ary_join(backtrace, rb_str_new_cstr(" \n")); GQuark gdomain = RBG_RUBY_ERROR; gint gcode = RBG_RUBY_ERROR_UNKNOWN; if (RVAL2CBOOL(rb_obj_is_kind_of(rb_error, cGLibErrorInfo))) { VALUE domain = rb_funcall(rb_error, rb_intern("domain"), 0); VALUE code = rb_funcall(rb_error, rb_intern("code"), 0); if (!NIL_P(domain) && !NIL_P(code)) { gdomain = g_quark_from_string(RVAL2CSTR(domain)); gcode = NUM2INT(code); } } g_set_error(gerror, gdomain, gcode, "%s\n %s\n", RVAL2CSTR(message), RVAL2CSTR(formatted_backtrace)); } } static void rb_gi_arguments_fill_raw_result_interface(RBGIArguments *args, VALUE rb_result, gpointer raw_result, GITypeInfo *type_info, GITransfer transfer, gboolean is_return_value) { GIBaseInfo *interface_info; GIInfoType interface_type; GIFFIReturnValue *ffi_return_value = raw_result; interface_info = g_type_info_get_interface(type_info); interface_type = g_base_info_get_type(interface_info); switch (interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(interface)[%s]: <%s>", args->namespace, args->name, g_info_type_to_string(interface_type), g_base_info_get_name(interface_info)); break; case GI_INFO_TYPE_STRUCT: { gpointer value; GType gtype = g_registered_type_info_get_g_type(interface_info); if (gtype == G_TYPE_NONE) { /* Is it OK? */ /* value = RVAL2GPTR(rb_result); */ rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(interface)[%s][%s]: <%s>", args->namespace, args->name, g_info_type_to_string(interface_type), g_type_name(gtype), g_base_info_get_name(interface_info)); } else { value = RVAL2BOXED(rb_result, gtype); if (value && transfer == GI_TRANSFER_EVERYTHING) { value = g_boxed_copy(gtype, value); } } if (is_return_value) { ffi_return_value->v_pointer = value; } else { *((gpointer *)raw_result) = value; } } break; case GI_INFO_TYPE_BOXED: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(interface)[%s]: <%s>", args->namespace, args->name, g_info_type_to_string(interface_type), g_base_info_get_name(interface_info)); break; case GI_INFO_TYPE_ENUM: { gint32 value; GType gtype = g_registered_type_info_get_g_type(interface_info); if (gtype == G_TYPE_NONE) { value = NUM2INT(rb_result); } else { value = RVAL2GENUM(rb_result, gtype); } if (is_return_value) { ffi_return_value->v_ulong = value; } else { *((gint *)raw_result) = value; } } break; case GI_INFO_TYPE_FLAGS: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(interface)[%s]: <%s>", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_info_type_to_string(interface_type), g_base_info_get_name(interface_info)); break; case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_INTERFACE: { GObject *value = RVAL2GOBJ(rb_result); GType gtype = g_registered_type_info_get_g_type(interface_info); if (gtype != G_TYPE_NONE && !G_TYPE_CHECK_INSTANCE_TYPE(value, gtype)) { rb_raise(rb_eArgError, "%s::%s: must return <%s> object: <%" PRIsVALUE ">", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_type_name(gtype), rb_result); } if (transfer == GI_TRANSFER_EVERYTHING) { g_object_ref(value); } if (is_return_value) { ffi_return_value->v_pointer = value; } else { *((gpointer *)raw_result) = value; } } break; case GI_INFO_TYPE_CONSTANT: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(interface)[%s]: <%s>", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_info_type_to_string(interface_type), g_base_info_get_name(interface_info)); break; case GI_INFO_TYPE_INVALID_0: g_assert_not_reached(); break; 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: default: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(interface)[%s]: <%s>", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_info_type_to_string(interface_type), g_base_info_get_name(interface_info)); break; } g_base_info_unref(interface_info); } static void rb_gi_arguments_fill_raw_result_glist_interface( RBGIArguments *args, VALUE rb_result, gpointer raw_result, GITypeInfo *type_info, GITypeInfo *element_type_info, G_GNUC_UNUSED GITransfer transfer /* TODO */, gboolean is_return_value) { GIFFIReturnValue *ffi_return_value = raw_result; GIBaseInfo *interface_info; GIInfoType interface_type; const gchar *interface_name; GType gtype; GList *list = NULL; 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: case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: g_base_info_unref(interface_info); g_base_info_unref(element_type_info); rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(glist)[interface(%s)](%s)", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), interface_name, g_type_name(gtype)); break; case GI_INFO_TYPE_OBJECT: list = RVAL2GOBJGLIST(rb_result); if (transfer == GI_TRANSFER_EVERYTHING) { g_list_foreach(list, (GFunc)g_object_ref, NULL); } break; case GI_INFO_TYPE_INTERFACE: 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: %s::%s: out raw result(glist)[interface(%s)](%s)", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), interface_name, g_type_name(gtype)); break; default: g_base_info_unref(interface_info); g_base_info_unref(element_type_info); g_assert_not_reached(); break; } if (is_return_value) { ffi_return_value->v_ulong = (gulong)list; } else { *((gpointer *)raw_result) = list; } } static void rb_gi_arguments_fill_raw_result_glist(RBGIArguments *args, VALUE rb_result, gpointer raw_result, GITypeInfo *type_info, GITransfer transfer, gboolean is_return_value) { GIFFIReturnValue *ffi_return_value = raw_result; GITypeInfo *element_type_info; GITypeTag element_type_tag; element_type_info = g_type_info_get_param_type(type_info, 0); element_type_tag = g_type_info_get_tag(element_type_info); if (is_return_value) { ffi_return_value->v_ulong = (gulong)NULL; } else { *((gpointer *)raw_result) = NULL; } switch (element_type_tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: g_base_info_unref(element_type_info); rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(GList)[%s]", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_type_tag_to_string(element_type_tag)); break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_fill_raw_result_glist_interface( args, rb_result, raw_result, type_info, element_type_info, transfer, is_return_value); 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: %s::%s: out raw result(GList)[%s]", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info), g_type_tag_to_string(element_type_tag)); break; default: g_base_info_unref(element_type_info); g_assert_not_reached(); break; } } /* We need to cast from different type for return value. (We don't need it for out arguments.) Because of libffi specification: https://github.com/libffi/libffi/blob/master/doc/libffi.texi#L190 @var{rvalue} is a pointer to a chunk of memory that will hold the result of the function call. This must be large enough to hold the result, no smaller than the system register size (generally 32 or 64 bits), and must be suitably aligned; it is the caller's responsibility to ensure this. If @var{cif} declares that the function returns @code{void} (using @code{ffi_type_void}), then @var{rvalue} is ignored. https://github.com/libffi/libffi/blob/master/doc/libffi.texi#L198 In most situations, @samp{libffi} will handle promotion according to the ABI. However, for historical reasons, there is a special case with return values that must be handled by your code. In particular, for integral (not @code{struct}) types that are narrower than the system register size, the return value will be widened by @samp{libffi}. @samp{libffi} provides a type, @code{ffi_arg}, that can be used as the return type. For example, if the CIF was defined with a return type of @code{char}, @samp{libffi} will try to store a full @code{ffi_arg} into the return value. See also: * https://github.com/ruby-gnome/ruby-gnome/issues/758#issuecomment-243149237 * https://github.com/libffi/libffi/pull/216 This ffi_return_value case implementation is based on gi_type_info_extract_ffi_return_value(). */ static void rb_gi_arguments_fill_raw_result(RBGIArguments *args, VALUE rb_result, gpointer raw_result, GITypeInfo *type_info, GITransfer transfer, gboolean may_return_null, gboolean is_return_value) { GIFFIReturnValue *ffi_return_value = raw_result; if (may_return_null && RB_NIL_P(rb_result)) { if (is_return_value) { ffi_return_value->v_pointer = NULL; } else { *((gpointer *)raw_result) = NULL; } return; } GITypeTag type_tag = g_type_info_get_tag(type_info); switch (type_tag) { case GI_TYPE_TAG_VOID: g_assert_not_reached(); break; case GI_TYPE_TAG_BOOLEAN: if (is_return_value) { ffi_return_value->v_ulong = RVAL2CBOOL(rb_result); } else { *((gboolean *)raw_result) = RVAL2CBOOL(rb_result); } break; case GI_TYPE_TAG_INT8: if (is_return_value) { ffi_return_value->v_long = NUM2CHR(rb_result); } else { *((gint8 *)raw_result) = NUM2CHR(rb_result); } break; case GI_TYPE_TAG_UINT8: if (is_return_value) { ffi_return_value->v_ulong = (guint8)NUM2CHR(rb_result); } else { *((guint8 *)raw_result) = (guint8)NUM2CHR(rb_result); } break; case GI_TYPE_TAG_INT16: if (is_return_value) { ffi_return_value->v_long = NUM2SHORT(rb_result); } else { *((gint16 *)raw_result) = NUM2SHORT(rb_result); } break; case GI_TYPE_TAG_UINT16: if (is_return_value) { ffi_return_value->v_ulong = NUM2USHORT(rb_result); } else { *((guint16 *)raw_result) = NUM2USHORT(rb_result); } break; case GI_TYPE_TAG_INT32: if (is_return_value) { ffi_return_value->v_long = NUM2INT(rb_result); } else { *((gint32 *)raw_result) = NUM2INT(rb_result); } break; case GI_TYPE_TAG_UINT32: if (is_return_value) { ffi_return_value->v_ulong = NUM2UINT(rb_result); } else { *((guint32 *)raw_result) = NUM2UINT(rb_result); } break; case GI_TYPE_TAG_INT64: *((gint64 *)raw_result) = NUM2LL(rb_result); break; case GI_TYPE_TAG_UINT64: *((guint64 *)raw_result) = NUM2ULL(rb_result); break; case GI_TYPE_TAG_FLOAT: *((gfloat *)raw_result) = NUM2DBL(rb_result); break; case GI_TYPE_TAG_DOUBLE: *((gdouble *)raw_result) = NUM2DBL(rb_result); break; case GI_TYPE_TAG_GTYPE: if (is_return_value) { ffi_return_value->v_ulong = rbgobj_gtype_from_ruby(rb_result); } else { *((gsize *)raw_result) = rbgobj_gtype_from_ruby(rb_result); } break; case GI_TYPE_TAG_UTF8: { gchar *result = (gchar *)RVAL2CSTR_ACCEPT_SYMBOL(rb_result); if (transfer == GI_TRANSFER_EVERYTHING) { result = g_strdup(result); } if (is_return_value) { ffi_return_value->v_ulong = (gulong)result; } else { *((gchar **)raw_result) = (gchar *)result; } } break; case GI_TYPE_TAG_FILENAME: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(%s)", args->namespace, args->name, g_type_tag_to_string(type_tag)); /* if (is_return_value) { */ /* ffi_return_value->v_ulong = */ /* (gulong)rbg_filename_from_ruby(rb_result); */ /* } else { */ /* *((gchar **)raw_result) = */ /* (gchar *)rbg_filename_from_ruby(rb_result); */ /* } */ /* free */ break; case GI_TYPE_TAG_ARRAY: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(%s)", args->namespace, args->name, g_type_tag_to_string(type_tag)); /* if (is_return_value) { */ /* ffi_return_value->v_ulong = (gulong)(argument.v_pointer); */ /* } else { */ /* *((gpointer *)raw_result) = argument.v_pointer; */ /* } */ break; case GI_TYPE_TAG_INTERFACE: rb_gi_arguments_fill_raw_result_interface(args, rb_result, raw_result, type_info, transfer, is_return_value); break; case GI_TYPE_TAG_GLIST: rb_gi_arguments_fill_raw_result_glist(args, rb_result, raw_result, type_info, transfer, is_return_value); break; case GI_TYPE_TAG_GSLIST: case GI_TYPE_TAG_GHASH: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(%s)", args->namespace, args->name, g_type_tag_to_string(type_tag)); /* if (is_return_value) { */ /* ffi_return_value->v_ulong = (gulong)(argument.v_pointer); */ /* } else { */ /* *((gpointer *)raw_result) = argument.v_pointer; */ /* } */ break; case GI_TYPE_TAG_ERROR: rb_raise(rb_eNotImpError, "TODO: %s::%s: out raw result(%s)", args->namespace, args->name, g_type_tag_to_string(type_tag)); /* if (is_return_value) { */ /* ffi_return_value->v_ulong = (gulong)(argument.v_pointer); */ /* } else { */ /* *((GError **)raw_result) = argument.v_pointer; */ /* } */ break; case GI_TYPE_TAG_UNICHAR: if (is_return_value) { ffi_return_value->v_ulong = NUM2UINT(rb_result); } else { *((gunichar *)raw_result) = NUM2UINT(rb_result); } break; default: g_assert_not_reached(); break; } } void rb_gi_arguments_fill_raw_results(RBGIArguments *args, VALUE rb_results, gpointer raw_return_value) { const gboolean rb_results_is_array = RB_TYPE_P(rb_results, RUBY_T_ARRAY); int i_rb_result = 0; guint i; GITypeInfo *return_type_info; GITypeTag return_type_tag; return_type_info = g_callable_info_get_return_type(args->info); return_type_tag = g_type_info_get_tag(return_type_info); if (return_type_tag != GI_TYPE_TAG_VOID) { GITransfer transfer = g_callable_info_get_caller_owns(args->info); gboolean may_return_null = g_callable_info_may_return_null(args->info); if (args->out_args->len == 0) { VALUE rb_return_value = rb_results; rb_gi_arguments_fill_raw_result(args, rb_return_value, raw_return_value, return_type_info, transfer, may_return_null, TRUE); } else { VALUE rb_return_value; if (rb_results_is_array) { rb_return_value = RARRAY_AREF(rb_results, i_rb_result); } else { rb_return_value = rb_results; } i_rb_result++; rb_gi_arguments_fill_raw_result(args, rb_return_value, raw_return_value, return_type_info, transfer, may_return_null, TRUE); } } g_base_info_unref(return_type_info); for (i = 0; i < args->metadata->len; i++) { RBGIArgMetadata *metadata; GIArgument *argument; GITypeInfo *type_info; GITransfer transfer; metadata = g_ptr_array_index(args->metadata, i); /* TODO: support GI_DIRECTION_INOUT */ if (metadata->direction != GI_DIRECTION_OUT) { continue; } argument = &g_array_index(args->out_args, GIArgument, metadata->out_arg_index); type_info = g_arg_info_get_type(&(metadata->arg_info)); transfer = g_arg_info_get_ownership_transfer(&(metadata->arg_info)); VALUE rb_result_value; if (rb_results_is_array) { rb_result_value = RARRAY_AREF(rb_results, i_rb_result); } else { if (i_rb_result == 0) { rb_result_value = rb_results; } else { rb_result_value = RUBY_Qnil; } } i_rb_result++; rb_gi_arguments_fill_raw_result(args, rb_result_value, argument->v_pointer, type_info, transfer, metadata->may_be_null_p, FALSE); g_base_info_unref(type_info); } } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-array-type.c000066400000000000000000000030271511343406000331030ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2019 Ruby-GNOME 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 */ #include "rb-gi-private.h" VALUE rb_gi_array_type_to_ruby(GIArrayType type) { if (type == (GIArrayType)-1) { return Qnil; } else { return GENUM2RVAL(type, G_TYPE_I_ARRAY_TYPE); } } const gchar * rb_gi_array_type_to_string(GIArrayType type) { switch (type) { case GI_ARRAY_TYPE_C: return "C"; case GI_ARRAY_TYPE_ARRAY: return "GArray"; case GI_ARRAY_TYPE_PTR_ARRAY: return "GPtrArray"; case GI_ARRAY_TYPE_BYTE_ARRAY: return "GByteArray"; default: return "unknown"; } } void rb_gi_array_type_init(VALUE rb_mGI) { G_DEF_CLASS(G_TYPE_I_ARRAY_TYPE, "ArrayType", rb_mGI); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-base-info.c000066400000000000000000000127171511343406000326570ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2021 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIBaseInfo #define SELF(self) RVAL2GI_BASE_INFO(self) VALUE rb_gi_base_info_to_ruby(GIBaseInfo *info) { GType g_type; GIInfoType info_type; if (!info) { return Qnil; } info_type = g_base_info_get_type(info); switch (info_type) { case GI_INFO_TYPE_INVALID: g_type = GI_TYPE_BASE_INFO; break; case GI_INFO_TYPE_FUNCTION: { GIFunctionInfoFlags flags; flags = g_function_info_get_flags((GIFunctionInfo *)info); if (flags & GI_FUNCTION_IS_METHOD) { g_type = GI_TYPE_METHOD_INFO; } else if (flags & GI_FUNCTION_IS_CONSTRUCTOR) { g_type = GI_TYPE_CONSTRUCTOR_INFO; } else { g_type = GI_TYPE_FUNCTION_INFO; } } break; case GI_INFO_TYPE_CALLBACK: g_type = GI_TYPE_CALLBACK_INFO; break; case GI_INFO_TYPE_STRUCT: g_type = GI_TYPE_STRUCT_INFO; break; case GI_INFO_TYPE_BOXED: g_type = GI_TYPE_BOXED_INFO; break; case GI_INFO_TYPE_ENUM: g_type = GI_TYPE_ENUM_INFO; break; case GI_INFO_TYPE_FLAGS: g_type = GI_TYPE_FLAGS_INFO; break; case GI_INFO_TYPE_OBJECT: g_type = GI_TYPE_OBJECT_INFO; break; case GI_INFO_TYPE_INTERFACE: g_type = GI_TYPE_INTERFACE_INFO; break; case GI_INFO_TYPE_CONSTANT: g_type = GI_TYPE_CONSTANT_INFO; break; case GI_INFO_TYPE_INVALID_0: g_type = GI_TYPE_BASE_INFO; break; case GI_INFO_TYPE_UNION: g_type = GI_TYPE_UNION_INFO; break; case GI_INFO_TYPE_VALUE: g_type = GI_TYPE_VALUE_INFO; break; case GI_INFO_TYPE_SIGNAL: g_type = GI_TYPE_SIGNAL_INFO; break; case GI_INFO_TYPE_VFUNC: g_type = GI_TYPE_VFUNC_INFO; break; case GI_INFO_TYPE_PROPERTY: g_type = GI_TYPE_PROPERTY_INFO; break; case GI_INFO_TYPE_FIELD: g_type = GI_TYPE_FIELD_INFO; break; case GI_INFO_TYPE_ARG: g_type = GI_TYPE_ARG_INFO; break; case GI_INFO_TYPE_TYPE: g_type = GI_TYPE_TYPE_INFO; break; case GI_INFO_TYPE_UNRESOLVED: g_type = GI_TYPE_UNRESOLVED_INFO; break; default: g_type = GI_TYPE_BASE_INFO; break; } return BOXED2RVAL(info, g_type); } VALUE rb_gi_base_info_to_ruby_with_unref(GIBaseInfo *info) { VALUE rb_info; rb_info = rb_gi_base_info_to_ruby(info); if (!NIL_P(rb_info)) { g_base_info_unref(info); } return rb_info; } GIBaseInfo * rb_gi_base_info_from_ruby(VALUE rb_info) { return RVAL2BOXED(rb_info, GI_TYPE_BASE_INFO); } static VALUE rg_type(VALUE self) { GIBaseInfo *info; info = SELF(self); return GI_INFO_TYPE2RVAL(g_base_info_get_type(info)); } static VALUE rg_name(VALUE self) { GIBaseInfo *info; info = SELF(self); return CSTR2RVAL(g_base_info_get_name(info)); } static VALUE rg_namespace(VALUE self) { GIBaseInfo *info; info = SELF(self); return CSTR2RVAL(g_base_info_get_namespace(info)); } static VALUE rg_container(VALUE self) { GIBaseInfo *info; info = SELF(self); return rb_gi_base_info_to_ruby(g_base_info_get_container(info)); } static VALUE rg_operator_aref(VALUE self, VALUE name) { GIBaseInfo *info; info = SELF(self); return CSTR2RVAL(g_base_info_get_attribute(info, RVAL2CSTR(name))); } static VALUE rg_each(VALUE self) { GIAttributeIter iter = {0, }; GIBaseInfo *info; gchar *name, *value; RETURN_ENUMERATOR(self, 0, NULL); info = SELF(self); while (g_base_info_iterate_attributes(info, &iter, &name, &value)) { VALUE rb_name, rb_value; rb_name = CSTR2RVAL(name); rb_value = CSTR2RVAL(value); rb_yield(rb_ary_new3(2, rb_name, rb_value)); } return Qnil; } void rb_gi_base_info_init(VALUE rb_mGI) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS(GI_TYPE_BASE_INFO, "BaseInfo", rb_mGI); rb_include_module(RG_TARGET_NAMESPACE, rb_mEnumerable); RG_DEF_METHOD(type, 0); RG_DEF_METHOD(name, 0); RG_DEF_METHOD(namespace, 0); RG_DEF_METHOD(container, 0); RG_DEF_METHOD_OPERATOR("[]", aref, 1); RG_DEF_METHOD(each, 0); G_DEF_CLASS(G_TYPE_I_INFO_TYPE, "InfoType", rb_mGI); rb_gi_callable_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_registered_type_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_constant_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_value_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_property_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_field_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_arg_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_type_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_unresolved_info_init(rb_mGI, RG_TARGET_NAMESPACE); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-boxed-info.c000066400000000000000000000031031511343406000330330ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIBoxedInfo #define SELF(self) (RVAL2GI_BOXED_INFO(self)) GType gi_boxed_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIBoxedInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } void rb_gi_boxed_info_init(VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_BOXED_INFO, "BoxedInfo", rb_mGI, rb_cGIRegisteredTypeInfo); (void)RG_TARGET_NAMESPACE; /* suppress a warning. */ } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-callable-info.c000066400000000000000000000057421511343406000335040ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGICallableInfo #define SELF(self) RVAL2GI_CALLABLE_INFO(self) GType gi_callable_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GICallableInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_can_throw_gerror_p(VALUE self) { GICallableInfo *info = SELF(self); return CBOOL2RVAL(g_callable_info_can_throw_gerror(info)); } static VALUE rg_return_type(VALUE self) { GICallableInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_callable_info_get_return_type(info)); } static VALUE rg_caller_owns(VALUE self) { GICallableInfo *info; info = SELF(self); return GI_TRANSFER2RVAL(g_callable_info_get_caller_owns(info)); } static VALUE rg_may_return_null_p(VALUE self) { GICallableInfo *info; info = SELF(self); return CBOOL2RVAL(g_callable_info_may_return_null(info)); } static VALUE rg_n_args(VALUE self) { GICallableInfo *info; info = SELF(self); return INT2NUM(g_callable_info_get_n_args(info)); } static VALUE rg_get_arg(VALUE self, VALUE rb_n) { GICallableInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_callable_info_get_arg(info, n)); } void rb_gi_callable_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_CALLABLE_INFO, "CallableInfo", rb_mGI, rb_cGIBaseInfo); RG_DEF_METHOD_P(can_throw_gerror, 0); RG_DEF_METHOD(return_type, 0); RG_DEF_METHOD(caller_owns, 0); RG_DEF_METHOD_P(may_return_null, 0); RG_DEF_METHOD(n_args, 0); RG_DEF_METHOD(get_arg, 1); rb_gi_function_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_callback_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_signal_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_vfunc_info_init(rb_mGI, RG_TARGET_NAMESPACE); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-callback-info.c000066400000000000000000000031061511343406000334710ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGICallbackInfo #define SELF(self) RVAL2GI_BASE_INFO(self) GType gi_callback_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GICallbackInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } void rb_gi_callback_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_CALLBACK_INFO, "CallbackInfo", rb_mGI, rb_cGICallableInfo); (void)RG_TARGET_NAMESPACE; /* suppress a warning. */ } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-callback.c000066400000000000000000000326521511343406000325500ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #if !GI_CHECK_VERSION(1, 72, 0) # define g_callable_info_create_closure(callable_info, \ cif, \ callback, \ user_data) \ g_callable_info_prepare_closure((callable_info), \ (cif), \ (callback), \ (user_data)) # define g_callable_info_get_closure_native_address(callable_info, \ closure) \ (closure) # define g_callable_info_destroy_closure(callable_info, \ closure) \ g_callable_info_free_closure((callable_info), \ (closure)) #endif struct RBGICallbackData_ { RBGICallback *callback; RBGIArgMetadata *metadata; VALUE rb_callback; GObject *owner; VALUE rb_owner; }; typedef struct { RBGIArguments *args; RBGICallback *callback; RBGICallbackData *callback_data; void *return_value; VALUE rb_return_value; } RBGICallbackInvokeData; static GPtrArray *callback_finders; static VALUE mGI = Qnil; static VALUE rb_gi_callback_invoke_without_protect(VALUE user_data) { RBGICallbackInvokeData *data = (RBGICallbackInvokeData *)user_data; VALUE rb_args = rb_gi_arguments_get_rb_in_args(data->args); if (data->callback->method_name) { ID id___send__; VALUE rb_receiver = rb_ary_shift(rb_args); CONST_ID(id___send__, "__send__"); rb_ary_unshift(rb_args, rb_str_new_cstr(data->callback->method_name)); data->rb_return_value = rb_funcallv(rb_receiver, id___send__, RARRAY_LENINT(rb_args), RARRAY_CONST_PTR(rb_args)); } else { ID id_call; CONST_ID(id_call, "call"); VALUE rb_callback = rb_gi_callback_data_get_rb_callback(data->callback_data); data->rb_return_value = rb_funcallv(rb_callback, id_call, RARRAY_LENINT(rb_args), RARRAY_CONST_PTR(rb_args)); } return Qnil; } static VALUE rb_gi_callback_invoke_fill_raw_results(VALUE user_data) { RBGICallbackInvokeData *data = (RBGICallbackInvokeData *)user_data; rb_gi_arguments_fill_raw_results(data->args, data->rb_return_value, data->return_value); return Qnil; } static VALUE rb_gi_callback_invoke(VALUE user_data) { RBGICallbackInvokeData *data = (RBGICallbackInvokeData *)user_data; int state = 0; rb_protect(rb_gi_callback_invoke_without_protect, user_data, &state); if (state != 0) { VALUE error = rb_errinfo(); if (!g_callable_info_can_throw_gerror(data->args->info)) { rbgutil_on_callback_error(error); } rb_gi_arguments_fill_raw_out_gerror(data->args, error); rb_protect(rb_gi_callback_invoke_fill_raw_results, user_data, &state); } else { rb_protect(rb_gi_callback_invoke_fill_raw_results, user_data, &state); if (state != 0) { VALUE error = rb_errinfo(); if (!g_callable_info_can_throw_gerror(data->args->info)) { rbgutil_on_callback_error(error); } rb_gi_arguments_fill_raw_out_gerror(data->args, error); memset(data->return_value, 0, sizeof(GIFFIReturnValue)); } } return Qnil; } static void rb_gi_ffi_closure_callback(G_GNUC_UNUSED ffi_cif *cif, void *return_value, void **raw_args, void *data) { RBGICallback *callback = data; RBGICallbackData *callback_data = NULL; RBGIArguments args; rb_gi_arguments_init(&args, callback->callback_info, Qnil, Qnil, raw_args); { guint i; for (i = 0; i < args.metadata->len; i++) { RBGIArgMetadata *metadata; metadata = g_ptr_array_index(args.metadata, i); if (!metadata->closure_p) { continue; } callback_data = *((RBGICallbackData **)(raw_args[i])); break; } if (!callback_data && args.metadata->len > 0) { RBGIArgMetadata *metadata; i = args.metadata->len - 1; metadata = g_ptr_array_index(args.metadata, i); if (metadata->type.tag == GI_TYPE_TAG_VOID && metadata->type.pointer_p && strcmp(metadata->name, "data") == 0) { callback_data = *((RBGICallbackData **)(raw_args[i])); } } } { RBGICallbackInvokeData data; data.args = &args; data.callback = callback; data.callback_data = callback_data; data.return_value = return_value; data.rb_return_value = Qnil; rbgutil_invoke_callback(rb_gi_callback_invoke, (VALUE)&data); } rb_gi_arguments_clear(&args); if (callback_data) { RBGIArgMetadata *callback_metadata = rb_gi_callback_data_get_metadata(callback_data); if (callback_metadata->scope_type == GI_SCOPE_TYPE_ASYNC) { rb_gi_callback_data_free(callback_data); } } } RBGICallback * rb_gi_callback_new(GICallbackInfo *callback_info, const gchar *method_name) { RBGICallback *callback = RB_ZALLOC(RBGICallback); callback->callback_info = callback_info; g_base_info_ref(callback->callback_info); callback->method_name = g_strdup(method_name); callback->closure = g_callable_info_create_closure(callback->callback_info, &(callback->cif), rb_gi_ffi_closure_callback, callback); callback->closure_native_address = g_callable_info_get_closure_native_address(callback->callback_info, callback->closure); return callback; } static void rb_gi_callback_free(RBGICallback *callback) { g_callable_info_destroy_closure(callback->callback_info, callback->closure); g_free(callback->method_name); g_base_info_unref(callback->callback_info); xfree(callback); } static void rb_gi_callback_data_weak_notify(gpointer data, G_GNUC_UNUSED GObject *where_the_object_was) { RBGICallbackData *callback_data = data; callback_data->owner = NULL; } RBGICallbackData * rb_gi_callback_data_new(RBGIArguments *args, RBGICallback *callback, RBGIArgMetadata *metadata) { RBGICallbackData *callback_data; VALUE rb_owner = args->rb_receiver; if (rb_gi_is_debug_mode()) { g_print("[rb-gi] callback: %s::%s()\n", g_base_info_get_namespace(args->info), g_base_info_get_name(args->info)); rb_p(rb_ary_new_from_args(2, args->rb_receiver, args->rb_args)); } callback_data = ALLOC(RBGICallbackData); callback_data->callback = callback; callback_data->metadata = metadata; callback_data->rb_callback = rb_block_proc(); if (NIL_P(rb_owner)) { /* Module function case. */ VALUE rb_first_argument = RARRAY_AREF(args->rb_args, 0); if (RVAL2CBOOL(rb_obj_is_kind_of(rb_first_argument, rbg_cGLibObject()))) { /* If the first argument of the module function call is GObject, it's suitable for owner. For example: pango_cairo_context_set_shape_renderer() */ rb_owner = rb_first_argument; } } if (RVAL2CBOOL(rb_obj_is_kind_of(rb_owner, rbg_cGLibObject()))) { rbgobj_object_add_relative(rb_owner, callback_data->rb_callback); callback_data->owner = RVAL2GOBJ(rb_owner); g_object_weak_ref(callback_data->owner, rb_gi_callback_data_weak_notify, callback_data); callback_data->rb_owner = Qnil; } else { /* Callback is GC-ed only when callback is invalidated. */ if (NIL_P(rb_owner)) { /* Module function case. */ rbgobj_add_relative(mGI, callback_data->rb_callback); callback_data->rb_owner = mGI; } else { /* Class method case. */ rbgobj_add_relative(rb_owner, callback_data->rb_callback); callback_data->rb_owner = rb_owner; } callback_data->owner = NULL; } return callback_data; } void rb_gi_callback_data_free(RBGICallbackData *callback_data) { if (callback_data->callback) { rb_gi_callback_free(callback_data->callback); } if (callback_data->owner) { VALUE rb_owner; g_object_weak_unref(callback_data->owner, rb_gi_callback_data_weak_notify, callback_data); rb_owner = rbgobj_ruby_object_from_instance2(callback_data->owner, FALSE); if (!NIL_P(rb_owner)) { rbgobj_object_remove_relative(rb_owner, callback_data->rb_callback); } } if (!NIL_P(callback_data->rb_owner)) { rbgobj_remove_relative(callback_data->rb_owner, (ID)0, callback_data->rb_callback); } rb_gi_arg_metadata_free(callback_data->metadata); xfree(callback_data); } RBGIArgMetadata * rb_gi_callback_data_get_metadata(RBGICallbackData *callback_data) { return callback_data->metadata; } VALUE rb_gi_callback_data_get_rb_callback(RBGICallbackData *callback_data) { return callback_data->rb_callback; } void rb_gi_callback_register_finder(RBGICallbackFinderFunc finder) { g_ptr_array_add(callback_finders, finder); } gpointer rb_gi_callback_find(GIArgInfo *info) { guint i; gpointer callback = NULL; for (i = 0; i < callback_finders->len; i++) { RBGICallbackFinderFunc finder = g_ptr_array_index(callback_finders, i); callback = finder(info); if (callback) { break; } } return callback; } static gboolean source_func_p(GIArgInfo *info) { GITypeInfo type_info; GIBaseInfo *interface_info; GICallableInfo *callback_info; GITypeInfo return_type_info; GIArgInfo first_arg_info; GITypeInfo first_arg_type_info; g_arg_info_load_type(info, &type_info); if (g_type_info_get_tag(&type_info) != GI_TYPE_TAG_INTERFACE) { return FALSE; } interface_info = g_type_info_get_interface(&type_info); if (g_base_info_get_type(interface_info) != GI_INFO_TYPE_CALLBACK) { g_base_info_unref(interface_info); return FALSE; } callback_info = (GICallableInfo *)interface_info; g_callable_info_load_return_type(callback_info, &return_type_info); if (g_type_info_get_tag(&return_type_info) != GI_TYPE_TAG_BOOLEAN) { g_base_info_unref(interface_info); return FALSE; } if (g_callable_info_get_n_args(interface_info) != 1) { g_base_info_unref(interface_info); return FALSE; } g_callable_info_load_arg(interface_info, 0, &first_arg_info); g_arg_info_load_type(&first_arg_info, &first_arg_type_info); if (g_type_info_get_tag(&first_arg_type_info) != GI_TYPE_TAG_VOID) { g_base_info_unref(interface_info); return FALSE; } g_base_info_unref(interface_info); return TRUE; } static gboolean source_func_callback(gpointer user_data) { RBGICallbackData *callback_data = user_data; VALUE rb_keep; ID id_call; CONST_ID(id_call, "call"); rb_keep = rb_funcall(callback_data->rb_callback, id_call, 0); if (callback_data->metadata->scope_type == GI_SCOPE_TYPE_ASYNC) { rb_gi_callback_data_free(callback_data); } return RVAL2CBOOL(rb_keep); } static gpointer source_func_callback_finder(GIArgInfo *arg_info) { if (!source_func_p(arg_info)) { return NULL; } return source_func_callback; } void rb_gi_callback_init(VALUE rb_mGI) { callback_finders = g_ptr_array_new(); rb_gi_callback_register_finder(source_func_callback_finder); mGI = rb_mGI; } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-constant-info.c000066400000000000000000000051251511343406000335710ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIConstantInfo #define SELF(self) (RVAL2GI_CONSTANT_INFO(self)) GType gi_constant_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIConstantInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_type(VALUE self) { GIConstantInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_constant_info_get_type(info)); } static VALUE rg_value(VALUE self) { GIConstantInfo *info = SELF(self); GIArgument value; G_GNUC_UNUSED gint value_size = g_constant_info_get_value(info, &value); RBGIArguments args; rb_gi_arguments_init(&args, NULL, Qnil, Qnil, NULL); RBGIArgMetadata value_metadata; rb_gi_arg_metadata_init_type_info(&value_metadata, g_constant_info_get_type(info)); rb_gi_arg_metadata_init_struct_info(&value_metadata, NULL, NULL); VALUE rb_value = rb_gi_arguments_convert_arg(&args, &value, &value_metadata, FALSE); rb_gi_arg_metadata_clear(&value_metadata); rb_gi_arguments_clear(&args); g_constant_info_free_value(info, &value); return rb_value; } void rb_gi_constant_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_CONSTANT_INFO, "ConstantInfo", rb_mGI, rb_cGIBaseInfo); RG_DEF_METHOD(type, 0); RG_DEF_METHOD(value, 0); } rb-gi-constructor-info.c000066400000000000000000000114531511343406000342470ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIConstructorInfo #define SELF(self) RVAL2GI_FUNCTION_INFO(self) GType gi_constructor_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIConstructorInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static void initialize_receiver(VALUE receiver, GICallableInfo *callable_info, GIArgument *value) { GITypeInfo return_value_info; GIBaseInfo *interface_info; GIInfoType interface_type; g_callable_info_load_return_type(callable_info, &return_value_info); if (g_type_info_get_tag(&return_value_info) != GI_TYPE_TAG_INTERFACE) { rb_raise(rb_eRuntimeError, "TODO: returned value isn't interface"); } interface_info = g_type_info_get_interface(&return_value_info); interface_type = g_base_info_get_type(interface_info); g_base_info_unref(interface_info); switch (interface_type) { case GI_INFO_TYPE_OBJECT: G_INITIALIZE(receiver, value->v_pointer); /* GTypeInstance * is also GI_INFO_TYPE_OBJECT. */ if (G_IS_OBJECT(value->v_pointer)) { gboolean was_floating; was_floating = g_object_is_floating(value->v_pointer); g_object_ref_sink(value->v_pointer); switch (g_callable_info_get_caller_owns(callable_info)) { case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: break; case GI_TRANSFER_EVERYTHING: if (!was_floating) { g_object_unref(value->v_pointer); } break; default: g_assert_not_reached(); break; } } break; case GI_INFO_TYPE_STRUCT: G_INITIALIZE(receiver, value->v_pointer); break; case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_CONSTANT: case GI_INFO_TYPE_INVALID_0: rb_raise(rb_eRuntimeError, "TODO: returned value isn't object, struct or union"); break; case GI_INFO_TYPE_UNION: G_INITIALIZE(receiver, value->v_pointer); break; 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: default: rb_raise(rb_eRuntimeError, "TODO: returned value isn't object, struct or union"); break; } } static VALUE rg_invoke(VALUE self, VALUE rb_receiver, VALUE rb_arguments) { GIFunctionInfo *info; GICallableInfo *callable_info; GIArgument return_value; info = SELF(self); callable_info = (GICallableInfo *)info; if (NIL_P(rb_receiver)) { rb_raise(rb_eArgError, "receiver is missing"); } /* TODO: use rb_protect */ rb_gi_function_info_invoke_raw(info, self, Qnil, rb_arguments, &return_value, NULL); initialize_receiver(rb_receiver, callable_info, &return_value); return rb_receiver; } void rb_gi_constructor_info_init(VALUE rb_mGI, VALUE rb_cGIFunctionInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_CONSTRUCTOR_INFO, "ConstructorInfo", rb_mGI, rb_cGIFunctionInfo); RG_DEF_METHOD(invoke, 2); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-conversions.h000066400000000000000000000074641511343406000333740ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #pragma once #define RVAL2GI_REPOSITORY(rb_object) (G_IREPOSITORY(RVAL2GOBJ(rb_object))) #define RVAL2GI_REPOSITORY_LOAD_FLAGS(rb_flags) \ (RVAL2GFLAGS(rb_flags, G_TYPE_I_REPOSITORY_LOAD_FLAGS)) #define GI_BASE_INFO2RVAL(info) \ (rb_gi_base_info_to_ruby((GIBaseInfo *)(info))) #define GI_BASE_INFO2RVAL_WITH_UNREF(info) \ (rb_gi_base_info_to_ruby_with_unref((GIBaseInfo *)(info))) #define RVAL2GI_BASE_INFO(rb_object) (rb_gi_base_info_from_ruby(rb_object)) #define RVAL2GI_REGISTERED_TYPE_INFO(rb_object) \ ((GIRegisteredTypeInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_FUNCTION_INFO(rb_object) \ ((GIFunctionInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_STRUCT_INFO(rb_object) \ ((GIStructInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_ENUM_INFO(rb_object) \ ((GIEnumInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_OBJECT_INFO(rb_object) \ ((GIObjectInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_INTERFACE_INFO(rb_object) \ ((GIInterfaceInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_CONSTANT_INFO(rb_object) \ ((GIConstantInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_UNION_INFO(rb_object) \ ((GIUnionInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_VALUE_INFO(rb_object) \ ((GIValueInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_ARG_INFO(rb_object) \ ((GIArgInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_FIELD_INFO(rb_object) \ ((GIFieldInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_TYPE_INFO(rb_object) \ ((GITypeInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_CALLABLE_INFO(rb_object) \ ((GICallableInfo *)RVAL2GI_BASE_INFO(rb_object)) #define RVAL2GI_VFUNC_INFO(rb_object) \ ((GIVFuncInfo *)RVAL2GI_BASE_INFO(rb_object)) #define GI_INFO_TYPE2RVAL(type) (GENUM2RVAL(type, G_TYPE_I_INFO_TYPE)) #define GI_TRANSFER2RVAL(transfer) (GENUM2RVAL(transfer, G_TYPE_I_TRANSFER)) #define GI_DIRECTION2RVAL(direction) (GENUM2RVAL(direction, G_TYPE_I_DIRECTION)) #define GI_SCOPE_TYPE2RVAL(scope) (GENUM2RVAL(scope, G_TYPE_I_SCOPE_TYPE)) #define RVAL2GI_TYPE_TAG(rb_tag) (RVAL2GENUM(rb_tag, G_TYPE_I_TYPE_TAG)) #define GI_TYPE_TAG2RVAL(tag) (GENUM2RVAL(tag, G_TYPE_I_TYPE_TAG)) #define GI_ARRAY_TYPE2RVAL(type) (rb_gi_array_type_to_ruby(type)) #define GI_FUNCTION_INFO_FLAGS2RVAL(tag) \ (GFLAGS2RVAL(tag, G_TYPE_I_FUNCTION_INFO_FLAGS)) #define GI_SIGNAL_FLAGS2RVAL(tag) \ (GFLAGS2RVAL(tag, G_TYPE_SIGNAL_FLAGS)) #define GI_VFUNC_INFO_FLAGS2RVAL(tag) \ (GFLAGS2RVAL(tag, G_TYPE_IV_FUNC_INFO_FLAGS)) #define GI_FIELD_INFO_FLAGS2RVAL(tag) \ (GFLAGS2RVAL(tag, G_TYPE_I_FIELD_INFO_FLAGS)) VALUE rb_gi_base_info_to_ruby (GIBaseInfo *info); VALUE rb_gi_base_info_to_ruby_with_unref(GIBaseInfo *info); GIBaseInfo *rb_gi_base_info_from_ruby (VALUE rb_info); VALUE rb_gi_array_type_to_ruby (GIArrayType type); ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-direction.c000066400000000000000000000022531511343406000327660ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019 Ruby-GNOME 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 */ #include "rb-gi-private.h" const gchar * rb_gi_direction_to_string(GIDirection direction) { switch (direction) { case GI_DIRECTION_IN: return "in"; case GI_DIRECTION_OUT: return "out"; case GI_DIRECTION_INOUT: return "inout"; default: return "unknown"; } } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-enum-info.c000066400000000000000000000072061511343406000327060ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2014 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIEnumInfo #define SELF(self) (RVAL2GI_ENUM_INFO(self)) GType gi_enum_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIEnumInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_n_values(VALUE self) { GIEnumInfo *info; info = SELF(self); return INT2NUM(g_enum_info_get_n_values(info)); } static VALUE rg_get_value(VALUE self, VALUE rb_n) { GIEnumInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_enum_info_get_value(info, n)); } static VALUE rg_values(VALUE self) { GIEnumInfo *info; gint i, n; VALUE rb_values; info = SELF(self); rb_values = rb_ary_new(); n = g_enum_info_get_n_values(info); for (i = 0; i < n; i++) { GIValueInfo *value_info; value_info = g_enum_info_get_value(info, i); rb_ary_push(rb_values, GI_BASE_INFO2RVAL_WITH_UNREF(value_info)); } return rb_values; } static VALUE rg_n_methods(VALUE self) { GIEnumInfo *info; info = SELF(self); return INT2NUM(g_enum_info_get_n_methods(info)); } static VALUE rg_get_method(VALUE self, VALUE rb_n) { GIEnumInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_enum_info_get_method(info, n)); } static VALUE rg_methods(VALUE self) { GIEnumInfo *info; gint i, n; VALUE rb_methods; info = SELF(self); rb_methods = rb_ary_new(); n = g_enum_info_get_n_methods(info); for (i = 0; i < n; i++) { GIFunctionInfo *function_info; function_info = g_enum_info_get_method(info, i); rb_ary_push(rb_methods, GI_BASE_INFO2RVAL_WITH_UNREF(function_info)); } return rb_methods; } static VALUE rg_storage_type(VALUE self) { GIEnumInfo *info; info = SELF(self); return GI_TYPE_TAG2RVAL(g_enum_info_get_storage_type(info)); } static VALUE rg_error_domain(VALUE self) { GIEnumInfo *info; info = SELF(self); return CSTR2RVAL(g_enum_info_get_error_domain(info)); } void rb_gi_enum_info_init(VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_ENUM_INFO, "EnumInfo", rb_mGI, rb_cGIRegisteredTypeInfo); RG_DEF_METHOD(n_values, 0); RG_DEF_METHOD(get_value, 1); RG_DEF_METHOD(values, 0); RG_DEF_METHOD(n_methods, 0); RG_DEF_METHOD(get_method, 1); RG_DEF_METHOD(methods, 0); RG_DEF_METHOD(storage_type, 0); RG_DEF_METHOD(error_domain, 0); rb_gi_flags_info_init(rb_mGI, RG_TARGET_NAMESPACE); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-field-info.c000066400000000000000000000376351511343406000330360ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIFieldInfo #define SELF(self) (RVAL2GI_FIELD_INFO(self)) GType gi_field_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIFieldInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_flags(VALUE self) { GIFieldInfo *info; info = SELF(self); return GI_FIELD_INFO_FLAGS2RVAL(g_field_info_get_flags(info)); } static VALUE rg_size(VALUE self) { GIFieldInfo *info; info = SELF(self); return INT2NUM(g_field_info_get_size(info)); } static VALUE rg_offset(VALUE self) { GIFieldInfo *info; info = SELF(self); return INT2NUM(g_field_info_get_offset(info)); } static VALUE rg_type(VALUE self) { GIFieldInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_field_info_get_type(info)); } typedef struct { RBGIArguments args; GIArgument value; RBGIArgMetadata metadata; GIFieldInfo *info; gpointer memory; } FieldToRubyData; static VALUE rb_gi_field_info_get_field_raw_body_interface(FieldToRubyData *data) { GIInfoType type = data->metadata.type.interface_type; GType gtype = data->metadata.type.interface_gtype; gint offset = g_field_info_get_offset(data->info); switch (type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: rb_raise(rb_eNotImpError, "TODO: GIField(interface)[%s](%s)", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; case GI_INFO_TYPE_STRUCT: { GIStructInfo *struct_info = (GIStructInfo *)(data->metadata.type.interface_info); gboolean is_pointer = g_type_info_is_pointer(data->metadata.type.info); gpointer target = (gpointer)((guint8 *)(data->memory) + offset); if (is_pointer) { target = *((gpointer *)target); } return rb_gi_struct_info_to_ruby(struct_info, target, is_pointer); } case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_UNION: case GI_INFO_TYPE_OBJECT: data->value.v_pointer = G_STRUCT_MEMBER(gpointer, data->memory, offset); return rb_gi_arguments_convert_arg(&(data->args), &(data->value), &(data->metadata), FALSE); case GI_INFO_TYPE_ENUM: { gint32 raw_value; raw_value = G_STRUCT_MEMBER(gint32, data->memory, offset); if (gtype == G_TYPE_NONE) { return INT2NUM(raw_value); } else { return GENUM2RVAL(raw_value, gtype); } } break; case GI_INFO_TYPE_FLAGS: { gint32 raw_value; raw_value = G_STRUCT_MEMBER(gint32, data->memory, offset); if (gtype == G_TYPE_NONE) { return INT2NUM(raw_value); } else { return GFLAGS2RVAL(raw_value, gtype); } } break; case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_CONSTANT: case GI_INFO_TYPE_INVALID_0: 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: default: rb_raise(rb_eNotImpError, "TODO: GIField(interface)[%s](%s)", g_info_type_to_string(type), g_type_name(gtype)); return Qnil; } } static VALUE rb_gi_field_info_get_field_raw_body(VALUE user_data) { FieldToRubyData *data = (FieldToRubyData *)user_data; gboolean processed = FALSE; switch (data->metadata.type.tag) { case GI_TYPE_TAG_VOID: case GI_TYPE_TAG_BOOLEAN: case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: case GI_TYPE_TAG_FLOAT: case GI_TYPE_TAG_DOUBLE: case GI_TYPE_TAG_GTYPE: break; case GI_TYPE_TAG_UTF8: { int offset; offset = g_field_info_get_offset(data->info); data->value.v_string = G_STRUCT_MEMBER(gchar *, data->memory, offset); processed = TRUE; } break; case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: break; case GI_TYPE_TAG_INTERFACE: { VALUE rb_value = rb_gi_field_info_get_field_raw_body_interface(data); if (!NIL_P(rb_value)) { return rb_value; } } 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: break; default: break; } if (!processed) { if (!g_field_info_get_field(data->info, data->memory, &(data->value))) { rb_raise(rb_eArgError, "failed to get field value: %s[%s]", g_base_info_get_name(data->info), g_type_tag_to_string(data->metadata.type.tag)); } } return rb_gi_arguments_convert_arg(&(data->args), &(data->value), &(data->metadata), FALSE); } static VALUE rb_gi_field_info_get_field_raw_ensure(VALUE user_data) { FieldToRubyData *data = (FieldToRubyData *)user_data; rb_gi_arguments_clear(&(data->args)); rb_gi_arg_metadata_clear(&(data->metadata)); return Qnil; } VALUE rb_gi_field_info_get_field_raw(GIFieldInfo *info, GIStructInfo *struct_info, gpointer memory) { FieldToRubyData data; rb_gi_arguments_init(&(data.args), NULL, Qnil, Qnil, NULL); GITypeInfo *type_info = g_field_info_get_type(info); rb_gi_arg_metadata_init_type_info(&(data.metadata), type_info); rb_gi_arg_metadata_init_struct_info(&(data.metadata), struct_info, memory); data.info = info; data.memory = memory; return rb_ensure(rb_gi_field_info_get_field_raw_body, (VALUE)&data, rb_gi_field_info_get_field_raw_ensure, (VALUE)&data); } void rb_gi_field_info_set_field_raw(GIFieldInfo *info, /* TODO: Use this to set length field. */ GIStructInfo *struct_info, gpointer memory, VALUE rb_field_value) { gint offset; GITypeInfo *type_info; GITypeTag type_tag; gboolean succeeded = TRUE; offset = g_field_info_get_offset(info); type_info = g_field_info_get_type(info); type_tag = g_type_info_get_tag(type_info); if ((g_field_info_get_flags(info) & GI_FIELD_IS_WRITABLE) == 0) { g_base_info_unref(type_info); rb_raise(rb_eArgError, "failed to set field value: not writable: %s[%s]", g_base_info_get_name(info), g_type_tag_to_string(type_tag)); } /* TODO: Use g_field_info_set_field() again? */ switch (type_tag) { case GI_TYPE_TAG_VOID: succeeded = FALSE; break; case GI_TYPE_TAG_BOOLEAN: G_STRUCT_MEMBER(gboolean, memory, offset) = RVAL2CBOOL(rb_field_value); break; case GI_TYPE_TAG_INT8: G_STRUCT_MEMBER(gint8, memory, offset) = NUM2CHR(rb_field_value); break; case GI_TYPE_TAG_UINT8: G_STRUCT_MEMBER(guint8, memory, offset) = (guint8)NUM2CHR(rb_field_value); break; case GI_TYPE_TAG_INT16: G_STRUCT_MEMBER(gint16, memory, offset) = NUM2SHORT(rb_field_value); break; case GI_TYPE_TAG_UINT16: G_STRUCT_MEMBER(guint16, memory, offset) = NUM2USHORT(rb_field_value); break; case GI_TYPE_TAG_INT32: G_STRUCT_MEMBER(gint32, memory, offset) = NUM2INT(rb_field_value); break; case GI_TYPE_TAG_UINT32: G_STRUCT_MEMBER(guint32, memory, offset) = NUM2UINT(rb_field_value); break; case GI_TYPE_TAG_INT64: G_STRUCT_MEMBER(gint64, memory, offset) = NUM2LL(rb_field_value); break; case GI_TYPE_TAG_UINT64: G_STRUCT_MEMBER(guint64, memory, offset) = NUM2ULL(rb_field_value); break; case GI_TYPE_TAG_FLOAT: G_STRUCT_MEMBER(gfloat, memory, offset) = NUM2DBL(rb_field_value); break; case GI_TYPE_TAG_DOUBLE: G_STRUCT_MEMBER(gdouble, memory, offset) = NUM2DBL(rb_field_value); break; case GI_TYPE_TAG_GTYPE: G_STRUCT_MEMBER(GType, memory, offset) = rbgobj_gtype_from_ruby(rb_field_value); break; case GI_TYPE_TAG_UTF8: G_STRUCT_MEMBER(const gchar *, memory, offset) = RVAL2CSTR_ACCEPT_SYMBOL(rb_field_value); break; case GI_TYPE_TAG_FILENAME: /* TODO: How to free? */ /* G_STRUCT_MEMBER(gchar *, memory, offset) = */ /* rbg_filename_from_ruby(rb_field_value); */ succeeded = FALSE; break; case GI_TYPE_TAG_ARRAY: succeeded = FALSE; break; case GI_TYPE_TAG_INTERFACE: { GIBaseInfo *interface_info; GIInfoType interface_type; interface_info = g_type_info_get_interface(type_info); interface_type = g_base_info_get_type(interface_info); switch (interface_type) { case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CALLBACK: succeeded = FALSE; break; case GI_INFO_TYPE_STRUCT: { GType gtype = g_registered_type_info_get_g_type(interface_info); G_STRUCT_MEMBER(gpointer, memory, offset) = rb_gi_struct_get_raw(rb_field_value, gtype); } break; case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_UNION: { GType gtype = g_registered_type_info_get_g_type(interface_info); if (gtype == G_TYPE_NONE) { succeeded = FALSE; } else { G_STRUCT_MEMBER(gpointer, memory, offset) = RVAL2BOXED(rb_field_value, gtype); } } break; case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: { GType gtype = g_registered_type_info_get_g_type(interface_info); GITypeTag storage_type = g_enum_info_get_storage_type(interface_info); gint value; if (gtype == G_TYPE_NONE) { value = NUM2INT(rb_field_value); } else { if (interface_type == GI_INFO_TYPE_ENUM) { value = RVAL2GENUM(rb_field_value, gtype); } else { value = RVAL2GFLAGS(rb_field_value, gtype); } } switch (storage_type) { case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: G_STRUCT_MEMBER(guint8, memory, offset) = (guint8)value; break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: G_STRUCT_MEMBER(guint16, memory, offset) = (guint16)value; break; case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: G_STRUCT_MEMBER(guint32, memory, offset) = (guint32)value; break; case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: G_STRUCT_MEMBER(guint64, memory, offset) = (guint64)value; break; default: succeeded = FALSE; break; } } break; case GI_INFO_TYPE_OBJECT: G_STRUCT_MEMBER(gpointer, memory, offset) = RVAL2GOBJ(rb_field_value); break; case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_CONSTANT: case GI_INFO_TYPE_INVALID_0: 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: succeeded = FALSE; break; default: break; } g_base_info_unref(interface_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: succeeded = FALSE; break; default: break; } g_base_info_unref(type_info); if (!succeeded) { rb_raise(rb_eArgError, "failed to set field value: %s[%s]", g_base_info_get_name(info), g_type_tag_to_string(type_tag)); } } static VALUE rg_get_field(VALUE self, VALUE rb_struct_info, VALUE rb_memory) { GIFieldInfo *info = SELF(self); GIStructInfo *struct_info = RVAL2GI_STRUCT_INFO(rb_struct_info); gpointer memory = GUINT_TO_POINTER(NUM2ULONG(rb_memory)); return rb_gi_field_info_get_field_raw(info, struct_info, memory); } static VALUE rg_set_field(VALUE self, VALUE rb_struct_info, VALUE rb_memory, VALUE rb_field_value) { GIFieldInfo *info = SELF(self); GIStructInfo *struct_info = RVAL2GI_STRUCT_INFO(rb_struct_info); gpointer memory = GUINT_TO_POINTER(NUM2ULONG(rb_memory)); rb_gi_field_info_set_field_raw(info, struct_info, memory, rb_field_value); return Qnil; } void rb_gi_field_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_FIELD_INFO, "FieldInfo", rb_mGI, rb_cGIBaseInfo); RG_DEF_METHOD(flags, 0); RG_DEF_METHOD(size, 0); RG_DEF_METHOD(offset, 0); RG_DEF_METHOD(type, 0); RG_DEF_METHOD(get_field, 2); RG_DEF_METHOD(set_field, 3); G_DEF_CLASS(G_TYPE_I_FIELD_INFO_FLAGS, "FieldInfoFlags", rb_mGI); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-flags-info.c000066400000000000000000000030051511343406000330270ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIFlagsInfo GType gi_flags_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIFlagsInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } void rb_gi_flags_info_init(VALUE rb_mGI, VALUE rb_cGIEnumInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_FLAGS_INFO, "FlagsInfo", rb_mGI, rb_cGIEnumInfo); /* Suppress a warning. */ (void)RG_TARGET_NAMESPACE; } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c000066400000000000000000000215451511343406000335710ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #ifdef HAVE_RUBY_THREAD_H # include # define RB_THREAD_CALL_WITHOUT_GVL_FUNC_RETURN_TYPE void * # define RB_THREAD_CALL_WITHOUT_GVL_FUNC_RETURN_VALUE NULL #else # define rb_thread_call_without_gvl(func, func_data, ubf, ubf_data) \ rb_thread_blocking_region(func, func_data, ubf, ubf_data) # define RB_THREAD_CALL_WITHOUT_GVL_FUNC_RETURN_TYPE VALUE # define RB_THREAD_CALL_WITHOUT_GVL_FUNC_RETURN_VALUE Qnil #endif #define RG_TARGET_NAMESPACE rb_cGIFunctionInfo #define SELF(self) RVAL2GI_FUNCTION_INFO(self) static VALUE RG_TARGET_NAMESPACE; GType gi_function_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIFunctionInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_set_lock_gvl_default(VALUE self, VALUE rb_boolean) { return rb_iv_set(self, "lock_gvl_default", rb_boolean); } static VALUE rg_add_lock_gvl_predicate(VALUE self) { VALUE rb_predicates; if (!RVAL2CBOOL(rb_ivar_defined(self, rb_intern("lock_gvl_predicates")))) { rb_predicates = rb_ary_new(); rb_iv_set(self, "lock_gvl_predicates", rb_predicates); } else { rb_predicates = rb_iv_get(self, "lock_gvl_predicates"); } rb_ary_push(rb_predicates, rb_block_lambda()); return Qnil; } static VALUE rg_lock_gvl_p(int argc, VALUE *argv, VALUE self) { VALUE rb_receiver; VALUE rb_lock_gvl_default = Qtrue; rb_scan_args(argc, argv, "01", &rb_receiver); if (RVAL2CBOOL(rb_ivar_defined(self, rb_intern("lock_gvl_default")))) { rb_lock_gvl_default = rb_iv_get(self, "lock_gvl_default"); } if (NIL_P(rb_receiver)) { return rb_lock_gvl_default; } if (!RVAL2CBOOL(rb_ivar_defined(self, rb_intern("lock_gvl_predicates")))) { return rb_lock_gvl_default; } VALUE rb_predicates = rb_iv_get(self, "lock_gvl_predicates"); long n = RARRAY_LEN(rb_predicates); long i; VALUE rb_args = rb_ary_new_from_args(2, self, rb_receiver); for (i = 0; i < n; i++) { VALUE rb_predicate = RARRAY_PTR(rb_predicates)[n - i - 1]; VALUE rb_result = rb_proc_call(rb_predicate, rb_args); if (NIL_P(rb_result)) { continue; } return rb_result; } return rb_lock_gvl_default; } static VALUE rg_symbol(VALUE self) { GIFunctionInfo *info; info = SELF(self); return CSTR2RVAL(g_function_info_get_symbol(info)); } static VALUE rg_flags(VALUE self) { GIFunctionInfo *info; info = SELF(self); return GI_FUNCTION_INFO_FLAGS2RVAL(g_function_info_get_flags(info)); } static VALUE rg_property(VALUE self) { GIFunctionInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL(g_function_info_get_property(info)); } static VALUE rg_vfunc(VALUE self) { GIFunctionInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL(g_function_info_get_vfunc(info)); } typedef struct { GIFunctionInfo *info; GArray *in_args; GArray *out_args; GIArgument return_value; GError **error; gboolean succeeded; } InvokeData; static void rb_gi_function_info_invoke_raw_call(InvokeData *data) { data->succeeded = g_function_info_invoke(data->info, (GIArgument *)((void *)(data->in_args->data)), data->in_args->len, (GIArgument *)((void *)(data->out_args->data)), data->out_args->len, &(data->return_value), data->error); } static RB_THREAD_CALL_WITHOUT_GVL_FUNC_RETURN_TYPE rb_gi_function_info_invoke_raw_call_without_gvl_body(void *user_data) { InvokeData *data = (InvokeData *)user_data; rb_gi_function_info_invoke_raw_call(data); return RB_THREAD_CALL_WITHOUT_GVL_FUNC_RETURN_VALUE; } VALUE rb_gi_function_info_invoke_raw(GIFunctionInfo *info, VALUE rb_info, VALUE rb_receiver, VALUE rb_arguments, GIArgument *return_value, VALUE *rb_return_value) { GICallableInfo *callable_info; RBGIArguments args; VALUE rb_out_args = Qnil; gboolean succeeded; GError *error = NULL; gboolean lock_gvl = FALSE; lock_gvl = RVAL2CBOOL(rb_funcall(rb_info, rb_intern("lock_gvl?"), 1, rb_receiver)); rb_arguments = rbg_to_array(rb_arguments); callable_info = (GICallableInfo *)info; rb_gi_arguments_init(&args, callable_info, rb_receiver, rb_arguments, NULL); { InvokeData data; data.info = info; data.in_args = args.in_args; data.out_args = args.out_args; data.error = &error; if (lock_gvl) { rb_gi_function_info_invoke_raw_call(&data); } else { rb_thread_call_without_gvl( rb_gi_function_info_invoke_raw_call_without_gvl_body, &data, NULL, NULL); } succeeded = data.succeeded; if (return_value) { *return_value = data.return_value; } if (rb_return_value) { if (succeeded) { *rb_return_value = rb_gi_arguments_convert_return_value(&args, &(data.return_value)); } else { *rb_return_value = Qnil; } } } if (succeeded) { rb_out_args = rb_gi_arguments_get_rb_out_args(&args); } rb_gi_arguments_clear(&args); if (!succeeded) { RG_RAISE_ERROR(error); } if (!NIL_P(rb_out_args) && RARRAY_LEN(rb_out_args) == 1) { VALUE rb_out_arg; rb_out_arg = RARRAY_AREF(rb_out_args, 0); if (rb_obj_is_kind_of(rb_out_arg, rb_eException)) { rb_exc_raise(rb_out_arg); } } return rb_out_args; } static VALUE rg_invoke(VALUE self, VALUE rb_arguments) { GIFunctionInfo *info; VALUE rb_out_args; VALUE rb_return_value; info = SELF(self); /* TODO: use rb_protect() */ rb_out_args = rb_gi_function_info_invoke_raw(info, self, Qnil, rb_arguments, NULL, &rb_return_value); if (NIL_P(rb_out_args)) { return rb_return_value; } else { GICallableInfo *callable_info = (GICallableInfo *)info; GITypeInfo return_value_info; g_callable_info_load_return_type(callable_info, &return_value_info); if (g_type_info_get_tag(&return_value_info) != GI_TYPE_TAG_VOID) { rb_ary_unshift(rb_out_args, rb_return_value); } if (RARRAY_LEN(rb_out_args) == 1) { return RARRAY_PTR(rb_out_args)[0]; } else { return rb_out_args; } } } void rb_gi_function_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo) { RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_FUNCTION_INFO, "FunctionInfo", rb_mGI, rb_cGICallableInfo); RG_DEF_METHOD(set_lock_gvl_default, 1); RG_DEF_METHOD(add_lock_gvl_predicate, 0); RG_DEF_METHOD_P(lock_gvl, -1); RG_DEF_METHOD(symbol, 0); RG_DEF_METHOD(flags, 0); RG_DEF_METHOD(property, 0); RG_DEF_METHOD(vfunc, 0); RG_DEF_METHOD(invoke, 1); G_DEF_CLASS(G_TYPE_I_FUNCTION_INFO_FLAGS, "FunctionInfoFlags", rb_mGI); rb_gi_method_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_constructor_info_init(rb_mGI, RG_TARGET_NAMESPACE); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-interface-info.c000066400000000000000000000123461511343406000337030ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2021 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIInterfaceInfo #define SELF(self) (RVAL2GI_INTERFACE_INFO(self)) GType gi_interface_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIInterfaceInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_n_prerequisites(VALUE self) { GIInterfaceInfo *info; info = SELF(self); return INT2NUM(g_interface_info_get_n_prerequisites(info)); } static VALUE rg_get_prerequisite(VALUE self, VALUE rb_n) { GIInterfaceInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_interface_info_get_prerequisite(info, n)); } static VALUE rg_n_properties(VALUE self) { GIInterfaceInfo *info; info = SELF(self); return INT2NUM(g_interface_info_get_n_properties(info)); } static VALUE rg_get_property(VALUE self, VALUE rb_n) { GIInterfaceInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_interface_info_get_property(info, n)); } static VALUE rg_n_methods(VALUE self) { GIInterfaceInfo *info; info = SELF(self); return INT2NUM(g_interface_info_get_n_methods(info)); } static VALUE rg_get_method(VALUE self, VALUE rb_n_or_name) { GIInterfaceInfo *info; GIFunctionInfo *function_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); function_info = g_interface_info_get_method(info, n); } else { const char *name; name = RVAL2CSTR(rb_n_or_name); function_info = g_interface_info_find_method(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(function_info); } static VALUE rg_n_signals(VALUE self) { GIInterfaceInfo *info; info = SELF(self); return INT2NUM(g_interface_info_get_n_signals(info)); } static VALUE rg_get_signal(VALUE self, VALUE rb_n_or_name) { GIInterfaceInfo *info; GISignalInfo *signal_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); signal_info = g_interface_info_get_signal(info, n); } else { const char *name; name = RVAL2CSTR(rb_n_or_name); signal_info = g_interface_info_find_signal(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(signal_info); } static VALUE rg_n_vfuncs(VALUE self) { GIInterfaceInfo *info; info = SELF(self); return INT2NUM(g_interface_info_get_n_vfuncs(info)); } static VALUE rg_get_vfunc(VALUE self, VALUE rb_n_or_name) { GIInterfaceInfo *info; GIVFuncInfo *vfunc_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); vfunc_info = g_interface_info_get_vfunc(info, n); } else { const gchar *name; name = RVAL2CSTR(rb_n_or_name); vfunc_info = g_interface_info_find_vfunc(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(vfunc_info); } static VALUE rg_n_constants(VALUE self) { GIInterfaceInfo *info; info = SELF(self); return INT2NUM(g_interface_info_get_n_constants(info)); } static VALUE rg_get_constant(VALUE self, VALUE rb_n) { GIInterfaceInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_interface_info_get_constant(info, n)); } static VALUE rg_iface_struct(VALUE self) { GIInterfaceInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_interface_info_get_iface_struct(info)); } void rb_gi_interface_info_init(VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_INTERFACE_INFO, "InterfaceInfo", rb_mGI, rb_cGIRegisteredTypeInfo); RG_DEF_METHOD(n_prerequisites, 0); RG_DEF_METHOD(get_prerequisite, 1); RG_DEF_METHOD(n_properties, 0); RG_DEF_METHOD(get_property, 1); RG_DEF_METHOD(n_methods, 0); RG_DEF_METHOD(get_method, 1); RG_DEF_METHOD(n_signals, 0); RG_DEF_METHOD(get_signal, 1); RG_DEF_METHOD(n_vfuncs, 0); RG_DEF_METHOD(get_vfunc, 1); RG_DEF_METHOD(n_constants, 0); RG_DEF_METHOD(get_constant, 1); RG_DEF_METHOD(iface_struct, 0); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-loader.c000066400000000000000000000264741511343406000322670ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGILoader static const gchar *boxed_class_converters_name = "@@boxed_class_converters"; static const gchar *object_class_converters_name = "@@object_class_converters"; static VALUE rg_s_define_class(int argc, VALUE *argv, G_GNUC_UNUSED VALUE klass) { VALUE rb_class; VALUE rb_gtype, rb_name, rb_module; VALUE rb_options, rb_parent, rb_size; GType gtype; rb_scan_args(argc, argv, "31", &rb_gtype, &rb_name, &rb_module, &rb_options); rbg_scan_options(rb_options, "parent", &rb_parent, "size", &rb_size, NULL); gtype = rbgobj_gtype_from_ruby(rb_gtype); rb_class = G_DEF_CLASS_WITH_PARENT(gtype, RVAL2CSTR(rb_name), rb_module, rb_parent); if (!NIL_P(rb_size)) { rb_iv_set(rb_class, "@size", rb_size); } return rb_class; } static VALUE rg_s_define_interface(G_GNUC_UNUSED VALUE klass, VALUE rb_gtype, VALUE rb_name, VALUE rb_module) { GType gtype; gtype = rbgobj_gtype_from_ruby(rb_gtype); return G_DEF_INTERFACE(gtype, RVAL2CSTR(rb_name), rb_module); } static VALUE struct_alloc(VALUE klass) { VALUE rb_size; gpointer instance = NULL; gboolean is_owned; rb_size = rb_iv_get(klass, "@size"); if (NIL_P(rb_size)) { is_owned = FALSE; } else { size_t size; size = NUM2ULL(rb_size); instance = xcalloc(1, size); is_owned = TRUE; } return rb_gi_struct_new_raw(klass, instance, is_owned); } static VALUE rg_s_define_struct(int argc, VALUE *argv, G_GNUC_UNUSED VALUE klass) { VALUE rb_size, rb_name, rb_module; VALUE rb_options, rb_parent; VALUE rb_class; rb_scan_args(argc, argv, "31", &rb_size, &rb_name, &rb_module, &rb_options); rbg_scan_options(rb_options, "parent", &rb_parent, NULL); rb_size = rb_to_int(rb_size); if (NIL_P(rb_parent)) { rb_parent = rb_cObject; } rb_class = rb_define_class_under(rb_module, RVAL2CSTR(rb_name), rb_parent); rb_iv_set(rb_class, "@size", rb_size); rb_define_alloc_func(rb_class, struct_alloc); return rb_class; } static VALUE rg_s_define_error(int argc, VALUE *argv, G_GNUC_UNUSED VALUE klass) { VALUE rb_domain, rb_name, rb_module; VALUE rb_options, rb_parent, rb_gtype; GQuark domain; const gchar *name; GType gtype = G_TYPE_INVALID; rb_scan_args(argc, argv, "31", &rb_domain, &rb_name, &rb_module, &rb_options); rbg_scan_options(rb_options, "parent", &rb_parent, "gtype", &rb_gtype, NULL); if (RB_TYPE_P(rb_domain, RUBY_T_STRING)) { domain = g_quark_from_string(RVAL2CSTR(rb_domain)); if (domain == 0) { rb_raise(rb_eArgError, "invalid domain name: <%s>", rbg_inspect(rb_domain)); } } else { domain = NUM2UINT(rb_domain); } name = RVAL2CSTR(rb_name); if (NIL_P(rb_parent)) { rb_parent = rb_eStandardError; } if (!NIL_P(rb_gtype)) { gtype = rbgobj_gtype_from_ruby(rb_gtype); } return G_DEF_ERROR(domain, name, rb_module, rb_parent, gtype); } static VALUE rg_s_implement_virtual_function(G_GNUC_UNUSED VALUE klass, VALUE rb_field_info, VALUE rb_implementor_gtype, VALUE rb_vtable_gtype, VALUE rb_method_name) { GIFieldInfo *field_info; GType implementor_gtype; GType vtable_gtype; const gchar *method_name; RBGICallback *callback; field_info = RVAL2GI_FIELD_INFO(rb_field_info); implementor_gtype = rbgobj_gtype_from_ruby(rb_implementor_gtype); vtable_gtype = rbgobj_gtype_from_ruby(rb_vtable_gtype); method_name = RVAL2CSTR(rb_method_name); { GITypeInfo *type_info; GICallbackInfo *callback_info; type_info = g_field_info_get_type(field_info); callback_info = g_type_info_get_interface(type_info); callback = rb_gi_callback_new(callback_info, method_name); g_base_info_unref(callback_info); g_base_info_unref(type_info); } { gpointer implementor_struct; gpointer vtable_struct; gint offset; gpointer *method_address; implementor_struct = g_type_class_ref(implementor_gtype); if (G_TYPE_IS_INTERFACE(vtable_gtype)) { vtable_struct = g_type_interface_peek(implementor_struct, vtable_gtype); } else { vtable_struct = implementor_struct; } offset = g_field_info_get_offset(field_info); method_address = G_STRUCT_MEMBER_P(vtable_struct, offset); *method_address = callback->closure_native_address; g_type_class_unref(implementor_struct); } return Qnil; } typedef struct { GType type; VALUE rb_converters; VALUE rb_converter; } BoxedInstance2RObjData; static void boxed_class_converter_free(gpointer user_data) { BoxedInstance2RObjData *data = user_data; rb_ary_delete(data->rb_converters, data->rb_converter); g_free(data); } static VALUE boxed_instance2robj(gpointer instance, gpointer user_data) { BoxedInstance2RObjData *data = user_data; VALUE default_rb_instance; VALUE klass; gint flags = 0; ID id_call; default_rb_instance = rbgobj_make_boxed_default(instance, data->type); CONST_ID(id_call, "call"); klass = rb_funcall(data->rb_converter, id_call, 1, default_rb_instance); return rbgobj_make_boxed_raw(instance, data->type, klass, flags); } static VALUE rg_s_register_boxed_class_converter(VALUE klass, VALUE rb_gtype) { RGConvertTable table; BoxedInstance2RObjData *data; VALUE boxed_class_converters; memset(&table, 0, sizeof(RGConvertTable)); table.type = rbgobj_gtype_from_ruby(rb_gtype); table.klass = Qnil; table.instance2robj = boxed_instance2robj; data = g_new(BoxedInstance2RObjData, 1); data->type = table.type; data->rb_converter = rb_block_proc(); boxed_class_converters = rb_cv_get(klass, boxed_class_converters_name); rb_ary_push(boxed_class_converters, data->rb_converter); table.user_data = data; table.notify = boxed_class_converter_free; rbgobj_convert_define(&table); return Qnil; } typedef struct { GType type; VALUE rb_converters; VALUE rb_converter; } ObjectInstance2RObjData; static void object_class_converter_free(gpointer user_data) { ObjectInstance2RObjData *data = user_data; rb_ary_delete(data->rb_converters, data->rb_converter); g_free(data); } static VALUE object_instance2robj(gpointer instance, gpointer user_data) { ObjectInstance2RObjData *data = user_data; VALUE existing_rb_instance; VALUE default_rb_instance; VALUE klass; ID id_call; VALUE converted_rb_instance; ID id_unref; existing_rb_instance = rbgobj_get_ruby_object_from_gobject(instance, FALSE); if (!NIL_P(existing_rb_instance)) return existing_rb_instance; default_rb_instance = rbgobj_get_ruby_object_from_gobject(instance, TRUE); CONST_ID(id_call, "call"); klass = rb_funcall(data->rb_converter, id_call, 1, default_rb_instance); if (klass == rb_class_of(default_rb_instance)) return default_rb_instance; converted_rb_instance = rbgobj_object_alloc_func(klass); g_object_ref(instance); CONST_ID(id_unref, "unref"); rb_funcall(default_rb_instance, id_unref, 0); rbgobj_gobject_initialize(converted_rb_instance, instance); return converted_rb_instance; } static VALUE rg_s_register_object_class_converter(VALUE klass, VALUE rb_gtype) { RGConvertTable table; ObjectInstance2RObjData *data; VALUE object_class_converters; memset(&table, 0, sizeof(RGConvertTable)); table.type = rbgobj_gtype_from_ruby(rb_gtype); table.klass = Qnil; table.instance2robj = object_instance2robj; data = g_new(ObjectInstance2RObjData, 1); data->type = table.type; data->rb_converter = rb_block_proc(); object_class_converters = rb_cv_get(klass, object_class_converters_name); rb_ary_push(object_class_converters, data->rb_converter); table.user_data = data; table.notify = object_class_converter_free; rbgobj_convert_define(&table); return Qnil; } static VALUE rg_s_register_constant_rename_map(G_GNUC_UNUSED VALUE klass, VALUE rb_original, VALUE rb_renamed) { G_RENAME_CONSTANT(RVAL2CSTR(rb_original), RVAL2CSTR(rb_renamed)); return Qnil; } static VALUE rg_s_start_callback_dispatch_thread(G_GNUC_UNUSED VALUE klass) { rbgutil_start_callback_dispatch_thread(); return Qnil; } static VALUE rg_s_reference_gobject(int argc, VALUE *argv, G_GNUC_UNUSED VALUE klass) { VALUE rb_gobject; VALUE rb_options, rb_sink; gpointer gobject; gboolean sink; rb_scan_args(argc, argv, "11", &rb_gobject, &rb_options); rbg_scan_options(rb_options, "sink", &rb_sink, NULL); gobject = RVAL2GOBJ(rb_gobject); if (NIL_P(rb_sink)) { sink = FALSE; } else { sink = RVAL2CBOOL(rb_sink); } if (sink) { g_object_ref_sink(gobject); } else { g_object_ref(gobject); } return Qnil; } static VALUE rg_s_instantiate_gobject_pointer(G_GNUC_UNUSED VALUE klass, VALUE rb_gobject_pointer) { GObject *gobject; gobject = (gpointer)(NUM2ULL(rb_gobject_pointer)); return GOBJ2RVAL(gobject); } void rb_gi_loader_init(VALUE rb_mGI) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = rb_define_class_under(rb_mGI, "Loader", rb_cObject); rb_cv_set(RG_TARGET_NAMESPACE, boxed_class_converters_name, rb_ary_new()); rb_cv_set(RG_TARGET_NAMESPACE, object_class_converters_name, rb_ary_new()); RG_DEF_SMETHOD(define_class, -1); RG_DEF_SMETHOD(define_interface, 3); RG_DEF_SMETHOD(define_struct, -1); RG_DEF_SMETHOD(define_error, -1); RG_DEF_SMETHOD(implement_virtual_function, 4); RG_DEF_SMETHOD(register_boxed_class_converter, 1); RG_DEF_SMETHOD(register_object_class_converter, 1); RG_DEF_SMETHOD(register_constant_rename_map, 2); RG_DEF_SMETHOD(start_callback_dispatch_thread, 0); RG_DEF_SMETHOD(reference_gobject, -1); RG_DEF_SMETHOD(instantiate_gobject_pointer, 1); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-method-info.c000066400000000000000000000052131511343406000332160ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2013 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIMethodInfo #define SELF(self) RVAL2GI_FUNCTION_INFO(self) GType gi_method_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIMethodInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_invoke(VALUE self, VALUE rb_receiver, VALUE rb_arguments) { GIFunctionInfo *info; VALUE rb_out_args; VALUE rb_return_value; info = SELF(self); /* TODO: use rb_protect */ rb_out_args = rb_gi_function_info_invoke_raw(info, self, rb_receiver, rb_arguments, NULL, &rb_return_value); if (NIL_P(rb_out_args)) { return rb_return_value; } else { GICallableInfo *callable_info = (GICallableInfo *)info; GITypeInfo return_value_info; g_callable_info_load_return_type(callable_info, &return_value_info); if (g_type_info_get_tag(&return_value_info) != GI_TYPE_TAG_VOID) { rb_ary_unshift(rb_out_args, rb_return_value); } if (RARRAY_LEN(rb_out_args) == 1) { return RARRAY_PTR(rb_out_args)[0]; } else { return rb_out_args; } } } void rb_gi_method_info_init(VALUE rb_mGI, VALUE rb_cGIFunctionInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_METHOD_INFO, "MethodInfo", rb_mGI, rb_cGIFunctionInfo); RG_DEF_METHOD(invoke, 2); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-object-info.c000066400000000000000000000202551511343406000332070ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIObjectInfo #define SELF(self) (RVAL2GI_OBJECT_INFO(self)) GType gi_object_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIObjectInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_type_name(VALUE self) { GIObjectInfo *info; info = SELF(self); return CSTR2RVAL(g_object_info_get_type_name(info)); } static VALUE rg_type_init(VALUE self) { GIObjectInfo *info; info = SELF(self); return CSTR2RVAL(g_object_info_get_type_init(info)); } static VALUE rg_abstract_p(VALUE self) { GIObjectInfo *info; info = SELF(self); return CBOOL2RVAL(g_object_info_get_abstract(info)); } static VALUE rg_fundamental_p(VALUE self) { GIObjectInfo *info; info = SELF(self); return CBOOL2RVAL(g_object_info_get_fundamental(info)); } static VALUE rg_parent(VALUE self) { GIObjectInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_object_info_get_parent(info)); } static VALUE rg_n_interfaces(VALUE self) { GIObjectInfo *info; info = SELF(self); return INT2NUM(g_object_info_get_n_interfaces(info)); } static VALUE rg_get_interface(VALUE self, VALUE rb_n) { GIObjectInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_object_info_get_interface(info, n)); } static VALUE rg_n_fields(VALUE self) { GIObjectInfo *info; info = SELF(self); return INT2NUM(g_object_info_get_n_fields(info)); } static VALUE rg_get_field(VALUE self, VALUE rb_n) { GIObjectInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_object_info_get_field(info, n)); } static VALUE rg_get_field_value(VALUE self, VALUE rb_object, VALUE rb_n) { GIObjectInfo *info; gint n; GIFieldInfo *field_info; VALUE rb_value; info = SELF(self); n = NUM2INT(rb_n); field_info = g_object_info_get_field(info, n); rb_value = rb_gi_field_info_get_field_raw(field_info, /* TODO: use info for size */ NULL, RVAL2GOBJ(rb_object)); g_base_info_unref(field_info); return rb_value; } static VALUE rg_set_field_value(VALUE self, VALUE rb_object, VALUE rb_n, VALUE rb_value) { GIObjectInfo *info; gint n; GIFieldInfo *field_info; info = SELF(self); n = NUM2INT(rb_n); field_info = g_object_info_get_field(info, n); rb_gi_field_info_set_field_raw(field_info, /* TODO: use info for size */ NULL, RVAL2GOBJ(rb_object), rb_value); /* TODO: use rb_ensure() to unref field_info. */ g_base_info_unref(field_info); return Qnil; } static VALUE rg_n_properties(VALUE self) { GIObjectInfo *info; info = SELF(self); return INT2NUM(g_object_info_get_n_properties(info)); } static VALUE rg_get_property(VALUE self, VALUE rb_n) { GIObjectInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_object_info_get_property(info, n)); } static VALUE rg_n_methods(VALUE self) { GIObjectInfo *info; info = SELF(self); return INT2NUM(g_object_info_get_n_methods(info)); } static VALUE rg_get_method(VALUE self, VALUE rb_n_or_name) { GIObjectInfo *info; GIFunctionInfo *function_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); function_info = g_object_info_get_method(info, n); } else { const gchar *name; name = RVAL2CSTR(rb_n_or_name); function_info = g_object_info_find_method(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(function_info); } static VALUE rg_n_signals(VALUE self) { GIObjectInfo *info; info = SELF(self); return INT2NUM(g_object_info_get_n_signals(info)); } static VALUE rg_get_signal(VALUE self, VALUE rb_n) { GIObjectInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_object_info_get_signal(info, n)); } static VALUE rg_n_vfuncs(VALUE self) { GIObjectInfo *info; info = SELF(self); return INT2NUM(g_object_info_get_n_vfuncs(info)); } static VALUE rg_get_vfunc(VALUE self, VALUE rb_n_or_name) { GIObjectInfo *info; GIVFuncInfo *vfunc_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); vfunc_info = g_object_info_get_vfunc(info, n); } else { const gchar *name; name = RVAL2CSTR(rb_n_or_name); vfunc_info = g_object_info_find_vfunc(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(vfunc_info); } static VALUE rg_n_constants(VALUE self) { GIObjectInfo *info; info = SELF(self); return INT2NUM(g_object_info_get_n_constants(info)); } static VALUE rg_get_constant(VALUE self, VALUE rb_n) { GIObjectInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_object_info_get_constant(info, n)); } static VALUE rg_class_struct(VALUE self) { GIObjectInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_object_info_get_class_struct(info)); } static VALUE rg_unref_function(VALUE self) { GIObjectInfo *info; info = SELF(self); return CSTR2RVAL(g_object_info_get_unref_function(info)); } static VALUE rg_ref_function(VALUE self) { GIObjectInfo *info; info = SELF(self); return CSTR2RVAL(g_object_info_get_ref_function(info)); } static VALUE rg_set_value_function(VALUE self) { GIObjectInfo *info; info = SELF(self); return CSTR2RVAL(g_object_info_get_set_value_function(info)); } static VALUE rg_get_value_function(VALUE self) { GIObjectInfo *info; info = SELF(self); return CSTR2RVAL(g_object_info_get_get_value_function(info)); } void rb_gi_object_info_init(VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_OBJECT_INFO, "ObjectInfo", rb_mGI, rb_cGIRegisteredTypeInfo); RG_DEF_METHOD(type_name, 0); RG_DEF_METHOD(type_init, 0); RG_DEF_METHOD_P(abstract, 0); RG_DEF_METHOD_P(fundamental, 0); RG_DEF_METHOD(parent, 0); RG_DEF_METHOD(n_interfaces, 0); RG_DEF_METHOD(get_interface, 1); RG_DEF_METHOD(n_fields, 0); RG_DEF_METHOD(get_field, 1); RG_DEF_METHOD(get_field_value, 2); RG_DEF_METHOD(set_field_value, 3); RG_DEF_METHOD(n_properties, 0); RG_DEF_METHOD(get_property, 1); RG_DEF_METHOD(n_methods, 0); RG_DEF_METHOD(get_method, 1); RG_DEF_METHOD(n_signals, 0); RG_DEF_METHOD(get_signal, 1); RG_DEF_METHOD(n_vfuncs, 0); RG_DEF_METHOD(get_vfunc, 1); RG_DEF_METHOD(n_constants, 0); RG_DEF_METHOD(get_constant, 1); RG_DEF_METHOD(class_struct, 0); RG_DEF_METHOD(unref_function, 0); RG_DEF_METHOD(ref_function, 0); RG_DEF_METHOD(set_value_function, 0); RG_DEF_METHOD(get_value_function, 0); } rb-gi-private-arg-info.h000066400000000000000000000020211511343406000340770ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019-2022 Ruby-GNOME 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 */ #pragma once G_GNUC_INTERNAL gboolean rb_gi_arg_info_is_input_buffer(GIArgInfo *info); G_GNUC_INTERNAL gboolean rb_gi_arg_info_is_output_buffer(GIArgInfo *info); rb-gi-private-arguments-in.h000066400000000000000000000021121511343406000350070ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019-2021 Ruby-GNOME 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 */ #pragma once G_GNUC_INTERNAL VALUE rb_gi_arguments_in_to_ruby(RBGIArguments *args); G_GNUC_INTERNAL void rb_gi_arguments_in_init(RBGIArguments *args); G_GNUC_INTERNAL void rb_gi_arguments_in_clear(RBGIArguments *args); rb-gi-private-arguments-out.h000066400000000000000000000021101511343406000352060ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019 Ruby-GNOME 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 */ #pragma once G_GNUC_INTERNAL void rb_gi_arguments_out_init(RBGIArguments *args); G_GNUC_INTERNAL void rb_gi_arguments_out_clear(RBGIArguments *args); G_GNUC_INTERNAL VALUE rb_gi_arguments_out_to_ruby(RBGIArguments *args); rb-gi-private-arguments.h000066400000000000000000000106411511343406000344110ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019-2022 Ruby-GNOME 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 */ #pragma once typedef struct { GICallableInfo *info; const gchar *namespace; const gchar *name; VALUE rb_receiver; gpointer receiver_type_class; VALUE rb_args; void **raw_args; gboolean rb_mode_p; GArray *in_args; GArray *out_args; GPtrArray *metadata; } RBGIArguments; typedef void (*RBGIArgFreeFunc)(RBGIArguments *args, RBGIArgMetadata *metadata, gpointer user_data); typedef struct { GITypeInfo *info; gboolean pointer_p; GITypeTag tag; GIBaseInfo *interface_info; GIInfoType interface_type; GType interface_gtype; } RBGIArgMetadataType; struct RBGIArgMetadata_ { GICallableInfo *callable_info; GIArgInfo arg_info; GITypeInfo *type_info; GIFieldInfo *struct_info; gpointer *struct_memory; const gchar *name; RBGIArgMetadataType type; RBGIArgMetadataType element_type; RBGIArgMetadataType key_type; RBGIArgMetadataType value_type; GIScopeType scope_type; GIDirection direction; GITransfer transfer; gboolean callback_p; gboolean closure_p; gboolean destroy_p; gboolean array_p; gboolean array_length_p; gboolean interface_p; gboolean may_be_null_p; gboolean caller_allocates_p; gboolean zero_terminated_p; gboolean input_buffer_p; gboolean output_buffer_p; GIArrayType array_type; gint index; gint in_arg_index; gint closure_in_arg_index; gint destroy_in_arg_index; gint rb_arg_index; gint out_arg_index; GIArgument *in_arg; GIArgument *out_arg; VALUE rb_arg; RBGIArgMetadata *array_metadata; RBGIArgMetadata *array_length_metadata; GIArgument *array_length_arg; RBGIArgFreeFunc free_func; gpointer free_func_data; }; G_GNUC_INTERNAL void rb_gi_arg_metadata_init_type_info(RBGIArgMetadata *metadata, GITypeInfo *type_info); G_GNUC_INTERNAL void rb_gi_arg_metadata_init_struct_info(RBGIArgMetadata *metadata, GIStructInfo *struct_info, gpointer struct_memory); G_GNUC_INTERNAL void rb_gi_arg_metadata_clear(RBGIArgMetadata *metadata); G_GNUC_INTERNAL void rb_gi_arg_metadata_free(RBGIArgMetadata *metadata); G_GNUC_INTERNAL gint64 rb_gi_argument_out_array_get_length(GIArgument *arg, RBGIArgMetadata *metadata, gboolean is_pointer); G_GNUC_INTERNAL void rb_gi_arguments_init(RBGIArguments *args, GICallableInfo *info, VALUE rb_receiver, VALUE rb_args, void **raw_args); G_GNUC_INTERNAL void rb_gi_arguments_clear(RBGIArguments *args); G_GNUC_INTERNAL VALUE rb_gi_arguments_get_rb_in_args(RBGIArguments *args); G_GNUC_INTERNAL VALUE rb_gi_arguments_get_rb_out_args(RBGIArguments *args); G_GNUC_INTERNAL VALUE rb_gi_arguments_convert_arg(RBGIArguments *args, GIArgument *arg, RBGIArgMetadata *arg_metadata, gboolean duplicate); G_GNUC_INTERNAL VALUE rb_gi_arguments_convert_return_value(RBGIArguments *args, GIArgument *return_value); G_GNUC_INTERNAL void rb_gi_arguments_fill_raw_out_gerror(RBGIArguments *args, VALUE rb_error); G_GNUC_INTERNAL void rb_gi_arguments_fill_raw_results(RBGIArguments *args, VALUE rb_results, gpointer raw_return_value); rb-gi-private-array-type.h000066400000000000000000000017751511343406000345110ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019 Ruby-GNOME 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 */ #pragma once G_GNUC_INTERNAL void rb_gi_array_type_init(VALUE rb_mGI); G_GNUC_INTERNAL const gchar * rb_gi_array_type_to_string(GIArrayType type); rb-gi-private-callback.h000066400000000000000000000027761511343406000341520ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019-2022 Ruby-GNOME 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 */ #pragma once typedef struct RBGICallback_ { GIArgInfo *arg_info; GICallbackInfo *callback_info; gchar *method_name; ffi_cif cif; ffi_closure *closure; gpointer *closure_native_address; } RBGICallback; G_GNUC_INTERNAL void rb_gi_callback_init(VALUE rb_mGI); G_GNUC_INTERNAL gpointer rb_gi_callback_find(GIArgInfo *info); G_GNUC_INTERNAL RBGICallback * rb_gi_callback_new(GICallbackInfo *callback_info, const gchar *method_name); G_GNUC_INTERNAL RBGICallbackData * rb_gi_callback_data_new(RBGIArguments *args, RBGICallback *callback, RBGIArgMetadata *metadata); rb-gi-private-direction.h000066400000000000000000000017021511343406000343620ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019 Ruby-GNOME 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 */ #pragma once G_GNUC_INTERNAL const gchar * rb_gi_direction_to_string(GIDirection type); rb-gi-private-transfer.h000066400000000000000000000017031511343406000342270ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2019 Ruby-GNOME 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 */ #pragma once G_GNUC_INTERNAL const gchar* rb_gi_transfer_to_string(GITransfer transfer); ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-private.h000066400000000000000000000127741511343406000324760ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #pragma once #include #include #include #include #include #include "gobject-introspection-enum-types.h" #ifndef GI_CHECK_VERSION # include "rbgiversion.h" #endif #include "rb-gi-types.h" #include "rb-gi-conversions.h" #include "rb-gobject-introspection.h" #include "rb-gi-private-arg-info.h" #include "rb-gi-private-arguments.h" #include "rb-gi-private-arguments-in.h" #include "rb-gi-private-arguments-out.h" #include "rb-gi-private-array-type.h" #include "rb-gi-private-callback.h" #include "rb-gi-private-direction.h" #include "rb-gi-private-transfer.h" #ifndef RB_TYPE_P # define RB_TYPE_P(object, type) (TYPE(object) == type) #endif /* GLib 2.60 or later defines this. */ #ifndef G_GNUC_FALLTHROUGH # define G_GNUC_FALLTHROUGH #endif extern void Init_gobject_introspection(void); gboolean rb_gi_is_debug_mode(void); void rb_gi_type_tag_init (VALUE rb_mGI); void rb_gi_base_info_init (VALUE rb_mGI); void rb_gi_callable_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_function_info_init (VALUE rb_mGI, VALUE rb_cGICallableInfo); void rb_gi_method_info_init (VALUE rb_mGI, VALUE rb_cGIFunctionInfo); void rb_gi_constructor_info_init (VALUE rb_mGI, VALUE rb_cGIFunctionInfo); void rb_gi_callback_info_init (VALUE rb_mGI, VALUE rb_cGICallableInfo); void rb_gi_registered_type_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_struct_info_init (VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo); void rb_gi_boxed_info_init (VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo); void rb_gi_enum_info_init (VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo); void rb_gi_flags_info_init (VALUE rb_mGI, VALUE rb_cGIEnumInfo); void rb_gi_object_info_init (VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo); void rb_gi_interface_info_init (VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo); void rb_gi_constant_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_union_info_init (VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo); void rb_gi_value_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_signal_info_init (VALUE rb_mGI, VALUE rb_cGICallableInfo); void rb_gi_vfunc_info_init (VALUE rb_mGI, VALUE rb_cGICallableInfo); void rb_gi_property_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_field_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_arg_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_type_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_unresolved_info_init (VALUE rb_mGI, VALUE rb_cGIBaseInfo); void rb_gi_repository_init (VALUE rb_mGI); void rb_gi_loader_init (VALUE rb_mGI); VALUE rb_gi_function_info_invoke_raw (GIFunctionInfo *info, VALUE rb_info, VALUE rb_receiver, VALUE rb_arguments, GIArgument *return_value, VALUE *rb_return_value); VALUE rb_gi_field_info_get_field_raw (GIFieldInfo *info, GIStructInfo *struct_info, gpointer memory); void rb_gi_field_info_set_field_raw (GIFieldInfo *info, GIStructInfo *struct_info, gpointer memory, VALUE rb_field_value); VALUE rb_gi_struct_info_to_ruby(GIStructInfo *info, gpointer object, gboolean is_pointer); gpointer rb_gi_struct_info_from_ruby(GIStructInfo *info, VALUE rb_object); ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-property-info.c000066400000000000000000000041201511343406000336160ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIPropertyInfo #define SELF(self) RVAL2GI_BASE_INFO(self) GType gi_property_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIPropertyInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_flags(VALUE self) { GIPropertyInfo *info; info = SELF(self); return INT2NUM(g_property_info_get_flags(info)); } static VALUE rg_type(VALUE self) { GIPropertyInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_property_info_get_type(info)); } static VALUE rg_ownership_transfer(VALUE self) { GIPropertyInfo *info; info = SELF(self); return GI_TRANSFER2RVAL(g_property_info_get_ownership_transfer(info)); } void rb_gi_property_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_PROPERTY_INFO, "PropertyInfo", rb_mGI, rb_cGICallableInfo); RG_DEF_METHOD(flags, 0); RG_DEF_METHOD(type, 0); RG_DEF_METHOD(ownership_transfer, 0); } rb-gi-registered-type-info.c000066400000000000000000000047451511343406000350040ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIRegisteredTypeInfo #define SELF(self) (RVAL2GI_REGISTERED_TYPE_INFO(self)) GType gi_registered_type_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIRegisteredTypeInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_type_name(VALUE self) { GIRegisteredTypeInfo *info; info = SELF(self); return CSTR2RVAL(g_registered_type_info_get_type_name(info)); } static VALUE rg_type_init(VALUE self) { GIRegisteredTypeInfo *info; info = SELF(self); return CSTR2RVAL(g_registered_type_info_get_type_init(info)); } static VALUE rg_gtype(VALUE self) { GIRegisteredTypeInfo *info; info = SELF(self); return rbgobj_gtype_new(g_registered_type_info_get_g_type(info)); } void rb_gi_registered_type_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_REGISTERED_TYPE_INFO, "RegisteredTypeInfo", rb_mGI, rb_cGIBaseInfo); RG_DEF_METHOD(type_name, 0); RG_DEF_METHOD(type_init, 0); RG_DEF_METHOD(gtype, 0); rb_gi_struct_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_boxed_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_enum_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_object_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_interface_info_init(rb_mGI, RG_TARGET_NAMESPACE); rb_gi_union_info_init(rb_mGI, RG_TARGET_NAMESPACE); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-repository.c000066400000000000000000000200511511343406000332210ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2015 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 */ /* GObjectIntrospection::Repository is used to manage repositories of * namespaces. Namespaces are represented on disk by type libraries * (.typelib files). */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIRepository #define SELF(self) RVAL2GI_REPOSITORY(self) /* Returns the singleton process-global default * GObjectIntrospection::Repository. It is not currently supported to have * multiple repositories in a particular process, but this function is provided * in the unlikely eventuality that it would become possible, and as a * convenience for higher level language bindings to conform to the GObject * method call conventions. * * @return [GObjectIntrospection::Repository] The global singleton * GObjectIntrospection::Repository. */ static VALUE rg_s_default(G_GNUC_UNUSED VALUE klass) { return GOBJ2RVAL(g_irepository_get_default()); } static VALUE rg_s_prepend_search_path(VALUE klass, VALUE rb_path) { g_irepository_prepend_search_path(RVAL2CSTR(rb_path)); return klass; } static VALUE rg_s_search_path(G_GNUC_UNUSED VALUE klass) { return FILENAMEGSLIST2RVAL(g_irepository_get_search_path()); } /* Force the namespace to be loaded if it isn't already. If namespace is not * loaded, this function will search for a ".typelib" file using the repository * search path. In addition, a version of namespace may be specified. If version * is not specified, the latest will be used. * * @param [String] namespace The namespace to load * @param [String, nil] version An optional version */ static VALUE rg_require(int argc, VALUE *argv, VALUE self) { VALUE rb_namespace, rb_version, rb_flags; const gchar *namespace_, *version; GIRepositoryLoadFlags flags = 0; GError *error = NULL; rb_scan_args(argc, argv, "12", &rb_namespace, &rb_version, &rb_flags); namespace_ = RVAL2CSTR(rb_namespace); version = RVAL2CSTR_ACCEPT_NIL(rb_version); if (!NIL_P(rb_flags)) { flags = RVAL2GI_REPOSITORY_LOAD_FLAGS(rb_flags); } g_irepository_require(SELF(self), namespace_, version, flags, &error); if (error) { RG_RAISE_ERROR(error); } return Qnil; } /* Return an array of all (transitive) versioned dependencies for namespace. * Returned strings are of the form "namespace-version". * Note: namespace must have already been loaded using a function such as * GObjectIntrospection::Repository.require() before calling this method. * * @param [String] namespace The namespace to get the dependencies for. * * @return [Array] The dependencies. */ static VALUE rg_get_dependencies(VALUE self, VALUE rb_namespace) { GIRepository *repository; const gchar *namespace_; VALUE rb_dependencies; gchar **dependencies; gint i; repository = SELF(self); namespace_ = RVAL2CSTR(rb_namespace); dependencies = g_irepository_get_dependencies(repository, namespace_); if (!dependencies) { return Qnil; } rb_dependencies = rb_ary_new(); for (i = 0; dependencies[i]; i++) { rb_ary_push(rb_dependencies, CSTR2RVAL(dependencies[i])); } g_strfreev(dependencies); return rb_dependencies; } /* Return the list of currently loaded namespaces. * * @return [Array] The loaded namespaces. */ static VALUE rg_loaded_namespaces(VALUE self) { GIRepository *repository; VALUE rb_namespaces; gchar **namespaces; gint i; repository = SELF(self); namespaces = g_irepository_get_loaded_namespaces(repository); rb_namespaces = rb_ary_new(); for (i = 0; namespaces[i]; i++) { rb_ary_push(rb_namespaces, CSTR2RVAL(namespaces[i])); } g_strfreev(namespaces); return rb_namespaces; } /* This method returns the number of metadata entries in given namespace. The * namespace must have already been loaded before calling this function. * * @param [String] namespace The namespace to fetch the entries from. * * @return [Integer] The number of metadata entries. */ static VALUE rg_get_n_infos(VALUE self, VALUE rb_namespace) { const gchar *namespace_; gint n_infos; namespace_ = RVAL2CSTR(rb_namespace); n_infos = g_irepository_get_n_infos(SELF(self), namespace_); return INT2NUM(n_infos); } /* This method returns a particular metadata entry in the given namespace. The * namespace must have already been loaded before calling this function. See * GObjectIntrospection::Repository#get_n_infos() to find the maximum number * of entries. * * @param [String] namespace The namespace to fetch the metadata entry from. * @param [Fixnum] index The index of the entry. * * @return [GObjectIntrospection::BaseInfo] The metadata entry. */ static VALUE rg_get_info(VALUE self, VALUE rb_namespace, VALUE rb_n) { GIRepository *repository; const gchar *namespace_; gint n; GIBaseInfo *info; repository = SELF(self); namespace_ = RVAL2CSTR(rb_namespace); n = NUM2INT(rb_n); info = g_irepository_get_info(repository, namespace_, n); return GI_BASE_INFO2RVAL_WITH_UNREF(info); } /* This method searches for a particular type or name. If only one argument is * given, it is interpreted as a gtype and all loaded namespaces are searched * for it. If two arguments are given the first is a particular namespace and * the second the name of an entry to search for. * * @overload find(type) * * @param [String] type The type to search for. * * @return [GObjectIntrospection::BaseInfo] The metadata entry. * * * @overload find(namespace, type) * * @param [String] namespace The namespace to search in. * * @param [String] type The type to search for. * * @return [GObjectIntrospection::BaseInfo] The metadata entry. */ static VALUE rg_find(int argc, VALUE *argv, VALUE self) { GIBaseInfo *info; if (argc == 1) { VALUE rb_gtype; GType gtype; rb_gtype = argv[0]; gtype = rbgobj_gtype_from_ruby(rb_gtype); info = g_irepository_find_by_gtype(SELF(self), gtype); } else { VALUE rb_namespace, rb_name; const gchar *namespace_, *name; rb_scan_args(argc, argv, "2", &rb_namespace, &rb_name); namespace_ = RVAL2CSTR(rb_namespace); name = RVAL2CSTR(rb_name); info = g_irepository_find_by_name(SELF(self), namespace_, name); } return GI_BASE_INFO2RVAL(info); } static VALUE rg_get_version(VALUE self, VALUE rb_namespace) { const gchar *version; version = g_irepository_get_version(SELF(self), RVAL2CSTR(rb_namespace)); return CSTR2RVAL(version); } void rb_gi_repository_init(VALUE rb_mGI) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_IREPOSITORY, "Repository", rb_mGI); RG_DEF_SMETHOD(default, 0); RG_DEF_SMETHOD(prepend_search_path, 1); RG_DEF_SMETHOD(search_path, 0); RG_DEF_METHOD(require, -1); RG_DEF_METHOD(get_dependencies, 1); RG_DEF_METHOD(loaded_namespaces, 0); RG_DEF_METHOD(get_n_infos, 1); RG_DEF_METHOD(get_info, 2); RG_DEF_METHOD(find, -1); RG_DEF_METHOD(get_version, 1); G_DEF_CLASS(G_TYPE_I_REPOSITORY_LOAD_FLAGS, "RepositoryLoadFlags", rb_mGI); G_DEF_ERROR(G_IREPOSITORY_ERROR, "RepositoryError", rb_mGI, rb_eLoadError, G_TYPE_I_REPOSITORY_ERROR); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-signal-info.c000066400000000000000000000041211511343406000332100ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGISignalInfo #define SELF(self) RVAL2GI_BASE_INFO(self) GType gi_signal_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GISignalInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_flags(VALUE self) { GISignalInfo *info; info = SELF(self); return GI_SIGNAL_FLAGS2RVAL(g_signal_info_get_flags(info)); } static VALUE rg_class_closure(VALUE self) { GISignalInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_signal_info_get_class_closure(info)); } static VALUE rg_true_stops_emit_p(VALUE self) { GISignalInfo *info; info = SELF(self); return CBOOL2RVAL(g_signal_info_true_stops_emit(info)); } void rb_gi_signal_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_SIGNAL_INFO, "SignalInfo", rb_mGI, rb_cGICallableInfo); RG_DEF_METHOD(flags, 0); RG_DEF_METHOD(class_closure, 0); RG_DEF_METHOD_P(true_stops_emit, 0); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-struct-info.c000066400000000000000000000207121511343406000332630ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIStructInfo #define SELF(self) (RVAL2GI_STRUCT_INFO(self)) GType gi_struct_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIStructInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } typedef struct { gpointer instance; gboolean is_owned; } RBGIStructData; static void struct_free(void *data) { RBGIStructData *struct_data = data; if (struct_data->is_owned) { xfree(struct_data->instance); } xfree(struct_data); } static const rb_data_type_t rb_gi_struct_type = { "GObjectIntrospection::Struct", { NULL, struct_free, NULL, }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY, }; VALUE rb_gi_struct_new_raw(VALUE klass, gpointer instance, gboolean is_owned) { RBGIStructData *data; data = RB_ALLOC(RBGIStructData); data->instance = instance; data->is_owned = is_owned; return TypedData_Wrap_Struct(klass, &rb_gi_struct_type, data); } gpointer rb_gi_struct_get_raw(VALUE rb_struct, GType gtype) { gpointer raw_struct; if (gtype == G_TYPE_NONE) { VALUE rb_struct_class; rb_struct_class = rb_class_of(rb_struct); if (rb_respond_to(rb_struct_class, rb_intern("gtype"))) { VALUE rb_gtype; rb_gtype = rb_funcall(rb_struct_class, rb_intern("gtype"), 0); gtype = rbgobj_gtype_from_ruby(rb_gtype); } } if (gtype == G_TYPE_NONE) { RBGIStructData *data; TypedData_Get_Struct(rb_struct, RBGIStructData, &rb_gi_struct_type, data); raw_struct = data->instance; } else if (gtype == G_TYPE_VARIANT) { raw_struct = rbg_variant_from_ruby(rb_struct); } else { raw_struct = RVAL2BOXED(rb_struct, gtype); } return raw_struct; } VALUE rb_gi_struct_info_to_ruby(GIStructInfo *info, gpointer object, gboolean is_pointer) { GIBaseInfo *base_info = (GIBaseInfo *)info; GIRegisteredTypeInfo *registered_type_info = (GIRegisteredTypeInfo *)info; GType gtype; const char *namespace; const char *name; VALUE rb_module; VALUE rb_class; gtype = g_registered_type_info_get_g_type(registered_type_info); if (gtype == G_TYPE_VARIANT) { GVariant *variant = object; return rbg_variant_to_ruby(variant); } else if (gtype != G_TYPE_NONE) { return BOXED2RVAL(object, gtype); } namespace = g_base_info_get_namespace(base_info); name = g_base_info_get_name(base_info); /* Workaround for old cairo-gobject. 1.14.6 on Ubuntu 16.04 * doesn't provide GType for cairo_font_options_t. */ if (strcmp(namespace, "cairo") == 0) { gchar *gtype_name; GType gtype; gtype_name = g_strdup_printf("Cairo%s", name); gtype = g_type_from_name(gtype_name); g_free(gtype_name); return BOXED2RVAL(object, gtype); } rb_module = rb_const_get(rb_cObject, rb_intern(namespace)); rb_class = rb_const_get(rb_module, rb_intern(name)); if (rb_respond_to(rb_class, rb_intern("gtype"))) { VALUE rb_gtype; GType gtype; rb_gtype = rb_funcall(rb_class, rb_intern("gtype"), 0); gtype = rbgobj_gtype_from_ruby(rb_gtype); return BOXED2RVAL(object, gtype); } if (is_pointer) { return rb_gi_struct_new_raw(rb_class, object, FALSE); } else { size_t object_size; gpointer copied_object; object_size = g_struct_info_get_size(info); copied_object = xmalloc(object_size); memcpy(copied_object, object, object_size); return rb_gi_struct_new_raw(rb_class, copied_object, TRUE); } } gpointer rb_gi_struct_info_from_ruby(GIStructInfo *info, VALUE rb_object) { GIRegisteredTypeInfo *registered_type_info = (GIRegisteredTypeInfo *)info; GType gtype; gtype = g_registered_type_info_get_g_type(registered_type_info); return rb_gi_struct_get_raw(rb_object, gtype); } static VALUE rg_n_fields(VALUE self) { GIStructInfo *info; info = SELF(self); return INT2NUM(g_struct_info_get_n_fields(info)); } static VALUE rg_get_field(VALUE self, VALUE rb_n) { GIStructInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_struct_info_get_field(info, n)); } static VALUE rg_find_field(VALUE self, VALUE rb_name) { GIStructInfo *info; const gchar *name; info = SELF(self); name = RVAL2CSTR(rb_name); return GI_BASE_INFO2RVAL_WITH_UNREF(g_struct_info_find_field(info, name)); } static VALUE rg_get_field_value(VALUE self, VALUE rb_struct, VALUE rb_n) { GIStructInfo *info; gpointer raw_struct; gint n; GIFieldInfo *field_info; VALUE rb_value; info = SELF(self); raw_struct = rb_gi_struct_info_from_ruby(info, rb_struct); n = NUM2INT(rb_n); field_info = g_struct_info_get_field(info, n); rb_value = rb_gi_field_info_get_field_raw(field_info, info, raw_struct); g_base_info_unref(field_info); return rb_value; } static VALUE rg_set_field_value(VALUE self, VALUE rb_struct, VALUE rb_n, VALUE rb_value) { GIStructInfo *info; gpointer raw_struct; gint n; GIFieldInfo *field_info; info = SELF(self); raw_struct = rb_gi_struct_info_from_ruby(info, rb_struct); n = NUM2INT(rb_n); field_info = g_struct_info_get_field(info, n); rb_gi_field_info_set_field_raw(field_info, info, raw_struct, rb_value); /* TODO: use rb_ensure() to unref field_info. */ g_base_info_unref(field_info); return Qnil; } static VALUE rg_n_methods(VALUE self) { GIStructInfo *info; info = SELF(self); return INT2NUM(g_struct_info_get_n_methods(info)); } static VALUE rg_get_method(VALUE self, VALUE rb_n_or_name) { GIStructInfo *info; GIFunctionInfo *function_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, RUBY_T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); function_info = g_struct_info_get_method(info, n); } else { const gchar *name; name = RVAL2CSTR(rb_n_or_name); function_info = g_struct_info_find_method(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(function_info); } static VALUE rg_size(VALUE self) { GIStructInfo *info; info = SELF(self); return UINT2NUM(g_struct_info_get_size(info)); } static VALUE rg_alignment(VALUE self) { GIStructInfo *info; info = SELF(self); return UINT2NUM(g_struct_info_get_alignment(info)); } static VALUE rg_gtype_struct_p(VALUE self) { GIStructInfo *info; info = SELF(self); return CBOOL2RVAL(g_struct_info_is_gtype_struct(info)); } static VALUE rg_foreign_p(VALUE self) { GIStructInfo *info; info = SELF(self); return CBOOL2RVAL(g_struct_info_is_foreign(info)); } void rb_gi_struct_info_init(VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_STRUCT_INFO, "StructInfo", rb_mGI, rb_cGIRegisteredTypeInfo); RG_DEF_METHOD(n_fields, 0); RG_DEF_METHOD(get_field, 1); RG_DEF_METHOD(find_field, 1); RG_DEF_METHOD(get_field_value, 2); RG_DEF_METHOD(set_field_value, 3); RG_DEF_METHOD(n_methods, 0); RG_DEF_METHOD(get_method, 1); RG_DEF_METHOD(size, 0); RG_DEF_METHOD(alignment, 0); RG_DEF_METHOD_P(gtype_struct, 0); RG_DEF_METHOD_P(foreign, 0); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-transfer.c000066400000000000000000000023101511343406000326240ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2017-2019 Ruby-GNOME 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 */ #include "rb-gi-private.h" const gchar * rb_gi_transfer_to_string(GITransfer transfer) { switch(transfer) { case GI_TRANSFER_NOTHING: return "nothing"; case GI_TRANSFER_CONTAINER: return "container"; case GI_TRANSFER_EVERYTHING: return "everything"; default: return "unknown"; } } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-type-info.c000066400000000000000000000061001511343406000327130ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2019 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGITypeInfo #define SELF(self) (RVAL2GI_TYPE_INFO(self)) GType gi_type_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GITypeInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_pointer_p(VALUE self) { GITypeInfo *info; info = SELF(self); return CBOOL2RVAL(g_type_info_is_pointer(info)); } static VALUE rg_tag(VALUE self) { GITypeInfo *info; info = SELF(self); return GI_TYPE_TAG2RVAL(g_type_info_get_tag(info)); } static VALUE rg_get_param_type(VALUE self, VALUE rb_n) { GITypeInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_type_info_get_param_type(info, n)); } static VALUE rg_interface(VALUE self) { GITypeInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_type_info_get_interface(info)); } static VALUE rg_array_length(VALUE self) { GITypeInfo *info; info = SELF(self); return INT2NUM(g_type_info_get_array_length(info)); } static VALUE rg_array_fixed_size(VALUE self) { GITypeInfo *info; info = SELF(self); return INT2NUM(g_type_info_get_array_fixed_size(info)); } static VALUE rg_zero_terminated_p(VALUE self) { GITypeInfo *info; info = SELF(self); return CBOOL2RVAL(g_type_info_is_zero_terminated(info)); } static VALUE rg_array_type(VALUE self) { GITypeInfo *info; info = SELF(self); return GI_ARRAY_TYPE2RVAL(g_type_info_get_array_type(info)); } void rb_gi_type_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_TYPE_INFO, "TypeInfo", rb_mGI, rb_cGIBaseInfo); RG_DEF_METHOD_P(pointer, 0); RG_DEF_METHOD(tag, 0); RG_DEF_METHOD(get_param_type, 1); RG_DEF_METHOD(interface, 0); RG_DEF_METHOD(array_length, 0); RG_DEF_METHOD(array_fixed_size, 0); RG_DEF_METHOD_P(zero_terminated, 0); RG_DEF_METHOD(array_type, 0); rb_undef_method(RG_TARGET_NAMESPACE, "name"); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-type-tag.c000066400000000000000000000024231511343406000325370ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGITypeTag #define SELF(self) (RVAL2GI_TYPE_TAG(self)) static VALUE rg_to_s(VALUE self) { GITypeTag tag; tag = SELF(self); return CSTR2RVAL(g_type_tag_to_string(tag)); } void rb_gi_type_tag_init(VALUE rb_mGI) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_I_TYPE_TAG, "TypeTag", rb_mGI); RG_DEF_METHOD(to_s, 0); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-types.h000066400000000000000000000065231511343406000321630ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #ifndef RB_GI_TYPES_H #define RB_GI_TYPES_H #define GI_TYPE_CALLABLE_INFO (gi_callable_info_get_type()) #define GI_TYPE_FUNCTION_INFO (gi_function_info_get_type()) #define GI_TYPE_METHOD_INFO (gi_method_info_get_type()) #define GI_TYPE_CONSTRUCTOR_INFO (gi_constructor_info_get_type()) #define GI_TYPE_CALLBACK_INFO (gi_callback_info_get_type()) #define GI_TYPE_REGISTERED_TYPE_INFO (gi_registered_type_info_get_type()) #define GI_TYPE_STRUCT_INFO (gi_struct_info_get_type()) #define GI_TYPE_BOXED_INFO (gi_boxed_info_get_type()) #define GI_TYPE_ENUM_INFO (gi_enum_info_get_type()) #define GI_TYPE_FLAGS_INFO (gi_flags_info_get_type()) #define GI_TYPE_OBJECT_INFO (gi_object_info_get_type()) #define GI_TYPE_INTERFACE_INFO (gi_interface_info_get_type()) #define GI_TYPE_CONSTANT_INFO (gi_constant_info_get_type()) #define GI_TYPE_UNION_INFO (gi_union_info_get_type()) #define GI_TYPE_VALUE_INFO (gi_value_info_get_type()) #define GI_TYPE_SIGNAL_INFO (gi_signal_info_get_type()) #define GI_TYPE_VFUNC_INFO (gi_vfunc_info_get_type()) #define GI_TYPE_PROPERTY_INFO (gi_property_info_get_type()) #define GI_TYPE_FIELD_INFO (gi_field_info_get_type()) #define GI_TYPE_ARG_INFO (gi_arg_info_get_type()) #define GI_TYPE_TYPE_INFO (gi_type_info_get_type()) #define GI_TYPE_UNRESOLVED_INFO (gi_unresolved_info_get_type()) GType gi_callable_info_get_type (void); GType gi_function_info_get_type (void); GType gi_method_info_get_type (void); GType gi_constructor_info_get_type (void); GType gi_callback_info_get_type (void); GType gi_registered_type_info_get_type (void); GType gi_struct_info_get_type (void); GType gi_boxed_info_get_type (void); GType gi_enum_info_get_type (void); GType gi_flags_info_get_type (void); GType gi_object_info_get_type (void); GType gi_interface_info_get_type (void); GType gi_constant_info_get_type (void); GType gi_union_info_get_type (void); GType gi_value_info_get_type (void); GType gi_signal_info_get_type (void); GType gi_vfunc_info_get_type (void); GType gi_property_info_get_type (void); GType gi_field_info_get_type (void); GType gi_arg_info_get_type (void); GType gi_type_info_get_type (void); GType gi_unresolved_info_get_type (void); #endif ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-union-info.c000066400000000000000000000123161511343406000330700ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIUnionInfo #define SELF(self) (RVAL2GI_UNION_INFO(self)) GType gi_union_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIUnionInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_n_fields(VALUE self) { GIUnionInfo *info; info = SELF(self); return INT2NUM(g_union_info_get_n_fields(info)); } static VALUE rg_get_field(VALUE self, VALUE rb_n) { GIUnionInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_union_info_get_field(info, n)); } static VALUE rg_get_field_value(VALUE self, VALUE rb_union, VALUE rb_n) { GIUnionInfo *info; gint n; GIFieldInfo *field_info; GType gtype; VALUE rb_value; info = SELF(self); n = NUM2INT(rb_n); field_info = g_union_info_get_field(info, n); gtype = g_registered_type_info_get_g_type(info); rb_value = rb_gi_field_info_get_field_raw(field_info, /* TODO: use info */ NULL, RVAL2BOXED(rb_union, gtype)); g_base_info_unref(field_info); return rb_value; } static VALUE rg_set_field_value(VALUE self, VALUE rb_union, VALUE rb_n, VALUE rb_value) { GIUnionInfo *info; gint n; GIFieldInfo *field_info; GType gtype; info = SELF(self); n = NUM2INT(rb_n); field_info = g_union_info_get_field(info, n); gtype = g_registered_type_info_get_g_type(info); rb_gi_field_info_set_field_raw(field_info, /* TODO: use info */ NULL, RVAL2BOXED(rb_union, gtype), rb_value); /* TODO: use rb_ensure() to unref field_info. */ g_base_info_unref(field_info); return Qnil; } static VALUE rg_n_methods(VALUE self) { GIUnionInfo *info; info = SELF(self); return INT2NUM(g_union_info_get_n_methods(info)); } static VALUE rg_get_method(VALUE self, VALUE rb_n_or_name) { GIUnionInfo *info; GIFunctionInfo *function_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); function_info = g_union_info_get_method(info, n); } else { const gchar *name; name = RVAL2CSTR(rb_n_or_name); function_info = g_union_info_find_method(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(function_info); } static VALUE rg_discriminated_p(VALUE self) { GIUnionInfo *info; info = SELF(self); return CBOOL2RVAL(g_union_info_is_discriminated(info)); } static VALUE rg_discriminator_offset(VALUE self) { GIUnionInfo *info; info = SELF(self); return INT2NUM(g_union_info_get_discriminator_offset(info)); } static VALUE rg_discriminator_type(VALUE self) { GIUnionInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_union_info_get_discriminator_type(info)); } static VALUE rg_get_discriminator(VALUE self, VALUE rb_n) { GIUnionInfo *info; gint n; info = SELF(self); n = NUM2INT(rb_n); return GI_BASE_INFO2RVAL_WITH_UNREF(g_union_info_get_discriminator(info, n)); } static VALUE rg_size(VALUE self) { GIUnionInfo *info; info = SELF(self); return ULONG2NUM(g_union_info_get_size(info)); } static VALUE rg_alignment(VALUE self) { GIUnionInfo *info; info = SELF(self); return ULONG2NUM(g_union_info_get_alignment(info)); } void rb_gi_union_info_init(VALUE rb_mGI, VALUE rb_cGIRegisteredTypeInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_UNION_INFO, "UnionInfo", rb_mGI, rb_cGIRegisteredTypeInfo); RG_DEF_METHOD(n_fields, 0); RG_DEF_METHOD(get_field, 1); RG_DEF_METHOD(get_field_value, 2); RG_DEF_METHOD(set_field_value, 3); RG_DEF_METHOD(n_methods, 0); RG_DEF_METHOD(get_method, 1); RG_DEF_METHOD_P(discriminated, 0); RG_DEF_METHOD(discriminator_offset, 0); RG_DEF_METHOD(discriminator_type, 0); RG_DEF_METHOD(get_discriminator, 1); RG_DEF_METHOD(size, 0); RG_DEF_METHOD(alignment, 0); } rb-gi-unresolved-info.c000066400000000000000000000030521511343406000340440ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TUNRESOLVEDET_NAMESPACE rb_cGIUnresolvedInfo GType gi_unresolved_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIUnresolvedInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } void rb_gi_unresolved_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_UNRESOLVED_INFO, "UnresolvedInfo", rb_mGI, rb_cGIBaseInfo); (void)RG_TARGET_NAMESPACE; /* suppress a warning. */ } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-value-info.c000066400000000000000000000032341511343406000330530ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIValueInfo #define SELF(self) (RVAL2GI_VALUE_INFO(self)) GType gi_value_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIValueInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_value(VALUE self) { GIValueInfo *info; info = SELF(self); return LONG2NUM(g_value_info_get_value(info)); } void rb_gi_value_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_VALUE_INFO, "ValueInfo", rb_mGI, rb_cGIBaseInfo); RG_DEF_METHOD(value, 0); } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/rb-gi-vfunc-info.c000066400000000000000000000045601511343406000330630ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2021 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_cGIVFuncInfo #define SELF(self) RVAL2GI_VFUNC_INFO(self) GType gi_vfunc_info_get_type(void) { static GType type = 0; if (type == 0) { type = g_boxed_type_register_static("GIVFuncInfo", (GBoxedCopyFunc)g_base_info_ref, (GBoxedFreeFunc)g_base_info_unref); } return type; } static VALUE rg_flags(VALUE self) { GIVFuncInfo *info; info = SELF(self); return GI_VFUNC_INFO_FLAGS2RVAL(g_vfunc_info_get_flags(info)); } static VALUE rg_offset(VALUE self) { GIVFuncInfo *info; info = SELF(self); return INT2NUM(g_vfunc_info_get_offset(info)); } static VALUE rg_signal(VALUE self) { GIVFuncInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_vfunc_info_get_signal(info)); } static VALUE rg_invoker(VALUE self) { GIVFuncInfo *info; info = SELF(self); return GI_BASE_INFO2RVAL_WITH_UNREF(g_vfunc_info_get_invoker(info)); } void rb_gi_vfunc_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo) { VALUE RG_TARGET_NAMESPACE; RG_TARGET_NAMESPACE = G_DEF_CLASS_WITH_PARENT(GI_TYPE_VFUNC_INFO, "VFuncInfo", rb_mGI, rb_cGICallableInfo); rb_define_const(RG_TARGET_NAMESPACE, "UNKNOWN_OFFSET", INT2NUM(0xFFFF)); RG_DEF_METHOD(flags, 0); RG_DEF_METHOD(offset, 0); RG_DEF_METHOD(signal, 0); RG_DEF_METHOD(invoker, 0); G_DEF_CLASS(G_TYPE_IV_FUNC_INFO_FLAGS, "VFuncInfoFlags", rb_mGI); } rb-gobject-introspection.c000066400000000000000000000042111511343406000346410ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2022 Ruby-GNOME 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 */ #include "rb-gi-private.h" #define RG_TARGET_NAMESPACE rb_mGObjectIntrospection typedef struct { ID name; GICallableInfo *callable_info; ffi_cif cif; ffi_closure *closure; } RBGIVFuncCallbackData; static ID id_send; static gboolean is_debug_mode = FALSE; gboolean rb_gi_is_debug_mode(void) { return is_debug_mode; } void Init_gobject_introspection(void) { #ifdef HAVE_RB_EXT_RACTOR_SAFE rb_ext_ractor_safe(true); #endif id_send = rb_intern("__send__"); { const char *rb_gi_debug_env = getenv("RB_GI_DEBUG"); if (rb_gi_debug_env && strcmp(rb_gi_debug_env, "yes") == 0) { is_debug_mode = TRUE; } } VALUE RG_TARGET_NAMESPACE = rb_define_module("GObjectIntrospection"); rb_define_const(RG_TARGET_NAMESPACE, "BUILD_VERSION", rb_ary_new3(3, INT2FIX(GI_MAJOR_VERSION), INT2FIX(GI_MINOR_VERSION), INT2FIX(GI_MICRO_VERSION))); rb_gi_array_type_init(RG_TARGET_NAMESPACE); rb_gi_type_tag_init(RG_TARGET_NAMESPACE); rb_gi_base_info_init(RG_TARGET_NAMESPACE); rb_gi_repository_init(RG_TARGET_NAMESPACE); rb_gi_loader_init(RG_TARGET_NAMESPACE); rb_gi_callback_init(RG_TARGET_NAMESPACE); } rb-gobject-introspection.h000066400000000000000000000032711511343406000346530ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/ext/gobject-introspection/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2012-2019 Ruby-GNOME 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 */ #ifndef RB_GOBJECT_INTROSPECTION_H #define RB_GOBJECT_INTROSPECTION_H #include #include #include typedef gpointer (*RBGICallbackFinderFunc)(GIArgInfo *info); typedef struct RBGICallbackData_ RBGICallbackData; typedef struct RBGIArgMetadata_ RBGIArgMetadata; void rb_gi_callback_data_free (RBGICallbackData *callback_data); RBGIArgMetadata * rb_gi_callback_data_get_metadata(RBGICallbackData *callback_data); VALUE rb_gi_callback_data_get_rb_callback(RBGICallbackData *callback_data); void rb_gi_callback_register_finder(RBGICallbackFinderFunc finder); VALUE rb_gi_struct_new_raw(VALUE klass, gpointer instance, gboolean is_owned); gpointer rb_gi_struct_get_raw(VALUE rb_struct, GType gtype); #endif ruby-gnome-ruby-gnome-25972cb/gobject-introspection/extconf.rb000077500000000000000000000040471511343406000245320ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2012 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 require "pathname" require "mkmf" require "rbconfig" require "fileutils" module_name = "gobject_introspection" package = "gobject-introspection" base_dir = Pathname(__FILE__).dirname.expand_path ext_dir = base_dir + "ext" + package mkmf_gnome2_dir = base_dir + 'lib' if RbConfig.respond_to?(:ruby) ruby = RbConfig.ruby else ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG["EXEEXT"]) end build_dir = Pathname("ext") + package FileUtils.mkdir_p(build_dir.to_s) unless build_dir.exist? extconf_rb_path = ext_dir + "extconf.rb" unless system(ruby, "-C", build_dir.to_s, extconf_rb_path.to_s, *ARGV) exit(false) end create_makefile(module_name) FileUtils.mv("Makefile", "Makefile.lib") File.open("Makefile", "w") do |makefile| makefile.puts(<<-EOM) all: (cd ext/#{package} && $(MAKE)) $(MAKE) -f Makefile.lib install: (cd ext/#{package} && $(MAKE) install) $(MAKE) -f Makefile.lib install site-install: (cd ext/#{package} && $(MAKE) site-install) $(MAKE) -f Makefile.lib site-install clean: (cd ext/#{package} && $(MAKE) clean) $(MAKE) -f Makefile.lib clean distclean: (cd ext/#{package} && $(MAKE) distclean) $(MAKE) -f Makefile.lib distclean @rm -f Makefile.lib EOM end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/gobject-introspection.gemspec000066400000000000000000000046501511343406000304140ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "gobject-introspection" s.summary = "Ruby/GObjectIntrospection is a " + "Ruby binding of GObject Introspection." s.description = "Ruby/GObjectIntrospection provides bindings of GObject Introspection " + "and a loader module that can generate dynamically Ruby bindings " + "of any GObject C libraries" s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["ext/#{s.name}/extconf.rb"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "extconf.rb", "ext/#{s.name}/depend", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("ext/#{s.name}/*.{c,h,def,rb}") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("glib2", "= #{s.version}") [ ["alpine_linux", "gobject-introspection-dev"], ["alt_linux", "gobject-introspection-devel"], ["arch_linux", "gobject-introspection"], ["conda", "gobject-introspection"], ["debian", "libgirepository1.0-dev"], ["homebrew", "gobject-introspection"], ["macports", "gobject-introspection"], ["msys2", "gobject-introspection"], ["rhel", "pkgconfig(gobject-introspection-1.0)"], ].each do |platform, package| s.requirements << "system: gobject-introspection-1.0: #{platform}: #{package}" end s.metadata["msys2_mingw_dependencies"] = "gobject-introspection" end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/000077500000000000000000000000001511343406000232755ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gi.rb000066400000000000000000000015051511343406000242220ustar00rootroot00000000000000# 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 require "gobject-introspection" GI = GObjectIntrospection ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection.rb000066400000000000000000000042021511343406000301330ustar00rootroot00000000000000# Copyright (C) 2012-2019 Ruby-GNOME 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 require "glib2" module GObjectIntrospection class << self def prepend_typelib_path(path) path = Pathname(path) unless path.is_a?(Pathname) return unless path.exist? dir = path.to_s dir = dir.gsub("/", File::ALT_SEPARATOR) if File::ALT_SEPARATOR return if Repository.search_path.include?(dir) Repository.prepend_search_path(dir) end end end require "gobject_introspection.so" module GObjectIntrospection LOG_DOMAIN = "GObjectIntrospection" class << self def load(namespace, options={}) base_module = Module.new loader = Loader.new(base_module) loader.version = options[:version] loader.load(namespace) base_module end end end GLib::Log.set_log_domain(GObjectIntrospection::LOG_DOMAIN) require "gobject-introspection/arg-info" require "gobject-introspection/boxed-info" require "gobject-introspection/callable-info" require "gobject-introspection/function-info" require "gobject-introspection/interface-info" require "gobject-introspection/object-info" require "gobject-introspection/registered-type-info" require "gobject-introspection/repository" require "gobject-introspection/struct-info" require "gobject-introspection/type-info" require "gobject-introspection/type-tag" require "gobject-introspection/union-info" require "gobject-introspection/version" require "gobject-introspection/loader" ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/000077500000000000000000000000001511343406000276105ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/arg-info.rb000066400000000000000000000032641511343406000316440ustar00rootroot00000000000000# Copyright (C) 2015-2019 Ruby-GNOME 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 GObjectIntrospection class ArgInfo def gclosure? @gclosure_p ||= nil return @gclosure_p unless @gclosure_p.nil? @gclosure_p = compute_gclosure? end def signature sig = "#{name}:" sig << " (optional)" if optional? sig << " (may be null)" if may_be_null? sig << " (caller allocates)" if caller_allocates? sig << " #{type.description}" sig end def inspect super.gsub(/>\z/) do " name=#{name.inspect}" + " optional?=#{optional?.inspect}" + " may_be_null?=#{may_be_null?.inspect}" + " caller_allocates?=#{caller_allocates?.inspect}" + " type=#{type.inspect}>" end end private def compute_gclosure? type_info = type return false if type_info.tag != TypeTag::INTERFACE struct_info = type_info.interface struct_info.gtype.name == "GClosure" end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/boxed-info.rb000066400000000000000000000017741511343406000322000ustar00rootroot00000000000000# Copyright (C) 2013 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 require "gobject-introspection/collection-reader" module GObjectIntrospection class BoxedInfo extend CollectionReader alias_method :__methods__, :methods collection_reader("fields") collection_reader("methods") end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/callable-info.rb000066400000000000000000000071271511343406000326340ustar00rootroot00000000000000# Copyright (C) 2013-2019 Ruby-GNOME 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 require "gobject-introspection/collection-reader" module GObjectIntrospection class CallableInfo extend CollectionReader 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? (@require_callback ||= compute_require_callback) == :required 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 def have_return_value? return true if return_type.tag != TypeTag::VOID return true if return_type.pointer? not n_out_args.zero? end def description signature end def signature argument_signatures = args.collect(&:signature).join(", ") "#{name}(#{argument_signatures}): #{return_type.description}" end def inspect super.gsub(/>\z/) do " signature=<#{signature}>" + " name=#{name.inspect}" + " arguments=#{args.inspect}" + " return_type=#{return_type.inspect}" + " may_return_type_null=#{may_return_null?.inspect}>" end end private def compute_in_args array_length_indexes = [] callback_indexes = [] closure_indexes = [] destroy_indexes = [] args.each_with_index do |arg, i| if arg.type.tag == TypeTag::ARRAY array_length = arg.type.array_length array_length_indexes << array_length if array_length != -1 end unless arg.scope == ScopeType::INVALID callback_indexes << i closure_index = arg.closure closure_indexes << closure_index if closure_index != -1 destroy_index = arg.destroy destroy_indexes << destroy_index if destroy_index != -1 end end args.find_all.with_index do |arg, i| case arg.direction when Direction::IN, Direction::INOUT if array_length_indexes.include?(i) false elsif callback_indexes.include?(i) false elsif closure_indexes.include?(i) false elsif destroy_indexes.include?(i) false else true end else arg.output_buffer? end end end def compute_require_callback args.each do |arg| if arg.direction == Direction::IN and arg.scope != ScopeType::INVALID and !arg.may_be_null? return :required end end :not_required end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/collection-reader.rb000066400000000000000000000026501511343406000335330ustar00rootroot00000000000000# 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 # 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 GObjectIntrospection module CollectionReader def collection_reader(name) n_getter = "n_#{name}" if name.end_with?("ies") singular = name.sub(/ies\z/, "y") else singular = name.sub(/s\z/, "") end getter = "get_#{singular}" cache_name = "@#{name}" define_method(name) do 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 end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/function-info.rb000066400000000000000000000016701511343406000327170ustar00rootroot00000000000000# Copyright (C) 2019-2021 Ruby-GNOME 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 GObjectIntrospection class FunctionInfo def inspect super.gsub(/>\z/) do " lock_gvl_default=#{lock_gvl?.inspect}>" end end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/interface-info.rb000066400000000000000000000022171511343406000330300ustar00rootroot00000000000000# Copyright (C) 2013 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 require "gobject-introspection/collection-reader" module GObjectIntrospection class InterfaceInfo extend CollectionReader alias_method :__methods__, :methods collection_reader("prerequisites") collection_reader("properties") collection_reader("methods") collection_reader("signals") collection_reader("vfuncs") collection_reader("constants") end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/loader.rb000066400000000000000000000632761511343406000314210ustar00rootroot00000000000000# Copyright (C) 2012-2025 Ruby-GNOME 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 require "English" module GObjectIntrospection class Loader class << self def load(namespace, base_module, options={}) loader = new(base_module) loader.version = options[:version] loader.load(namespace) end def initialize_instance_post(object) end end attr_accessor :version def initialize(base_module) @base_module = base_module @version = nil end def load(namespace) repository = Repository.default repository.require(namespace, @version) prepare_class(@base_module) do pre_load(repository, namespace) repository.each(namespace) do |info| load_info(info) if info.is_a?(InterfaceInfo) end repository.each(namespace) do |info| load_info(info) unless info.is_a?(InterfaceInfo) end post_load(repository, namespace) end end private def pre_load(repository, namespace) end def post_load(repository, namespace) end def load_info(info) case info when FunctionInfo load_function_info(info) when StructInfo load_struct_info(info) when BoxedInfo load_boxed_info(info) when FlagsInfo load_flags_info(info) when EnumInfo load_enum_info(info) when ObjectInfo load_object_info(info) when InterfaceInfo load_interface_info(info) when ConstantInfo load_constant_info(info) when UnionInfo load_union_info(info) end end def load_function_info(info) name = rubyish_method_name(info) define_singleton_method(info, @base_module, name) define_equal_style_setter(info, @base_module.singleton_class, name) end def load_function_info_singleton_method(info, klass, method_name) define_singleton_method(info, klass, method_name) define_equal_style_setter(info, klass.singleton_class, method_name) end def define_module_function(function_info, target_module, name) prepare_function_info_lock_gvl(function_info, target_module) full_method_name = "#{target_module}\#.#{name}" invoker = Invoker.new(function_info, name, full_method_name) target_module::INVOKERS[name] = invoker target_module.module_eval(<<-DEFINE_METHOD, __FILE__, __LINE__ + 1) def #{name}(*arguments, &block) INVOKERS["#{name}"].invoke(nil, arguments, block) end module_function(:#{name}) DEFINE_METHOD end def define_singleton_method(info, klass, name) case name when "hash" # Ignore methods that require 1+ arguments and use well-known # name. It may break something. return unless info.n_required_in_args.zero? end prepare_function_info_lock_gvl(info, klass) invoker = Invoker.new(info, name, "#{klass}.#{name}") singleton_class = klass.singleton_class singleton_class::INVOKERS[name] = invoker singleton_class.class_eval(<<-DEFINE_METHOD, __FILE__, __LINE__ + 1) def #{name}(*arguments, &block) INVOKERS["#{name}"].invoke(nil, arguments, block) end DEFINE_METHOD end def define_struct(info, options={}) name = rubyish_class_name(info) if info.gtype == GLib::Type::NONE klass = self.class.define_struct(info.size, name, @base_module, :parent => options[:parent]) else size = info.size size = nil if size.zero? klass = self.class.define_class(info.gtype, name, @base_module, :parent => options[:parent], :size => size) end prepare_class(klass) do load_fields(info, klass) load_methods(info, klass) end end def load_struct_info(info) case info.name when /Class\z/ base_class_name = rubyish_class_name(info) method_infos = info.methods.find_all do |method_info| method_info.is_a?(MethodInfo) end unless method_infos.empty? base_class = @base_module.const_get(base_class_name) singleton_class = base_class.singleton_class invokers = singleton_class.const_get(:INVOKERS).dup singleton_class.__send__(:remove_const, :INVOKERS) singleton_class.const_set(:INVOKERS, invokers) load_methods_method(method_infos, singleton_class) Ractor.make_shareable(singleton_class::INVOKERS) if defined?(Ractor) singleton_class.private_constant(:INVOKERS) end else return if info.gtype_struct? define_struct(info) end end def define_boxed(info) return if info.gtype == GLib::Type::NONE klass = self.class.define_class(info.gtype, info.name, @base_module) _ = klass # TODO: Remove me. It is just for suppressing a warning. # TODO # load_fields(info, klass) # load_methods(info, klass) end def load_boxed_info(info) define_boxed(info) end def load_enum_value(value_info, enum_module) value = value_info.value Ractor.make_shareable(value) if defined?(Ractor) enum_module.const_set(value_info.name.upcase, value) end def define_enum(info) # TODO: Can we do the same things for flags on NONE GType? return if info.gtype == GLib::Type::NONE klass = self.class.define_class(info.gtype, rubyish_class_name(info), @base_module) prepare_class(klass) do load_methods(info, klass) end end def define_error(info) self.class.define_error(info.error_domain, rubyish_class_name(info), @base_module, :parent => error_parent_class(info), :gtype => info.gtype) end def error_parent_class(info) nil end def load_enum_info(info) if info.gtype == GLib::Type::NONE enum_module = Module.new info.values.each do |value_info| load_enum_value(value_info, enum_module) end @base_module.const_set(rubyish_class_name(info), enum_module) else if info.error_domain define_error(info) else define_enum(info) end end end def load_flag_value(value_info, flags_module) flags_module.const_set(value_info.name.upcase, value_info.value) end def load_flags_info(info) if info.gtype == GLib::Type::NONE flags_module = Module.new info.values.each do |value_info| load_flag_value(value_info, flags_module) end @base_module.const_set(rubyish_class_name(info), flags_module) else klass = self.class.define_class(info.gtype, flags_class_name(info), @base_module) prepare_class(klass) do load_methods(info, klass) end end end def flags_class_name(info) info.name end def load_object_info(info) return if info.gtype == GLib::Type::NONE # e.g.: GstBitmask return if info.fundamental? and !info.gtype.instantiatable? klass = self.class.define_class(info.gtype, rubyish_class_name(info), @base_module) prepare_class(klass) do load_virtual_functions(info, klass) load_fields(info, klass) load_methods(info, klass) end end def load_fields(info, klass) info.n_fields.times do |i| field_info = info.get_field(i) load_field(info, i, field_info, klass) end end def field_name(field_info, klass) field_info.name end def load_field(info, i, field_info, klass, options={}) name = field_name(field_info, klass) flags = field_info.flags readable = options[:readable] readable = flags.readable? if readable.nil? if readable reader_method_name = rubyish_field_reader_name(field_info, name) load_field_reader(info, i, field_info, klass, name, reader_method_name) end writable = options[:writable] writable = flags.writable? if writable.nil? if writable load_field_writer(info, i, field_info, klass, name, "#{name}=") end end def load_field_reader(info, i, field_info, klass, name, method_name) remove_existing_method(klass, method_name) need_number_to_bool_convert = false if name.start_with?("is_") and field_info.type.tag == TypeTag::UINT32 need_number_to_bool_convert = true end klass.__send__(:define_method, method_name) do || value = info.get_field_value(self, i) if need_number_to_bool_convert value != 0 else value end end end def load_field_writer(info, i, field_info, klass, name, method_name) klass.__send__(:define_method, method_name) do |value| info.set_field_value(self, i, value) end end def load_methods(info, klass) grouped_methods = info.methods.group_by do |method_info| method_info.class end grouped_methods.each do |method_info_class, method_infos| next if method_infos.empty? case method_infos.first when ConstructorInfo load_methods_constructor(method_infos, klass) when MethodInfo load_methods_method(method_infos, klass) when FunctionInfo load_methods_function(method_infos, klass) else raise "TODO: #{method_info_class}" end end if klass.method_defined?(:each) and klass.instance_method(:each).owner == klass klass.include(Enumerable) end end def load_methods_constructor(infos, klass) return if infos.empty? klass.const_set(:LOADER_CLASS, self.class) invokers = {} klass.const_set(:INITIALIZE_INVOKERS, invokers) infos.each do |info| name = "initialize_#{info.name}" prepare_function_info_lock_gvl(info, klass) invoker = Invoker.new(info, name, "#{klass}\##{name}") invokers[name] = invoker klass.class_eval(<<-DEFINE_METHOD, __FILE__, __LINE__ + 1) def #{name}(*arguments, &block) invoker = INITIALIZE_INVOKERS["#{name}"] invoker.invoke(self, arguments, block) LOADER_CLASS.initialize_instance_post(self) end private :#{name} DEFINE_METHOD end klass.class_eval(<<-DEFINE_METHOD, __FILE__, __LINE__ + 1) def initialize(*arguments, &block) invokers = INITIALIZE_INVOKERS invokers.values.each do |invoker| catch do |tag| invoker.invoke(self, arguments.dup, block, tag) LOADER_CLASS.initialize_instance_post(self) return end end full_method_name = "\#{self.class.name}\#\#{__method__}" message = +"wrong arguments: " message << "\#{full_method_name}(" message << arguments.collect(&:inspect).join(", ") message << "):\\n" message << "available signatures:" invokers.each_value do |invoker| message << "\\n\#{full_method_name}\#{invoker.signature}" end raise ArgumentError, message end DEFINE_METHOD Ractor.make_shareable(klass::INITIALIZE_INVOKERS) if defined?(Ractor) end def load_virtual_functions(info, klass) klass.extend(VirtualFunctionImplementable) gtype_prefix = rubyish_gtype_name(klass.gtype.name) implementor = VirtualFunctionImplementor.new(self.class, gtype_prefix, info.vfuncs) klass.__send__(:initialize_virtual_function_implementable, implementor) end def rubyish_gtype_name(name) name.scan(/[A-Z]+[a-z\d]+/).collect(&:downcase).join("_") end def rubyish_method_name(function_info, options={}) name = function_info.name if options[:prefix] name = name.gsub(/\A#{Regexp.escape(options[:prefix])}/, "") end if name == "initialize" name += "_raw" end n_in_args = function_info.n_in_args if options[:n_in_args_offset] n_in_args += options[:n_in_args_offset] end return_type = function_info.return_type return_type_tag = return_type.tag if return_type_tag == TypeTag::VOID out_arg_tags = function_info.out_args.collect {|arg| arg.type.tag} if out_arg_tags == [TypeTag::ARRAY, TypeTag::INT32] return_type_tag = TypeTag::ARRAY end end case return_type_tag when TypeTag::BOOLEAN case name when "equal" if n_in_args == 1 "==" else name end when "not_equal" if n_in_args == 1 "!=" else name end when "less_than" if n_in_args == 1 "<" else name end when "less_than_or_equal" if n_in_args == 1 "<=" else name end when "greater_than" if n_in_args == 1 ">" else name end when "greater_than_or_equal" if n_in_args == 1 ">=" else name end when /\A(?:is|get_is|can_be)_/ "#{$POSTMATCH}?" when /\Aget_/ if n_in_args.zero? if function_info.n_out_args.zero? "#{$POSTMATCH}?" else $POSTMATCH end else name end when /\A(?:has|use|can|in|on|.*_is)_/ "#{name}?" when "exists" "exist?" else name end when TypeTag::GLIST, TypeTag::GSLIST, TypeTag::ARRAY case name when /\A(?:list|get)_/ if n_in_args.zero? $POSTMATCH else name end else name end else case name when /\Aget_/ if n_in_args.zero? $POSTMATCH else name end when "to_string" if n_in_args.zero? "to_s" else name end when "to_integer" "to_i" when "foreach" "each" else name end end end def rubyish_field_reader_name(field_info, name) case field_info.type.tag when TypeTag::BOOLEAN name.gsub(/\Ais_/, "") + "?" when TypeTag::UINT32 if /\Ais_/ =~ name "#{$POSTMATCH}?" else name end else name 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 prepare_function_info_lock_gvl(function_info, target_module) # For backward compatibility if respond_to?(:should_unlock_gvl?) function_info.lock_gvl_default = !should_unlock_gvl?(function_info, target_module) end end def load_methods_method(infos, klass) infos.each do |info| method_name = rubyish_method_name(info) load_method_info(info, klass, method_name) end end def load_method_info(info, klass, method_name) define_method(info, klass, method_name) define_equal_style_setter(info, klass, method_name) define_inspect(info, klass, method_name) end def remove_existing_method(klass, method_name) return unless klass.method_defined?(method_name) return unless klass.instance_method(method_name).owner == klass klass.__send__(:remove_method, method_name) end def define_method(info, klass, method_name) return if method_name.empty? prepare_function_info_lock_gvl(info, klass) remove_existing_method(klass, method_name) invoker = Invoker.new(info, method_name, "#{klass}\##{method_name}") invokers = klass::INVOKERS invokers[method_name] = invoker klass.class_eval(<<-DEFINE_METHOD, __FILE__, __LINE__ + 1) def #{method_name}(*arguments, &block) invoker = INVOKERS["#{method_name}"] invoker.invoke(self, arguments, block) end DEFINE_METHOD end def define_equal_style_setter(info, klass, method_name) if /\Aset_/ =~ method_name and info.n_in_args == 1 setter_method_name = "#{$POSTMATCH}=" remove_existing_method(klass, setter_method_name) klass.__send__(:alias_method, setter_method_name, method_name) end end def define_inspect(info, klass, method_name) if method_name == "to_s" and info.n_args.zero? klass.class_eval(<<-DEFINE_METHOD, __FILE__, __LINE__ + 1) def inspect super.gsub(/>\\z/) {" \#{to_s}>"} end DEFINE_METHOD end end def load_methods_function(infos, klass) infos.each do |info| name = rubyish_method_name(info) next if name == "new" next if name == "alloc" load_function_info_singleton_method(info, klass, name) end end def load_interface_info(info) return if info.gtype == GLib::Type::NONE interface_module = self.class.define_interface(info.gtype, rubyish_class_name(info), @base_module) prepare_class(interface_module) do load_virtual_functions(info, interface_module) load_methods(info, interface_module) end end def load_constant_info(info) define_constant(info.name, info) end def define_constant(name, info) @base_module.const_set(name, info.value) end def load_union_info(info) return if info.gtype == GLib::Type::NONE klass = self.class.define_class(info.gtype, info.name, @base_module) prepare_class(klass) do load_fields(info, klass) load_methods(info, klass) end end def prepare_class(klass) pre_prepare_class(klass) yield post_prepare_class(klass) end def pre_prepare_class(klass) klass.const_set(:INVOKERS, {}) klass.singleton_class.const_set(:INVOKERS, {}) end def post_prepare_class(klass) return unless defined?(Ractor) Ractor.make_shareable(klass::INVOKERS) Ractor.make_shareable(klass.singleton_class::INVOKERS) klass.private_constant(:INVOKERS) klass.singleton_class.private_constant(:INVOKERS) end def define_methods_module(name) mod = Module.new @base_module.const_set(name, mod) mod.const_set(:INVOKERS, {}) mod end def apply_methods_module(mod, target) target.include(mod) post_methods_module(mod) end def post_methods_module(mod) return unless defined?(Ractor) Ractor.make_shareable(mod::INVOKERS) mod.private_constant(:INVOKERS) end class Invoker def initialize(info, method_name, full_method_name) @info = info @method_name = method_name @full_method_name = full_method_name @prepared = false ensure_prepared if defined?(Ractor) end def invoke(receiver, arguments, block, abort_tag=nil) ensure_prepared if receiver and @function_info_p arguments.unshift(receiver) end arguments, block = build(receiver, arguments, block) if wrong_number_of_arguments?(arguments) if abort_tag throw(abort_tag) else raise ArgumentError, invalid_error_message(arguments) end end unless normalize_arguments!(arguments, abort_tag) return @value_on_invalid end if block.nil? and @require_callback_p receiver.to_enum(@method_name, *arguments) else if @function_info_p return_value = @info.invoke(arguments, &block) else return_value = @info.invoke(receiver, arguments, &block) end if @have_return_value_p return_value else receiver end end end def signature ensure_prepared argument_signatures = @in_args.collect(&:signature) "(" + argument_signatures.join(", ") + ")" end private def ensure_prepared return if @prepared @in_args = @info.in_args @n_in_args = @in_args.size @n_required_in_args = @info.n_required_in_args @last_in_arg = @in_args.last if @last_in_arg @last_in_arg_is_gclosure = @last_in_arg.gclosure? else @last_in_arg_is_gclosure = false end @valid_n_args_range = (@n_required_in_args..@n_in_args) @in_arg_types = [] @in_arg_nils = [] @in_arg_nil_indexes = [] @in_args.each_with_index do |arg, i| @in_arg_types << arg.type may_be_null = arg.may_be_null? @in_arg_nils << may_be_null @in_arg_nil_indexes << i if may_be_null end @function_info_p = (@info.class == FunctionInfo) @have_return_value_p = @info.have_return_value? @require_callback_p = @info.require_callback? prepare_on_invalid @prepared = true end def prepare_on_invalid case @method_name when "==" @value_on_invalid = false @on_invalid = :fallback when "!=" @value_on_invalid = true @on_invalid = :fallback else @on_invalid = :raise end end def build(receiver, arguments, block) if block and @last_in_arg_is_gclosure arguments << block block = nil end n_missing_arguments = @n_in_args - arguments.size n_in_arg_nil_indexes = @in_arg_nil_indexes.size if 0 < n_missing_arguments and n_missing_arguments < n_in_arg_nil_indexes @in_arg_nil_indexes[-n_missing_arguments..-1].each do |nil_index| arguments.insert(nil_index, nil) end end return arguments, block end def wrong_number_of_arguments?(arguments) not @valid_n_args_range.cover?(arguments.size) end def normalize_arguments!(arguments, abort_tag) arguments.size.times do |i| argument = arguments[i] type = @in_arg_types[i] converted_argument = type.try_convert(argument) if converted_argument.nil? next if argument.nil? and @in_arg_nils[i] if abort_tag throw(abort_tag) elsif @on_invalid == :fallback return false else next end end arguments[i] = converted_argument end true end def invalid_error_message(arguments) detail = "#{arguments.size} for " if @n_in_args == @n_required_in_args detail << "#{@n_in_args}" else detail << "#{@n_required_in_args}..#{@n_in_args}" end "#{@full_method_name}: wrong number of arguments (#{detail})" end end class VirtualFunctionImplementor def initialize(loader_class, gtype_prefix, infos) @loader_class = loader_class @gtype_prefix = gtype_prefix @infos = {} prefix = GLib::VIRTUAL_FUNCTION_IMPLEMENTATION_PREFIX infos.each do |info| name = info.name @infos[:"#{prefix}#{name}"] = info @infos[:"#{prefix}#{gtype_prefix}_#{name}"] = info end end def implement(implementor_gtype, name) info = @infos[name] return false if info.nil? container = info.container vtable_gtype = container.gtype if container.respond_to?(:class_struct) struct = container.class_struct else return false unless implementor_gtype.type_is_a?(vtable_gtype) struct = container.iface_struct end field = struct.find_field(info.name) @loader_class.implement_virtual_function(field, implementor_gtype, vtable_gtype, name.to_s) true end end module VirtualFunctionImplementable def initialize_virtual_function_implementable(implementor) @virtual_function_implementor = implementor end def implement_virtual_function(implementor_class, name) unless instance_variable_defined?(:@virtual_function_implementor) return false end @virtual_function_implementor.implement(implementor_class.gtype, name) end end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/object-info.rb000066400000000000000000000022511511343406000323340ustar00rootroot00000000000000# Copyright (C) 2012 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 require "gobject-introspection/collection-reader" module GObjectIntrospection class ObjectInfo extend CollectionReader alias_method :__methods__, :methods collection_reader("interfaces") collection_reader("fields") collection_reader("properties") collection_reader("methods") collection_reader("signals") collection_reader("vfuncs") collection_reader("constants") end end registered-type-info.rb000066400000000000000000000026771511343406000341370ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection# Copyright (C) 2019 Ruby-GNOME 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 GObjectIntrospection class RegisteredTypeInfo def try_convert(value) return nil if value.nil? type = gtype if type == GLib::Type::NONE ns = namespace return value unless Object.const_defined?(ns) mod = Object.const_get(ns) return value unless mod.const_defined?(name) klass = mod.const_get(name) else klass = type.to_class end case value when klass value else if klass.respond_to?(:try_convert) klass.try_convert(value) else nil end end end def description "#{gtype.to_class}(#{gtype.name})" end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/repository.rb000066400000000000000000000023331511343406000323550ustar00rootroot00000000000000# Copyright (C) 2012 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 GObjectIntrospection class Repository class << self alias_method :default_raw, :default def default @@default ||= default_raw end end include Enumerable def each(*namespaces) if namespaces.empty? namespaces = loaded_namespaces end namespaces.each do |namespace| get_n_infos(namespace).times do |i| yield(get_info(namespace, i)) end end end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/struct-info.rb000066400000000000000000000020011511343406000324030ustar00rootroot00000000000000# Copyright (C) 2012-2019 Ruby-GNOME 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 require "gobject-introspection/collection-reader" module GObjectIntrospection class StructInfo extend CollectionReader alias_method :__methods__, :methods collection_reader("fields") collection_reader("methods") end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/type-info.rb000066400000000000000000000020341511343406000320460ustar00rootroot00000000000000# Copyright (C) 2019 Ruby-GNOME 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 GObjectIntrospection class TypeInfo def try_convert(value) tag.try_convert(self, value) end def description tag.description(self) end def inspect super.gsub(/>\z/) do " tag=#{tag.inspect}>" end end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/type-tag.rb000066400000000000000000000114161511343406000316720ustar00rootroot00000000000000# Copyright (C) 2019-2021 Ruby-GNOME 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 GObjectIntrospection class TypeTag def try_convert(type_info, value) method = "try_convert_#{nick}" if respond_to?(method, true) __send__(method, type_info, value) else nil end end def description(type_info) method = "description_#{nick}" if respond_to?(method, true) __send__(method, type_info) else nick end end private def try_convert_boolean(type_info, value) case value when true, false value when nil false else nil end end def try_convert_integer(type_info, value) if value.is_a?(Integer) value elsif value.respond_to?(:to_int) value.to_int else nil end end alias_method :try_convert_int8, :try_convert_integer alias_method :try_convert_uint8, :try_convert_integer alias_method :try_convert_int16, :try_convert_integer alias_method :try_convert_uint16, :try_convert_integer alias_method :try_convert_int32, :try_convert_integer alias_method :try_convert_uint32, :try_convert_integer alias_method :try_convert_int64, :try_convert_integer alias_method :try_convert_uint64, :try_convert_integer def try_convert_float(type_info, value) if value.is_a?(Float) value elsif value.respond_to?(:to_f) # TODO: Should we stop this? value.to_f else nil end end alias_method :try_convert_double, :try_convert_float def try_convert_gtype(type_info, value) GLib::Type.try_convert(value) end def try_convert_utf8(type_info, value) case value when String value.encode(Encoding::UTF_8) when Symbol value.to_s.encode(Encoding::UTF_8) else if value.respond_to?(:to_str) value.to_str.encode(Encoding::UTF_8) else nil end end end def try_convert_filename(type_info, value) case value when String value.encode(GLib::FILENAME_ENCODING) else if value.respond_to?(:to_path) value.to_path.encode(GLib::FILENAME_ENCODING) elsif value.respond_to?(:to_str) value.to_str.encode(GLib::FILENAME_ENCODING) else nil end end end def try_convert_array_like(type_info, value) value = Array.try_convert(value) return nil if value.nil? element_type_info = get_element_type_info(type_info) value.collect do |v| unless v.nil? v = element_type_info.try_convert(v) return nil if v.nil? end v end end def description_array_like(type_info) element_type_info = type_info.get_param_type(0) "#{nick}(#{element_type_info.description})" end def get_element_type_info(type_info) type_info.get_param_type(0) end def try_convert_array(type_info, value) case get_element_type_info(type_info).tag when INT8, UINT8 case value when String return value when GLib::Bytes return value.to_s end end try_convert_array_like(type_info, value) end alias_method :description_array, :description_array_like alias_method :try_convert_glist, :try_convert_array_like alias_method :description_glist, :description_array_like alias_method :try_convert_gslist, :try_convert_array_like alias_method :description_gslist, :description_array_like def try_convert_ghash(type_info, value) case value when Hash value else nil end end def description_ghash(type_info) key_type = type_info.get_param_type(0) value_type = type_info.get_param_type(1) "#{nick}(#{key_type.description}->#{value_type.description})" end def try_convert_interface(type_info, value) type_info.interface.try_convert(value) end def description_interface(type_info) "#{nick}(#{type_info.interface.description})" end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/union-info.rb000066400000000000000000000017741511343406000322270ustar00rootroot00000000000000# Copyright (C) 2013 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 require "gobject-introspection/collection-reader" module GObjectIntrospection class UnionInfo extend CollectionReader alias_method :__methods__, :methods collection_reader("fields") collection_reader("methods") end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/lib/gobject-introspection/version.rb000066400000000000000000000021661511343406000316270ustar00rootroot00000000000000# Copyright (C) 2015 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 GObjectIntrospection module Version MAJOR, MINOR, MICRO = BUILD_VERSION STRING = BUILD_VERSION.join(".") class << self def or_later?(major, minor, micro=nil) micro ||= 0 version = [ MAJOR, MINOR, MICRO, ] (version <=> [major, minor, micro]) >= 0 end end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/spike/000077500000000000000000000000001511343406000236425ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/spike/Makefile000066400000000000000000000004751511343406000253100ustar00rootroot00000000000000LLVM_CONFIG = llvm-config all: run clean: rm -rf libllvm-shared.so rm -rf llvm-call run: llvm-call ./llvm-call libllvm-shared.so: llvm-shared.c cc -fPIC -shared -o $@ $< llvm-call: llvm-call.cc libllvm-shared.so c++ $$($(LLVM_CONFIG) --cxxflags --ldflags --libs) --std=c++14 \ -o $@ $< libllvm-shared.so ruby-gnome-ruby-gnome-25972cb/gobject-introspection/spike/llvm-call.cc000066400000000000000000000036161511343406000260420ustar00rootroot00000000000000// This is based on examples/HowToUseJIT/HowToUseJIT.cpp in LLVM source archive. // This file is distributed under the University of Illinois Open Source // License. See http://releases.llvm.org/6.0.1/LICENSE.TXT for details. #include #include #include #include #include #include #include #include int main(void) { llvm::InitializeNativeTarget(); llvm::InitializeNativeTargetAsmPrinter(); llvm::InitializeNativeTargetAsmParser(); llvm::LLVMContext context; auto owner = std::make_unique("test", context); auto module = owner.get(); auto add = static_cast( module->getOrInsertFunction("add", llvm::Type::getInt32Ty(context), llvm::Type::getInt32Ty(context), llvm::Type::getInt32Ty(context))); add->deleteBody(); auto call_add = static_cast( module->getOrInsertFunction("call_add", llvm::Type::getInt32Ty(context))); auto block = llvm::BasicBlock::Create(context, "EntryBlock", call_add); llvm::IRBuilder<> builder(block); auto one = builder.getInt32(1); auto two = builder.getInt32(2); auto call_instruction = builder.CreateCall(add, {one, two}); builder.CreateRet(call_instruction); auto engine = llvm::EngineBuilder(std::move(owner)).create(); llvm::outs() << "We just constructed this LLVM module:\n\n" << *module; llvm::outs() << "\n\nRunning foo: "; llvm::outs().flush(); std::vector no_args; auto added = engine->runFunction(call_add, no_args); llvm::outs() << "Result: " << added.IntVal << "\n"; delete engine; llvm::llvm_shutdown(); return 0; } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/spike/llvm-shared.c000066400000000000000000000000521511343406000262210ustar00rootroot00000000000000int add(int x, int y) { return x + y; } ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/000077500000000000000000000000001511343406000235065ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/gobject-introspection-test-utils.rb000066400000000000000000000020541511343406000324620ustar00rootroot00000000000000# Copyright (C) 2012-2021 Ruby-GNOME 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 require "gobject-introspection" module GObjectIntrospectionTestUtils def require_version(major, minor, micro) if (GObjectIntrospection::BUILD_VERSION <=> [major, minor, micro]) < 0 omit("require GObjectIntrospection #{major}.#{minor}.#{micro} or later.") end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/run-test.rb000077500000000000000000000024511511343406000256210ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2012-2021 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", ]) do |context| require_relative "gobject-introspection-test-utils" begin repository = GObjectIntrospection::Repository.default repository.require("Gio") rescue GObjectIntrospection::RepositoryError puts("Omit because typelib file doesn't exist: #{$!.message}") exit(true) end module Gio GObjectIntrospection::Loader.load("Gio", self) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-arg-info.rb000066400000000000000000000035661511343406000265240ustar00rootroot00000000000000# Copyright (C) 2012 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 TestArgInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @callable_info = @repository.find("GObject", "signal_name") @info = @callable_info.get_arg(0) end def test_direction assert_equal(GObjectIntrospection::Direction::IN, @info.direction) end def test_caller_allocate? assert_false(@info.caller_allocates?) end def test_return_value? assert_false(@info.return_value?) end def test_optional? assert_false(@info.optional?) end def test_may_be_null? assert_false(@info.may_be_null?) end def test_ownership_transfer assert_equal(GObjectIntrospection::Transfer::NOTHING, @info.ownership_transfer) end def test_scope assert_equal(GObjectIntrospection::ScopeType::INVALID, @info.scope) end def test_closure assert_equal(-1, @info.closure) end def test_destroy assert_equal(-1, @info.destroy) end def test_type assert_kind_of(GObjectIntrospection::TypeInfo, @info.type) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-base-info.rb000066400000000000000000000022771511343406000266630ustar00rootroot00000000000000# Copyright (C) 2012-2021 Ruby-GNOME 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 TestBaseInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @info = @repository.find("GObject", "Object") end def test_name assert_equal("Object", @info.name) end def test_namespace assert_equal("GObject", @info.namespace) end def test_container assert_equal("Object", @info.vfuncs.first.container.name) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-boxed-info.rb000066400000000000000000000015461511343406000270500ustar00rootroot00000000000000# Copyright (C) 2012 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 TestBoxedInfo < Test::Unit::TestCase def setup # TODO: find BoxedInfo end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-callable-info.rb000066400000000000000000000033651511343406000275070ustar00rootroot00000000000000# Copyright (C) 2012-2021 Ruby-GNOME 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 TestCallableInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @info = @repository.find("GObject", "signal_name") end def test_can_throw_gerror assert do not @info.can_throw_gerror? end end def test_return_type assert_kind_of(GObjectIntrospection::TypeInfo, @info.return_type) end def test_caller_owns assert_equal(GObjectIntrospection::Transfer::NOTHING, @info.caller_owns) end def test_may_return_null? if GObjectIntrospection::Version.or_later?(1, 67, 0) assert do @info.may_return_null? end else assert do not @info.may_return_null? end end end def test_n_args assert_equal(1, @info.n_args) end def test_get_arg assert_equal("signal_id", @info.get_arg(0).name) end def test_args assert_equal(["signal_id"], @info.args.collect(&:name)) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-callback-info.rb000066400000000000000000000021301511343406000274710ustar00rootroot00000000000000# Copyright (C) 2012 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 TestCallbackInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @info = @repository.find("Gio", "AsyncReadyCallback") end def test_name assert_equal(GObjectIntrospection::Transfer::NOTHING, @info.caller_owns) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-constant-info.rb000066400000000000000000000022071511343406000275730ustar00rootroot00000000000000# Copyright (C) 2012-2017 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 TestConstantInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @info = @repository.find("GObject", "SIGNAL_FLAGS_MASK") end def test_type assert_equal(GObjectIntrospection::TypeTag::INT32, @info.type.tag) end def test_value assert_equal(511, @info.value) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-enum-info.rb000066400000000000000000000035261511343406000267130ustar00rootroot00000000000000# Copyright (C) 2012-2014 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 TestEnumInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @info = @repository.find("Gio", "ResourceError") end def test_n_values assert_equal(2, @info.n_values) end def test_value assert_kind_of(GObjectIntrospection::ValueInfo, @info.get_value(0)) end def test_values assert_equal([GObjectIntrospection::ValueInfo] * @info.n_values, @info.values.collect(&:class)) end def test_n_methods assert_equal(1, @info.n_methods) end def test_method assert_kind_of(GObjectIntrospection::FunctionInfo, @info.get_method(0)) end def test_methods assert_equal([GObjectIntrospection::FunctionInfo] * @info.n_methods, @info.methods.collect(&:class)) end def test_storage_type assert_equal(GObjectIntrospection::TypeTag::UINT32, @info.storage_type) end def test_error_domain assert_equal("g-resource-error-quark", @info.error_domain) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-field-type.rb000066400000000000000000000025341511343406000270560ustar00rootroot00000000000000# Copyright (C) 2012 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 TestFieldInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @object_info = @repository.find("Gio", "FileOutputStream") @info = @object_info.get_field(0) end def test_flags assert_equal(GObjectIntrospection::FieldInfoFlags::READABLE, @info.flags) end def test_size assert_equal(0, @info.size) end def test_offset assert_equal(0, @info.offset) end def test_type assert_kind_of(GObjectIntrospection::TypeInfo, @info.type) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-flags-info.rb000066400000000000000000000020641511343406000270370ustar00rootroot00000000000000# Copyright (C) 2012 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 TestFlagsInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") end def test_class assert_kind_of(GObjectIntrospection::FlagsInfo, @repository.find("GObject", "SignalFlags")) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-function-info.rb000066400000000000000000000025361511343406000275740ustar00rootroot00000000000000# Copyright (C) 2012 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 TestFunctionInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @info = @repository.find("GObject", "signal_name") end def test_symbol assert_equal("g_signal_name", @info.symbol) end def test_flags assert_equal(GObjectIntrospection::FunctionInfoFlags.new(0), @info.flags) end def test_invoke # TODO: "#invoke" expects Array. We should confirm specification. #assert_equal("notify", @info.invoke(1)) assert_equal("notify", @info.invoke([1])) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-interface-info.rb000066400000000000000000000054231511343406000277050ustar00rootroot00000000000000# Copyright (C) 2012-2014 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 TestInterfaceInfo < Test::Unit::TestCase include GObjectIntrospectionTestUtils def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @info = @repository.find("Gio", "TlsServerConnection") end def test_n_prerequisites assert_equal(1, @info.n_prerequisites) end def test_prerequisite assert_kind_of(GObjectIntrospection::ObjectInfo, @info.get_prerequisite(0)) end def test_n_properties assert_equal(1, @info.n_properties) end def test_propertiy assert_kind_of(GObjectIntrospection::PropertyInfo, @info.get_property(0)) end def test_n_methods assert_equal(1, @info.n_methods) end def test_get_method_n assert_kind_of(GObjectIntrospection::FunctionInfo, @info.get_method(0)) end def test_get_method_name assert_kind_of(GObjectIntrospection::FunctionInfo, @info.get_method("new")) end def test_n_signals info = @repository.find("Gio", "Volume") assert_equal(2, info.n_signals) end def test_get_signal_n info = @repository.find("Gio", "Volume") assert_kind_of(GObjectIntrospection::SignalInfo, info.get_signal(0)) end def test_get_signal_name require_version(1, 36, 0) info = @repository.find("Gio", "Volume") assert_kind_of(GObjectIntrospection::SignalInfo, info.get_signal("changed")) end def test_n_vfuncs info = @repository.find("Gio", "Volume") assert_operator(0, :<, info.n_vfuncs) end def test_get_vfunc_n info = @repository.find("Gio", "Volume") assert_kind_of(GObjectIntrospection::VFuncInfo, info.get_vfunc(0)) end def test_get_vfunc_name info = @repository.find("Gio", "Volume") assert_kind_of(GObjectIntrospection::VFuncInfo, info.get_vfunc("can_eject")) end def test_iface_struct assert_kind_of(GObjectIntrospection::StructInfo, @info.iface_struct) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-loader.rb000066400000000000000000000052241511343406000262610ustar00rootroot00000000000000# Copyright (C) 2012-2022 Ruby-GNOME 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 TestLoaderInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default end def test_define_class info = @repository.find("Gio", "Application") gtype = info.gtype assert_equal(gtype, Gio::Application.gtype) end sub_test_case("virtual function") do def test_without_prefix active_vfs_class = Class.new(Gio::Vfs) do type_register("ActiveVfsWithoutPrefix") def virtual_do_is_active true end end active_vfs = active_vfs_class.new assert do active_vfs.active? end end def test_with_prefix active_vfs_class = Class.new(Gio::Vfs) do type_register("ActiveVfsWithPrefix") def virtual_do_gvfs_is_active true end end active_vfs = active_vfs_class.new assert do active_vfs.active? end end def test_interface resettable_converter_class = Class.new(GLib::Object) do type_register("ResettableConverter") include Gio::Converter attr_reader :was_reset def virtual_do_reset @was_reset = true end end resettable_converter = resettable_converter_class.new resettable_converter.reset assert do resettable_converter.was_reset end end def test_ancestor immutable_menu_class = Class.new(Gio::Menu) do type_register("ImmutableMenu") def virtual_do_is_mutable false end end immutable_menu = immutable_menu_class.new assert do not immutable_menu.mutable? end end end sub_test_case("#==") do def test_invalid assert do not (Gio::File.new_for_path("nonexistent") == "invalid") end end def test_nil assert do not (Gio::File.new_for_path("nonexistent") == nil) end end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-object-info.rb000066400000000000000000000066241511343406000272170ustar00rootroot00000000000000# Copyright (C) 2012-2021 Ruby-GNOME 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 TestObjectInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @info = @repository.find("Gio", "FileOutputStream") end def test_type_name assert_equal("GFileOutputStream", @info.type_name) end def test_type_init assert_equal("g_file_output_stream_get_type", @info.type_init) end def test_abstract? assert_false(@info.abstract?) end def test_fundamental? assert_false(@info.fundamental?) end def test_parent assert_equal("OutputStream", @info.parent.name) end def test_n_interfaces assert_equal(1, @info.n_interfaces) end def test_get_interface assert_kind_of(GObjectIntrospection::InterfaceInfo, @info.get_interface(0)) end def test_n_fields assert_equal(2, @info.n_fields) end def test_get_field assert_kind_of(GObjectIntrospection::FieldInfo, @info.get_field(0)) end def test_n_properties info = @repository.find("Gio", "BufferedOutputStream") assert_equal(2, info.n_properties) end def test_get_property info = @repository.find("Gio", "BufferedOutputStream") assert_kind_of(GObjectIntrospection::PropertyInfo, info.get_property(0)) end def test_n_methods assert_equal(4, @info.n_methods) end def test_get_method_n assert_kind_of(GObjectIntrospection::FunctionInfo, @info.get_method(0)) end def test_get_method_name assert_kind_of(GObjectIntrospection::FunctionInfo, @info.get_method("get_etag")) end def test_n_signals info = @repository.find("Gio", "Application") assert_operator(5, :<=, info.n_signals) end def test_get_signal info = @repository.find("Gio", "Application") assert_kind_of(GObjectIntrospection::SignalInfo, info.get_signal(0)) end def test_n_vfuncs assert_equal(9, @info.n_vfuncs) end def test_get_vfunc_n assert_kind_of(GObjectIntrospection::VFuncInfo, @info.get_vfunc(0)) end def test_get_vfunc_name assert_kind_of(GObjectIntrospection::VFuncInfo, @info.get_vfunc("can_seek")) end def test_n_constants assert_equal(0, @info.n_constants) end def test_class_struct assert_equal("FileOutputStreamClass", @info.class_struct.name) end def test_unref_function assert_nil(@info.unref_function) end def test_ref_function assert_nil(@info.ref_function) end def test_set_value_function assert_nil(@info.set_value_function) end def test_get_value_function assert_nil(@info.get_value_function) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-property-info.rb000066400000000000000000000025131511343406000276260ustar00rootroot00000000000000# Copyright (C) 2012 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 TestPropertyInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @object_info = @repository.find("Gio", "Application") @info = @object_info.get_property(0) end def test_flags assert_equal(GLib::Param::WRITABLE, @info.flags) end def test_type assert_kind_of(GObjectIntrospection::TypeInfo, @info.type) end def test_ownership_transfer assert_equal(GObjectIntrospection::Transfer::NOTHING, @info.ownership_transfer) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-registered-type-info.rb000066400000000000000000000023421511343406000310560ustar00rootroot00000000000000# Copyright (C) 2012 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 TestRegisteredTypeInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @info = @repository.find("GObject", "TypePlugin") end def test_type_name assert_equal("GTypePlugin", @info.type_name) end def test_type_init assert_equal("g_type_plugin_get_type", @info.type_init) end def test_gtype assert_equal(GLib::Type.new("GTypePlugin"), @info.gtype) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-repository.rb000066400000000000000000000045061511343406000272340ustar00rootroot00000000000000# Copyright (C) 2012-2024 Ruby-GNOME 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 TestRepository < Test::Unit::TestCase include GObjectIntrospectionTestUtils def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @repository.require("Gio") end def test_search_path path = GObjectIntrospection::Repository.search_path GObjectIntrospection::Repository.prepend_search_path(__dir__) assert_equal([__dir__] + path, GObjectIntrospection::Repository.search_path) end def test_get_n_infos assert_kind_of(Integer, @repository.get_n_infos("GObject")) end def test_get_info assert_kind_of(GObjectIntrospection::BaseInfo, @repository.get_info("GObject", 0)) end def test_get_dependencies require_version(1, 36, 0) assert_equal(["GLib-2.0"].sort, @repository.get_dependencies("GObject").sort) end def test_loaded_namespaces assert_equal(["GLib", "GObject", "Gio"].sort, # Gio 2.79.0 or later depend on GModule too @repository.loaded_namespaces.sort - ["GModule"]) end def test_enumerable namespaces = @repository.collect do |info| info.namespace end assert_equal(["GLib", "GObject", "Gio"].sort, # Gio 2.79.0 or later depend on GModule too namespaces.uniq.sort - ["GModule"]) end def test_find_by_gtype info = @repository.find(GLib::Object.gtype) assert_equal("Object", info.name) end def test_find_by_name info = @repository.find("GObject", "Object") assert_equal("Object", info.name) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-signal-info.rb000066400000000000000000000025471511343406000272260ustar00rootroot00000000000000# Copyright (C) 2012-2014 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 TestSignalInfo < Test::Unit::TestCase include GObjectIntrospectionTestUtils def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @object_info = @repository.find("Gio", "Application") @info = @object_info.signals.find {|info| info.name == "startup"} end def test_flags require_version(1, 40, 0) assert_equal(GLib::SignalFlags::RUN_FIRST, @info.flags) end def test_class_closure assert_nil(@info.class_closure) end def test_true_stops_emit? assert_false(@info.true_stops_emit?) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-struct-info.rb000066400000000000000000000033201511343406000272630ustar00rootroot00000000000000# Copyright (C) 2012-2021 Ruby-GNOME 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 TestStructInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @info = @repository.find("GObject", "Value") end def test_n_fields assert_equal(2, @info.n_fields) end def test_get_field assert_kind_of(GObjectIntrospection::FieldInfo, @info.get_field(0)) end def test_find_field assert_equal("g_type", @info.find_field("g_type").name) end def test_n_methods assert_operator(@info.n_methods, :>=, 62) end def test_get_method assert_kind_of(GObjectIntrospection::FunctionInfo, @info.get_method(0)) end def test_size assert_operator(@info.size, :>=, 20) end def test_alignment assert_operator(@info.alignment, :>=, 4) end def test_gtype_struct? assert_false(@info.gtype_struct?) end def test_foreign? assert_false(@info.foreign?) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-type-info.rb000066400000000000000000000035641511343406000267320ustar00rootroot00000000000000# Copyright (C) 2012 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 TestTypeInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @function_info = @repository.find("GObject", "signal_list_ids") @info = @function_info.return_type end def test_pointer? assert_true(@info.pointer?) end def test_tag assert_kind_of(GObjectIntrospection::TypeTag, @info.tag) end def test_param_type assert_kind_of(GObjectIntrospection::TypeInfo, @info.get_param_type(0)) end def test_interface function_info = @repository.find("Gio", "app_info_create_from_commandline") info = function_info.return_type assert_kind_of(GObjectIntrospection::InterfaceInfo, info.interface) end def test_array_length assert_equal(1, @info.array_length) end def test_array_fixed_size assert_equal(-1, @info.array_fixed_size) end def test_zero_terminated? assert_false(@info.zero_terminated?) end def test_array_type assert_equal(GObjectIntrospection::ArrayType::C, @info.array_type) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-type-tag.rb000066400000000000000000000021551511343406000265450ustar00rootroot00000000000000# Copyright (C) 2012 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 TestTypeTag < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @function_info = @repository.find("GObject", "signal_list_ids") @type_info = @function_info.return_type @tag = @type_info.tag end def test_to_s assert_equal("array", @tag.to_s) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-union-info.rb000066400000000000000000000030431511343406000270710ustar00rootroot00000000000000# Copyright (C) 2012-2017 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 TestUnionInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GLib") @info = @repository.find("GLib", "Mutex") end def test_n_fields assert_equal(2, @info.n_fields) end def test_get_field assert_kind_of(GObjectIntrospection::FieldInfo, @info.get_field(0)) end def test_n_methods assert_operator(@info.n_methods, :>=, 5) end def test_get_method assert_kind_of(GObjectIntrospection::FunctionInfo, @info.get_method(0)) end def test_size assert_operator(@info.size, :>=, 8) end def test_alignment assert_operator(@info.alignment, :>=, 4) end def test_discriminated assert_false(@info.discriminated?) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-value-info.rb000066400000000000000000000021041511343406000270520ustar00rootroot00000000000000# Copyright (C) 2012 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 TestValueInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("GObject") @flags_info = @repository.find("GObject", "SignalFlags") @info = @flags_info.get_value(0) end def test_value assert_equal(1, @info.value) end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-version.rb000066400000000000000000000041671511343406000265050ustar00rootroot00000000000000# Copyright (C) 2015 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 TestGObjectIntrospectionVersion < Test::Unit::TestCase include GObjectIntrospectionTestUtils test "STRING" do major = GObjectIntrospection::Version::MAJOR minor = GObjectIntrospection::Version::MINOR micro = GObjectIntrospection::Version::MICRO assert_equal([major, minor, micro].join("."), GObjectIntrospection::Version::STRING) end sub_test_case("#or_later?") do test "same" do assert_true(GObjectIntrospection::Version.or_later?(GObjectIntrospection::Version::MAJOR, GObjectIntrospection::Version::MINOR, GObjectIntrospection::Version::MICRO)) end test "later" do assert_true(GObjectIntrospection::Version.or_later?(GObjectIntrospection::Version::MAJOR, GObjectIntrospection::Version::MINOR - 1, GObjectIntrospection::Version::MICRO)) end test "earlier" do assert_false(GObjectIntrospection::Version.or_later?(GObjectIntrospection::Version::MAJOR, GObjectIntrospection::Version::MINOR + 1, GObjectIntrospection::Version::MICRO)) end end end ruby-gnome-ruby-gnome-25972cb/gobject-introspection/test/test-vfunc-info.rb000066400000000000000000000025431511343406000270660ustar00rootroot00000000000000# Copyright (C) 2012 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 TestVFuncInfo < Test::Unit::TestCase def setup @repository = GObjectIntrospection::Repository.default @repository.require("Gio") @object_info = @repository.find("Gio", "FileOutputStream") @info = @object_info.get_vfunc(0) end def test_flags assert_equal(GObjectIntrospection::VFuncInfoFlags.new, @info.flags) end def test_offset assert_equal(GObjectIntrospection::VFuncInfo::UNKNOWN_OFFSET, @info.offset) end def test_signal assert_nil(@info.signal) end def test_invoker assert_nil(@info.invoker) end end ruby-gnome-ruby-gnome-25972cb/goffice/000077500000000000000000000000001511343406000176165ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/goffice/.yardopts000066400000000000000000000016521511343406000214700ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/GOffice lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/goffice/COPYING.LIB000066400000000000000000000636421511343406000212710ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/goffice/README.md000066400000000000000000000010321511343406000210710ustar00rootroot00000000000000# Ruby/GOffice Ruby/GOffice is a Ruby binding of GOffice. ## Requirements * Ruby/GTK3 and Ruby/GSF in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [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 * https://ruby-gnome.github.io/ * https://github.com/ruby-gnome/ruby-gnome ruby-gnome-ruby-gnome-25972cb/goffice/Rakefile000066400000000000000000000020111511343406000212550ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2016-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/goffice/dependency-check/000077500000000000000000000000001511343406000230075ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/goffice/dependency-check/Rakefile000066400000000000000000000033411511343406000244550ustar00rootroot00000000000000# Copyright (C) 2017-2019 Ruby-GNOME 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 require "pkg-config" require "native-package-installer" if File.exist?(File.join(__dir__, "..", "vendor")) task :default => "nothing" else task :default => "dependency:check" end task :nothing do end namespace :dependency do desc "Check dependency" task :check do package_id = "libgoffice-0.10" unless PKGConfig.check_version?(package_id) goffice010_spec = { :debian => "libgoffice-0.10-dev", :redhat => "pkgconfig(#{package_id})", :homebrew => "goffice", } unless NativePackageInstaller.install(goffice010_spec) package_id = "libgoffice-0.8" unless PKGConfig.check_version?(package_id) goffice08_spec = { :debian => "libgoffice-0.8-dev", :redhat => "pkgconfig(#{package_id})", :homebrew => "goffice", } unless NativePackageInstaller.install(goffice08_spec) exit(false) end end end end end end ruby-gnome-ruby-gnome-25972cb/goffice/goffice.gemspec000066400000000000000000000040511511343406000225650ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "goffice" s.summary = "Ruby/GOffice is a Ruby binding of GOffice." s.description = "Ruby/GOffice is a Ruby binding of GOffice." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["dependency-check/Rakefile"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "dependency-check/Rakefile", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("gsf", "= #{s.version}") s.add_runtime_dependency("gtk3", "= #{s.version}") s.add_runtime_dependency("rake") [ ["alpine_linux", "goffice-dev"], ["arch_linux", "goffice"], ["debian", "libgoffice-0.10-dev"], ["debian", "libgoffice-0.8-dev"], ["homebrew", "goffice"], ["rhel", "pkgconfig(libgoffice-0.10)"], ["rhel", "pkgconfig(libgoffice-0.8)"], ].each do |platform, package| s.requirements << "system: libgoffice-0.10|libgoffice-0.8: #{platform}: #{package}" end end ruby-gnome-ruby-gnome-25972cb/goffice/lib/000077500000000000000000000000001511343406000203645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/goffice/lib/goffice.rb000066400000000000000000000026011511343406000223120ustar00rootroot00000000000000# Copyright (C) 2016-2018 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 require "gtk3" require "gsf" require "goffice/loader" module GOffice LOG_DOMAIN = "GOffice" GLib::Log.set_log_domain(LOG_DOMAIN) 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("GOffice") init class << self remove_method(:init) end end end end ruby-gnome-ruby-gnome-25972cb/goffice/lib/goffice/000077500000000000000000000000001511343406000217665ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/goffice/lib/goffice/loader.rb000066400000000000000000000051451511343406000235660ustar00rootroot00000000000000# Copyright (C) 2016-2021 Ruby-GNOME 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(".") version_module = Module.new do const_set("MAJOR", Integer(major)) const_set("MINOR", Integer(minor)) micro = Integer(micro) unless micro.nil? const_set("MICRO", micro) end @base_module.const_set("Version", version_module) 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 load_info(info) case info.name when "_SearchReplace" return when "gViewAllocation" return else super end end def rubyish_method_name(function_info, options={}) name = super case name when /\A\d/ "_#{$POSTMATCH}" else name end end def rubyish_class_name(info) name = super 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 ruby-gnome-ruby-gnome-25972cb/goffice/lib/goffice/version.rb000066400000000000000000000021361511343406000240020ustar00rootroot00000000000000# 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 module Version STRING = [MAJOR, MINOR, MICRO].compact.join(".") class << self def or_later?(major, minor, micro=nil) micro ||= 0 version = [ MAJOR, MINOR, MICRO || 0, ].compact (version <=> [major, minor, micro]) >= 0 end end end end ruby-gnome-ruby-gnome-25972cb/goffice/test/000077500000000000000000000000001511343406000205755ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/goffice/test/goffice-test-utils.rb000066400000000000000000000020001511343406000246270ustar00rootroot00000000000000# Copyright (C) 2016-2021 Ruby-GNOME 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 require "goffice" module GOfficeTestUtils private def only_goffice_version(major, minor, micro=nil) unless GOffice::Version.or_later?(major, minor, micro) omit("Require GOffice >= #{major}.#{minor}.#{micro}") end end end ruby-gnome-ruby-gnome-25972cb/goffice/test/run-test.rb000077500000000000000000000025121511343406000227060ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2016-2021 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "atk", "cairo-gobject", "pango", "gio2", "gdk_pixbuf2", "gdk3", "gtk3", "gsf", "goffice", ]) do |context| require_relative "goffice-test-utils" begin GOffice.init rescue GObjectIntrospection::RepositoryError puts("Omit because typelib file doesn't exist: #{$!.message}") exit(true) end end ruby-gnome-ruby-gnome-25972cb/goffice/test/test-data-scalar-str.rb000066400000000000000000000017431511343406000250660ustar00rootroot00000000000000# 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 DataScalarStrTest < Test::Unit::TestCase include GOfficeTestUtils test ".new" do only_goffice_version(0, 10, 27) data = GOffice::DataScalarStr.new("XXX") assert_equal("XXX", data.str) end end ruby-gnome-ruby-gnome-25972cb/graphene1/000077500000000000000000000000001511343406000200665ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/graphene1/.yardopts000066400000000000000000000016531511343406000217410ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/Graphene lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/graphene1/COPYING.LIB000066400000000000000000000636421511343406000215410ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/graphene1/README.md000066400000000000000000000010631511343406000213450ustar00rootroot00000000000000# Ruby/Graphene1 Ruby/Graphene1 is a Ruby binding of Graphene. https://ebassi.github.io/graphene/ ## Requirements * Ruby/GLib2 and Ruby/GObjectIntrospection in [Ruby-GNOME](https://ruby-gnome.github.io/) * [Graphene](https://ebassi.github.io/graphene/) ## Install ```bash gem install graphene1 ``` ## License Copyright (C) 2025 Ruby-GNOME 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 or later. ## Project Website https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/graphene1/Rakefile000066400000000000000000000020031511343406000215260ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2025 Ruby-GNOME 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/graphene1/graphene1.gemspec000066400000000000000000000037231511343406000233120ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "graphene1" s.summary = "Ruby/Graphene1 is a Ruby binding of Graphene." s.description = "Ruby/Graphene1 is a Ruby binding of Graphene." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", ] s.files += Dir.glob("lib/**/*.rb") s.add_runtime_dependency("gobject-introspection", "= #{s.version}") [ ["alpine_linux", "graphene-dev"], ["alt_linux", "libgraphene-devel"], ["arch_linux", "graphene"], ["conda", "libgraphene"], ["debian", "libgraphene-1.0-dev"], ["homebrew", "graphene"], ["macports", "graphene"], ["msys2", "graphene"], ["rhel", "pkgconfig(graphene-gobject-1.0)"], ].each do |platform, package| s.requirements << "system: graphene-gobject-1.0: #{platform}: #{package}" end s.metadata["msys2_mingw_dependencies"] = "graphene" end ruby-gnome-ruby-gnome-25972cb/graphene1/lib/000077500000000000000000000000001511343406000206345ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1.rb000066400000000000000000000017641511343406000230430ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 require "gobject-introspection" require_relative "graphene1/loader" module Graphene LOG_DOMAIN = "Graphene" GLib::Log.set_log_domain(LOG_DOMAIN) class Error < StandardError end loader = Loader.new(self) loader.load end ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1/000077500000000000000000000000001511343406000225065ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1/loader.rb000066400000000000000000000023771511343406000243120ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Graphene class Loader < GObjectIntrospection::Loader def load self.version = "1.0" super("Graphene") end private def post_load(repository, namespace) require_relative "point" require_relative "rect" require_relative "size" require_relative "vec2" end def rubyish_method_name(function_info, options={}) case function_info.name when "is_2d" "two_dimentional?" else super end end end end ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1/point.rb000066400000000000000000000032571511343406000241730ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Graphene class Point class << self def try_convert(value) case value when Array return nil unless value.size == 2 new(*value) else nil end end end alias_method :initialize_raw, :initialize def initialize(*args) super() case args.size when 0 when 1 arg = args[0] case arg when Point init_from_point(arg) when Vec2 init_from_vec2(arg) else message = +"source must be Graphene::Point or Graphene::Vec2: " message << "#{arg.inspect}" raise ArgumentError, message end when 2 init(*args) else message = +"wrong number of arguments " message << "(given #{args.size}, expected 0..2)" raise ArgumentError, message end end def to_a [x, y] end end end ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1/rect.rb000066400000000000000000000026511511343406000237740ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Graphene class Rect class << self def try_convert(value) case value when Array return nil unless value.size == 4 new(*value) else nil end end end alias_method :initialize_raw, :initialize def initialize(*args) super() case args.size when 0 when 1 init_from_rect(args[0]) when 4 init(*args) else message = +"wrong number of arguments " message << "(given #{args.size}, expected 0, 1 or 4)" raise ArgumentError, message end end def to_a [x, y, width, height] end end end ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1/size.rb000066400000000000000000000030751511343406000240120ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Graphene class Size class << self def try_convert(value) case value when Array return nil unless value.size == 2 new(*value) else nil end end end alias_method :initialize_raw, :initialize def initialize(*args) super() case args.size when 0 when 1 arg = args[0] case arg when Size init_from_size(arg) else raise ArgumentError, "source must be Graphene::Size: #{arg.inspect}" end when 2 init(*args) else message = +"wrong number of arguments " message << "(given #{args.size}, expected 0..2)" raise ArgumentError, message end end def to_a [width, height] end end end ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1/vec2.rb000066400000000000000000000026301511343406000236730ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Graphene class Vec2 alias_method :initialize_raw, :initialize def initialize(*args) super() case args.size when 0 when 1 arg = args[0] case arg when Vec2 init_from_vec2(arg) else message = +"source must be Graphene::Vec2: " message << "#{arg.inspect}" raise ArgumentError, message end when 2 init(*args) else message = +"wrong number of arguments " message << "(given #{args.size}, expected 0..2)" raise ArgumentError, message end end def to_a [x, y] end end end ruby-gnome-ruby-gnome-25972cb/graphene1/lib/graphene1/version.rb000066400000000000000000000020021511343406000245120ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Graphene module Version STRING = "#{MAJOR}.#{MINOR}.#{MICRO}" class << self def or_later?(major, minor, micro=nil) micro ||= 0 ([MAJOR, MINOR, MICRO] <=> [major, minor, micro]) >= 0 end end end end ruby-gnome-ruby-gnome-25972cb/graphene1/test/000077500000000000000000000000001511343406000210455ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/graphene1/test/graphene-test-utils.rb000066400000000000000000000023131511343406000252750ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 require "pkg-config" require "test-unit" require "graphene1" module GrapheneTestUtils private def only_graphene_version(major, minor, micro=nil) micro ||= 0 graphene_version_raw = PKGConfig.modversion("graphene-gobject-1.0") graphene_version = graphene_version_raw.split(".").collect(&:to_i) unless (graphene_version <=> [major, minor, micro]) >= 0 omit("Require Graphene >= #{major}.#{minor}.#{micro}") end end end ruby-gnome-ruby-gnome-25972cb/graphene1/test/run.rb000077500000000000000000000022361511343406000222040ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2025 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "graphene1", ]) do begin require "graphene1" rescue GObjectIntrospection::RepositoryError puts("Omit because typelib file doesn't exist: #{$!.message}") exit(true) end require_relative "graphene-test-utils" end ruby-gnome-ruby-gnome-25972cb/graphene1/test/test-point.rb000066400000000000000000000032551511343406000235050ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 TestPoint < Test::Unit::TestCase sub_test_case(".try_convert") do test("[x, y]") do point = Graphene::Point.try_convert([1.0, 2.0]) assert_equal([1.0, 2.0], point.to_a) end test("Array: invalid") do assert_nil(Graphene::Point.try_convert([1.0])) end end sub_test_case("#initialize") do test("nothing") do point = Graphene::Point.new assert_equal([0.0, 0.0], point.to_a) end test("Graphene::Point") do source_point = Graphene::Point.new(1.0, 2.0) point = Graphene::Point.new(source_point) assert_equal([1.0, 2.0], point.to_a) end test("Graphene::Vec2") do source_vector = Graphene::Vec2.new(1.0, 2.0) point = Graphene::Point.new(source_vector) assert_equal([1.0, 2.0], point.to_a) end test("x, y") do point = Graphene::Point.new(1.0, 2.0) assert_equal([1.0, 2.0], point.to_a) end end end ruby-gnome-ruby-gnome-25972cb/graphene1/test/test-rect.rb000066400000000000000000000030731511343406000233070ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 TestRect < Test::Unit::TestCase sub_test_case(".try_convert") do test("[x, y, w, h]") do rect = Graphene::Rect.try_convert([1.0, 2.0, 3.0, 4.0]) assert_equal([1.0, 2.0, 3.0, 4.0], rect.to_a) end test("Array: invalid") do assert_nil(Graphene::Rect.try_convert([1.0])) end end sub_test_case("#initialize") do test("nothing") do rect = Graphene::Rect.new assert_equal([0.0, 0.0, 0.0, 0.0], rect.to_a) end test("rectangle") do source_rect = Graphene::Rect.new(1.0, 2.0, 3.0, 4.0) rect = Graphene::Rect.new(source_rect) assert_equal([1.0, 2.0, 3.0, 4.0], rect.to_a) end test("x, y, width, height") do rect = Graphene::Rect.new(1.0, 2.0, 3.0, 4.0) assert_equal([1.0, 2.0, 3.0, 4.0], rect.to_a) end end end ruby-gnome-ruby-gnome-25972cb/graphene1/test/test-size.rb000066400000000000000000000027671511343406000233350ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 TestSize < Test::Unit::TestCase sub_test_case(".try_convert") do test("[width, height]") do size = Graphene::Size.try_convert([1.0, 2.0]) assert_equal([1.0, 2.0], size.to_a) end test("Array: invalid") do assert_nil(Graphene::Size.try_convert([1.0])) end end sub_test_case("#initialize") do test("nothing") do size = Graphene::Size.new assert_equal([0.0, 0.0], size.to_a) end test("Graphene::Size") do source_size = Graphene::Size.new(1.0, 2.0) size = Graphene::Size.new(source_size) assert_equal([1.0, 2.0], size.to_a) end test("width, height") do size = Graphene::Size.new(1.0, 2.0) assert_equal([1.0, 2.0], size.to_a) end end end ruby-gnome-ruby-gnome-25972cb/graphene1/test/test-vec2.rb000066400000000000000000000023441511343406000232110ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 TestVec2 < Test::Unit::TestCase sub_test_case("#initialize") do test("nothing") do vec2 = Graphene::Vec2.new assert_equal([0.0, 0.0], vec2.to_a) end test("Graphene::Vec2") do source_vec2 = Graphene::Vec2.new(1.0, 2.0) vec2 = Graphene::Vec2.new(source_vec2) assert_equal([1.0, 2.0], vec2.to_a) end test("x, y") do vec2 = Graphene::Vec2.new(1.0, 2.0) assert_equal([1.0, 2.0], vec2.to_a) end end end ruby-gnome-ruby-gnome-25972cb/gsf/000077500000000000000000000000001511343406000167735ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsf/.yardopts000066400000000000000000000016461511343406000206500ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/GSF lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/gsf/COPYING.LIB000066400000000000000000000636421511343406000204460ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/gsf/README.md000066400000000000000000000010201511343406000202430ustar00rootroot00000000000000# Ruby/GSF Ruby/GSF is a Ruby binding of GSF which is needed by GOffice. ## Requirements * Ruby/GIO2 in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [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 * https://ruby-gnome.github.io/ * https://github.com/ruby-gnome/ruby-gnome ruby-gnome-ruby-gnome-25972cb/gsf/Rakefile000066400000000000000000000020111511343406000204320ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2016-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/gsf/dependency-check/000077500000000000000000000000001511343406000221645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsf/dependency-check/Rakefile000066400000000000000000000025721511343406000236370ustar00rootroot00000000000000# Copyright (C) 2017-2019 Ruby-GNOME 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 require "pkg-config" require "native-package-installer" if File.exist?(File.join(__dir__, "..", "vendor")) task :default => "nothing" else task :default => "dependency:check" end task :nothing do end namespace :dependency do desc "Check dependency" task :check do package_id = "libgsf-1" unless PKGConfig.check_version?(package_id) unless NativePackageInstaller.install(:debian => "libgsf-1-dev", :redhat => "pkgconfig(#{package_id})", :homebrew => "libgsf") exit(false) end end end end ruby-gnome-ruby-gnome-25972cb/gsf/gsf.gemspec000066400000000000000000000037201511343406000211210ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "gsf" s.summary = "Ruby/GSF is a Ruby binding of GSF." s.description = "Ruby/GSF is a Ruby binding of GSF." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["dependency-check/Rakefile"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "dependency-check/Rakefile", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("gio2", "= #{s.version}") s.add_runtime_dependency("rake") [ ["alpine_linux", "libgsf-dev"], ["arch_linux", "libgsf"], ["conda", "libgsf"], ["debian", "libgsf-1-dev"], ["homebrew", "libgsf"], ["msys2", "libgsf"], ["rhel", "pkgconfig(libgsf-1)"], ].each do |platform, package| s.requirements << "system: libgsf-1: #{platform}: #{package}" end s.metadata["msys2_mingw_dependencies"] = "libgsf" end ruby-gnome-ruby-gnome-25972cb/gsf/lib/000077500000000000000000000000001511343406000175415ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsf/lib/gsf.rb000066400000000000000000000023701511343406000206470ustar00rootroot00000000000000# Copyright (C) 2016-2018 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 require "gio2" require "gsf/loader" module Gsf LOG_DOMAIN = "Gsf" GLib::Log.set_log_domain(LOG_DOMAIN) 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 Gio.init if Gio.respond_to?(:init) loader = Loader.new(self) loader.load("Gsf") end end end ruby-gnome-ruby-gnome-25972cb/gsf/lib/gsf/000077500000000000000000000000001511343406000203205ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsf/lib/gsf/input.rb000066400000000000000000000016731511343406000220130ustar00rootroot00000000000000# 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 Input alias_method :read_raw, :read def read(size=nil) size ||= remaining bytes = read_raw(size) bytes.pack("C*") end end end ruby-gnome-ruby-gnome-25972cb/gsf/lib/gsf/loader.rb000066400000000000000000000026741511343406000221240ustar00rootroot00000000000000# 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 end end ruby-gnome-ruby-gnome-25972cb/gsf/test/000077500000000000000000000000001511343406000177525ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsf/test/gsf-test-utils.rb000066400000000000000000000015111511343406000231670ustar00rootroot00000000000000# Copyright (C) 2016-2021 Ruby-GNOME 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 require "tempfile" require "gsf" module GsfTestUtils end ruby-gnome-ruby-gnome-25972cb/gsf/test/run-test.rb000077500000000000000000000022521511343406000220640ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2016-2021 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "gio2", "gsf", ]) do |context| require_relative "gsf-test-utils" begin Gsf.init rescue GObjectIntrospection::RepositoryError puts("Omit because typelib file doesn't exist: #{$!.message}") exit(true) end end ruby-gnome-ruby-gnome-25972cb/gsf/test/test-input-stdio.rb000066400000000000000000000017651511343406000235440ustar00rootroot00000000000000# 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 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 ruby-gnome-ruby-gnome-25972cb/gsk4/000077500000000000000000000000001511343406000170645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsk4/.yardopts000066400000000000000000000016471511343406000207420ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/GSK4 lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/gsk4/COPYING.LIB000066400000000000000000000636421511343406000205370ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/gsk4/README.md000066400000000000000000000011701511343406000203420ustar00rootroot00000000000000# Ruby/GSK4 Ruby/GSK4 is a Ruby binding of GSK 4. https://docs.gtk.org/gsk4/ ## Requirements * Ruby/GLib2, Ruby/GObjectIntrospection, Ruby/Pango and Ruby/GdkPixbuf2, Ruby/GDK4 and Ruby/Graphene in [Ruby-GNOME](https://ruby-gnome.github.io/) * [rcairo](https://github.com/rcairo/rcairo) * [GTK](https://www.gtk.org/) 4 or later ## Install ```bash gem install gsk4 ``` ## License Copyright (C) 2025 Ruby-GNOME 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 or later. ## Project Website https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/gsk4/Rakefile000066400000000000000000000020031511343406000205240ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2025 Ruby-GNOME 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/gsk4/gsk4.gemspec000066400000000000000000000030001511343406000212720ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "gsk4" s.summary = "Ruby/GSK4 is a Ruby binding of GSK 4.x." s.description = "Ruby/GSK4 is a Ruby binding of GSK 4.x." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", ] s.files += Dir.glob("lib/**/*.rb") s.add_runtime_dependency("gdk4", "= #{s.version}") s.add_runtime_dependency("graphene1", "= #{s.version}") end ruby-gnome-ruby-gnome-25972cb/gsk4/lib/000077500000000000000000000000001511343406000176325ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsk4/lib/gsk4.rb000066400000000000000000000017371511343406000210370ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 require "gdk4" require "graphene1" require "gsk4/loader" module Gsk LOG_DOMAIN = "Gsk" GLib::Log.set_log_domain(LOG_DOMAIN) class Error < StandardError end loader = Loader.new(self) loader.load end ruby-gnome-ruby-gnome-25972cb/gsk4/lib/gsk4/000077500000000000000000000000001511343406000205025ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsk4/lib/gsk4/loader.rb000066400000000000000000000027521511343406000223030ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Gsk class Loader < GObjectIntrospection::Loader register_constant_rename_map("2D", "TWO_DIMENSIONAL") register_constant_rename_map("2D_AFFINE", "TWO_DIMENSIONAL_AFFINE") register_constant_rename_map("2D_TRANSLATE", "TWO_DIMENSIONAL_TRANSLATE") register_constant_rename_map("3D", "THREE_DIMENSIONAL") def load self.version = "4.0" super("Gsk") end private def post_load(repository, namespace) require_relative "rounded-rect" end def field_name(field_info, klass) case klass.name when "Gsk::RoundedRect" if field_info.name == "corner" "corners" else super end else super end end end end ruby-gnome-ruby-gnome-25972cb/gsk4/lib/gsk4/rounded-rect.rb000066400000000000000000000042361511343406000234270ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Gsk class RoundedRect class << self def try_convert(value) case value when Array n_values = value.size return nil if n_values < 2 bounds = Graphene::Rect.try_convert(value[0]) return nil if bounds.nil? case n_values when 2 radius = value[1] new(bounds, radius) when 5 corners = [] (1..4).each do |i| corner = Graphene::Size.try_convert(value[i]) return nil if corner.nil? corners << corner end new(bounds, *corners) else nil end else nil end end end alias_method :initialize_raw, :initialize def initialize(*args) super() case args.size when 0 when 1 init_copy(args[0]) when 2 init_from_rect(args[0], args[1]) when 5 init(*args) else message = +"wrong number of arguments " message << "(given #{args.size}, expected 0, 1, 2 or 5)" raise ArgumentError, message end end def ==(other) other.is_a?(self.class) and bounds == other.bounds and corners == other.corners end def inspect super.sub(/>\z/) do " bounds=#{bounds.inspect} corners=#{corners.inspect}>" end end end end ruby-gnome-ruby-gnome-25972cb/gsk4/lib/gsk4/version.rb000066400000000000000000000017751511343406000225260ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Gsk module Version STRING = "#{MAJOR}.#{MINOR}.#{MICRO}" class << self def or_later?(major, minor, micro=nil) micro ||= 0 ([MAJOR, MINOR, MICRO] <=> [major, minor, micro]) >= 0 end end end end ruby-gnome-ruby-gnome-25972cb/gsk4/test/000077500000000000000000000000001511343406000200435ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gsk4/test/gsk-test-utils.rb000066400000000000000000000022221511343406000232650ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 require "pkg-config" require "test-unit" require "gsk4" module GskTestUtils private def only_version(major, minor, micro=nil) micro ||= 0 gsk_version_raw = PKGConfig.modversion("gsk-4.0") gsk_version = gsk_version_raw.split(".").collect(&:to_i) unless (gsk_version <=> [major, minor, micro]) >= 0 omit("Require GSK >= #{major}.#{minor}.#{micro}") end end end ruby-gnome-ruby-gnome-25972cb/gsk4/test/run.rb000077500000000000000000000024041511343406000211770ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2025 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "cairo-gobject", "gdk_pixbuf2", "pango", "gdk4", "graphene1", "gsk4", ]) do begin require "gsk4" rescue GObjectIntrospection::RepositoryError puts("Omit because typelib file doesn't exist: #{$!.message}") exit(true) end require_relative "gsk-test-utils" end ruby-gnome-ruby-gnome-25972cb/gsk4/test/test-render-node.rb000066400000000000000000000030521511343406000235470ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 require "stringio" class TestRenderNode < Test::Unit::TestCase def setup width = 1 height = 1 rgba = Gdk::RGBA.new(1.0, 0.0, 0.0, 1.0) bounds = Graphene::Rect.new(0, 0, width, height) @node = Gsk::ColorNode.new(rgba, bounds) @surface = Cairo::ImageSurface.new(:ARGB32, width, height) @context = Cairo::Context.new(@surface) end def test_draw @node.draw(@context) argbs = @surface.data.unpack("L*").collect do |argb| # [alpha (8 bits), red (8 bits), green (8 bits), blue (8 bits)] lower_8_bits_mask = (1 << 8) - 1 [ argb >> 24, (argb >> 16) & lower_8_bits_mask, (argb >> 8) & lower_8_bits_mask, argb & lower_8_bits_mask, ] end assert_equal([[255, 255, 0, 0]], argbs) end end ruby-gnome-ruby-gnome-25972cb/gsk4/test/test-rounded-rect.rb000066400000000000000000000074621511343406000237510ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 TestRoundedRect < Test::Unit::TestCase sub_test_case(".try_convert") do test("[[x, y, w, h], radius]") do rect = Gsk::RoundedRect.try_convert([[1.0, 2.0, 11.0, 12.0], 3.0]) assert_equal([ [1.0, 2.0, 11.0, 12.0], [ [3.0, 3.0], [3.0, 3.0], [3.0, 3.0], [3.0, 3.0], ], ], [rect.bounds.to_a, rect.corners.collect(&:to_a)]) end test("[[x, y, w, h], top_left, top_right, bottom_right, bottom_left]") do rect = Gsk::RoundedRect.try_convert([[1.0, 2.0, 11.0, 12.0], [1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0]]) assert_equal([ [1.0, 2.0, 11.0, 12.0], [ [1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0], ], ], [rect.bounds.to_a, rect.corners.collect(&:to_a)]) end test("Array: invalid") do assert_nil(Gsk::RoundedRect.try_convert([1.0])) end end sub_test_case("#initialize") do test("nothing") do rect = Gsk::RoundedRect.new assert_equal([ [0.0, 0.0, 0.0, 0.0], [ [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], ], ], [rect.bounds.to_a, rect.corners.collect(&:to_a)]) end test("RoundedRect") do source_rect = Gsk::RoundedRect.new([1.0, 2.0, 11.0, 12.0], 3.0) rect = Gsk::RoundedRect.new(source_rect) assert_equal(source_rect, rect) end test("Rect, radius") do rect = Gsk::RoundedRect.new([1.0, 2.0, 11.0, 12.0], 3.0) assert_equal([ [1.0, 2.0, 11.0, 12.0], [ [3.0, 3.0], [3.0, 3.0], [3.0, 3.0], [3.0, 3.0], ], ], [rect.bounds.to_a, rect.corners.collect(&:to_a)]) end test("bounds, top_left, top_right, bottom_right, bottom_left") do rect = Gsk::RoundedRect.new([1.0, 2.0, 11.0, 12.0], [1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0]) assert_equal([ [1.0, 2.0, 11.0, 12.0], [ [1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0], ], ], [rect.bounds.to_a, rect.corners.collect(&:to_a)]) end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/000077500000000000000000000000001511343406000202055ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gstreamer/.yardopts000066400000000000000000000016541511343406000220610ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/GStreamer lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/gstreamer/COPYING.LIB000066400000000000000000000636421511343406000216600ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/gstreamer/README.md000066400000000000000000000014211511343406000214620ustar00rootroot00000000000000# Ruby/GStreamer Ruby/GStreamer is a Ruby binding for GStreamer. ## Requirements * Ruby/GLib2 and Ruby/GObjectIntrospection in [Ruby-GNOME2](https://ruby-gnome.github.io/) * [GStreamer](http://gstreamer.freedesktop.org/) ## Install gem install gstreamer ## License Copyright (c) 2002-2013 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. ### Exceptions Ruby scripts and image files in sample/ are ported and copied from GStreamer. Headers in samples/*.rb describes that the location of the original file of the Ruby script and image files. The original files are licensed under the LGPL v2.1 or later. ## Project Website https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/gstreamer/Rakefile000066400000000000000000000020111511343406000216440ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2011-2018 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 $LOAD_PATH.unshift("./../glib2/lib") require "gnome/rake/package-task" package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/000077500000000000000000000000001511343406000210055ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/gstreamer/000077500000000000000000000000001511343406000227765ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/gstreamer/depend000066400000000000000000000002511511343406000241560ustar00rootroot00000000000000install: install-pc install-pc: if test -n "$(pkgconfigdir)"; then \ $(MAKEDIRS) $(pkgconfigdir); \ $(INSTALL_DATA) ruby-gstreamer.pc $(pkgconfigdir); \ fi ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/gstreamer/extconf.rb000077500000000000000000000054561511343406000250060ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2003-2023 Ruby-GNOME 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 require 'pathname' base_dir = Pathname(__FILE__).dirname.parent.parent.expand_path top_dir = base_dir.parent top_build_dir = Pathname(".").parent.parent.parent.expand_path mkmf_gnome2_dir = top_dir + "glib2" + "lib" $LOAD_PATH.unshift(mkmf_gnome2_dir.to_s) if mkmf_gnome2_dir.exist? module_name = "gstreamer" package_id = "gstreamer-1.0" require "mkmf-gnome" ["glib2", "gobject-introspection"].each do |package| add_depend_package(package, "#{package}/ext/#{package}", top_dir.to_s, top_build_dir: top_build_dir.to_s) end unless required_pkg_config_package(package_id, :alt_linux => "gstreamer1.0-devel", :conda => "gstreamer", :debian => "libgstreamer1.0-dev", :redhat => "pkgconfig(#{package_id})", :arch_linux => "gstreamer", :homebrew => "gstreamer", :macports => "gstreamer", :msys2 => "gstreamer") exit(false) end unless PKGConfig.have_package("gobject-introspection-1.0") exit(false) end create_pkg_config_file("Ruby/GStreamer", package_id) $defs << "-DRUBY_GST_COMPILATION" case RUBY_PLATFORM when /darwin/ symbols_in_external_bundles = [ "_rbg_define_method", "_rbg_inspect", "_rbg_mGLib", "_rbg_rval2cstr_accept_symbol", "_rbg_to_array", "_rbgobj_gvalue_to_rvalue", "_rbgobj_instance_from_ruby_object", "_rbgobj_lookup_class", "_rbgobj_register_g2r_func", "_rbgobj_register_r2g_func", "_rbgobj_rvalue_to_gvalue", ] symbols_in_external_bundles.each do |symbol| $DLDFLAGS << " -Wl,-U,#{symbol}" end end create_makefile(module_name) pkg_config_dir = with_config("pkg-config-dir") if pkg_config_dir.is_a?(String) File.open("Makefile", "ab") do |makefile| makefile.puts makefile.puts("pkgconfigdir=#{pkg_config_dir}") end end ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/gstreamer/rbgst-child-proxy.c000066400000000000000000000060611511343406000265260ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2014 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 */ #include "rbgst.h" #define RG_TARGET_NAMESPACE cChildProxy #define SELF(object) (GST_CHILD_PROXY(RVAL2GOBJ(object))) static void rg_raise_no_property_error(VALUE object, const gchar *name) { VALUE eNoSuchProperty; eNoSuchProperty = rb_const_get(rbg_mGLib(), rb_intern("NoSuchProperty")); rb_raise(eNoSuchProperty, "%s: No such property: <%s>", rbg_inspect(object), name); } static VALUE rg_get_property(VALUE self, VALUE rb_name) { GstChildProxy *proxy; const gchar *name; GValue value = G_VALUE_INIT; VALUE rb_value; GObjectClass *g_object_class; GParamSpec *property_spec; proxy = SELF(self); name = RVAL2CSTR_ACCEPT_SYMBOL(rb_name); g_object_class = G_OBJECT_GET_CLASS(proxy); property_spec = g_object_class_find_property(g_object_class, name); if (!property_spec) { rg_raise_no_property_error(self, name); } g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE(property_spec)); gst_child_proxy_get_property(proxy, name, &value); rb_value = GVAL2RVAL(&value); g_value_unset(&value); return rb_value; } static VALUE rg_set_property(VALUE self, VALUE rb_name, VALUE rb_value) { GstChildProxy *proxy; const gchar *name; GValue value = G_VALUE_INIT; GObjectClass *g_object_class; GParamSpec *property_spec; proxy = SELF(self); name = RVAL2CSTR_ACCEPT_SYMBOL(rb_name); g_object_class = G_OBJECT_GET_CLASS(proxy); property_spec = g_object_class_find_property(g_object_class, name); if (!property_spec) { rg_raise_no_property_error(self, name); } g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE(property_spec)); rbgobj_rvalue_to_gvalue(rb_value, &value); gst_child_proxy_set_property(proxy, name, &value); g_value_unset(&value); return self; } void rb_gst_init_child_proxy(void) { VALUE mGst; VALUE RG_TARGET_NAMESPACE; mGst = rb_const_get(rb_cObject, rb_intern("Gst")); RG_TARGET_NAMESPACE = rb_const_get(mGst, rb_intern("ChildProxy")); rb_remove_method(RG_TARGET_NAMESPACE, "get_property"); RG_DEF_METHOD(get_property, 1); rb_remove_method(RG_TARGET_NAMESPACE, "set_property"); RG_DEF_METHOD(set_property, 2); } ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/gstreamer/rbgst-element.c000066400000000000000000000022631511343406000257150ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2023 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 */ #include "rbgst.h" static void rb_gst_element_mark(gpointer object) { GstBus *bus = gst_element_get_bus(GST_ELEMENT(object)); if (bus) { rbgobj_gc_mark_instance(bus); gst_object_unref(bus); } } void rb_gst_init_element(void) { rbgobj_register_mark_func(GST_TYPE_ELEMENT, rb_gst_element_mark); } ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/gstreamer/rbgst.c000066400000000000000000000041071511343406000242650ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2013-2023 Ruby-GNOME 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 */ #include "rbgst.h" static void rg_gst_value_list_r2g(VALUE from, GValue *to) { int i, n; if (NIL_P(from)) { return; } from = rbg_to_array(from); n = RARRAY_LEN(from); for (i = 0; i < n; i++) { VALUE rb_element; const RGObjClassInfo *class_info; GValue element = G_VALUE_INIT; rb_element = rb_ary_entry(from, i); class_info = RVAL2CINFO(rb_element); g_value_init(&element, class_info->gtype); rbgobj_rvalue_to_gvalue(rb_element, &element); gst_value_list_append_value(to, &element); } } static VALUE rg_gst_value_list_g2r(const GValue *from) { guint i, n; VALUE rb_values; n = gst_value_list_get_size(from); rb_values = rb_ary_new(); for (i = 0; i < n; i++) { const GValue *value; VALUE rb_value; value = gst_value_list_get_value(from, i); rb_value = rbgobj_gvalue_to_rvalue(value); rb_ary_push(rb_values, rb_value); } return rb_values; } void Init_gstreamer (void) { rbgobj_register_r2g_func(GST_TYPE_LIST, rg_gst_value_list_r2g); rbgobj_register_g2r_func(GST_TYPE_LIST, rg_gst_value_list_g2r); rb_gst_init_child_proxy(); rb_gst_init_element(); } ruby-gnome-ruby-gnome-25972cb/gstreamer/ext/gstreamer/rbgst.h000066400000000000000000000021021511343406000242630ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2013-2023 Ruby-GNOME 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 */ #include #include extern void Init_gstreamer (void); G_GNUC_INTERNAL extern void rb_gst_init_child_proxy (void); G_GNUC_INTERNAL extern void rb_gst_init_element (void); ruby-gnome-ruby-gnome-25972cb/gstreamer/extconf.rb000066400000000000000000000022301511343406000221750ustar00rootroot00000000000000#!/usr/bin/env ruby require 'pathname' require 'mkmf' require 'rbconfig' require 'fileutils' package = "gstreamer" base_dir = Pathname(__FILE__).dirname.expand_path ext_dir = base_dir + "ext" + package mkmf_gnome2_dir = base_dir + 'lib' ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG["EXEEXT"]) build_dir = Pathname("ext") + package FileUtils.mkdir_p(build_dir.to_s) unless build_dir.exist? extconf_rb_path = ext_dir + "extconf.rb" system(ruby, "-C", build_dir.to_s, extconf_rb_path.to_s, *ARGV) || exit(false) create_makefile(package) FileUtils.mv("Makefile", "Makefile.lib") File.open("Makefile", "w") do |makefile| makefile.puts(<<-EOM) all: (cd ext/#{package} && $(MAKE)) $(MAKE) -f Makefile.lib install: (cd ext/#{package} && $(MAKE) install) $(MAKE) -f Makefile.lib install site-install: (cd ext/#{package} && $(MAKE) site-install) $(MAKE) -f Makefile.lib site-install clean: (cd ext/#{package} && $(MAKE) clean) $(MAKE) -f Makefile.lib clean distclean: (cd ext/#{package} && $(MAKE) distclean) $(MAKE) -f Makefile.lib distclean @rm -f Makefile.lib EOM end ruby-gnome-ruby-gnome-25972cb/gstreamer/gstreamer.gemspec000066400000000000000000000042601511343406000235450ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2025 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "gstreamer" s.summary = "Ruby/GStreamer is a Ruby binding for GStreamer." s.description = "Ruby/GStreamer is a Ruby binding for GStreamer." s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["ext/#{s.name}/extconf.rb"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "extconf.rb", "ext/#{s.name}/depend", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("ext/#{s.name}/*.{c,h,def,rb}") s.files += Dir.glob("sample/**/*") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("gobject-introspection", "= #{s.version}") [ ["alpine_linux", "gstreamer-dev"], ["alt_linux", "gstreamer1.0-devel"], ["arch_linux", "gstreamer"], ["conda", "gstreamer"], ["debian", "libgstreamer1.0-dev"], ["homebrew", "gstreamer"], ["macports", "gstreamer"], ["msys2", "gstreamer"], ["rhel", "pkgconfig(gstreamer-1.0)"], ].each do |platform, package| s.requirements << "system: gstreamer-1.0: #{platform}: #{package}" end s.metadata["msys2_mingw_dependencies"] = "gstreamer" end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/000077500000000000000000000000001511343406000207535ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst.rb000066400000000000000000000037311511343406000221010ustar00rootroot00000000000000# Copyright (C) 2013-2021 Ruby-GNOME 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 require "English" require "gobject-introspection" require "gst/loader" require "gst/base-loader" require "gst/controller-loader" require "gst/audio-loader" module Gst LOG_DOMAIN = "GStreamer" GLib::Log.set_log_domain(LOG_DOMAIN) class << self def const_missing(name) init if const_defined?(name) const_get(name) else super end end def method_missing(name, *args, &block) init if respond_to?(name) __send__(name, *args, &block) else super end end def init(*argv) class << self remove_method(:init) remove_method(:const_missing) remove_method(:method_missing) end loader = Loader.new(self, argv) loader.load init_base init_controller init_audio end private def init_base loader = GstBase::Loader.new(GstBase) loader.load Gst.include(GstBase) end def init_controller loader = GstController::Loader.new(GstController) loader.load Gst.include(GstController) end def init_audio loader = GstAudio::Loader.new(GstAudio) loader.load Gst.include(GstAudio) end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/000077500000000000000000000000001511343406000215505ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/audio-loader.rb000066400000000000000000000015761511343406000244530ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 GstAudio class Loader < GObjectIntrospection::Loader def load super("GstAudio") end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/base-loader.rb000066400000000000000000000016011511343406000242510ustar00rootroot00000000000000# Copyright (C) 2013-2021 Ruby-GNOME 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 GstBase class Loader < GObjectIntrospection::Loader def load super("GstBase") end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/bin.rb000066400000000000000000000036061511343406000226520ustar00rootroot00000000000000# Copyright (C) 2013 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 Gst class Bin include Enumerable alias_method :add_element, :add def add_elements(*elements) elements.each do |element| add_element(element) end end alias_method :add, :add_elements def <<(element) add_element(element) self end def each(options={}) return to_enum(:each, options) unless block_given? if options[:recurse] iterator = iterate_recurse elsif options[:sink] iterator = iterate_sinks elsif options[:sorted] iterator = iterate_sorted elsif options[:sources] iterator = iterate_sources elsif options[:interface] iterator = iterate_all_by_interface(options[:interface]) else iterator = iterate_elements end loop do result, element = iterator.next case result when IteratorResult::DONE break when IteratorResult::OK yield(element.value) when IteratorResult::RESYNC iterator.resync when IteratorResult::ERROR raise "failed to iterate" end end end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/bus.rb000066400000000000000000000041431511343406000226700ustar00rootroot00000000000000# Copyright (C) 2013-2019 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 Gst class Bus alias_method :add_watch_full, :add_watch def add_watch(priority=GLib::PRIORITY_DEFAULT, &block) add_watch_full(priority, &block) end def sync_handler(&block) @sync_handler = lambda do |bus, message| begin block.call(bus, message) rescue Exception $stderr.puts("An exception is raised in " + "#{self.class}\##{__method__} callback: #{block}") $stderr.puts("#{$!.class}: #{$!.message}") $stderr.puts($@) BusSyncReply::DROP end end set_sync_handler(&@sync_handler) end private :set_sync_handler alias_method :poll_raw, :poll def poll(*args) events = nil timeout = nil n_args = args.size case n_args when 0 when 1 case args[0] when Hash options = args[0] events = options[:events] timeout = options[:timeout] when Integer timeout = args[0] else events = args[0] end when 2 events, timeout = args else message = "wrong number of arguments " message << "(given #{n_args}, expected 0..2)" raise ArgumentError, message end poll_raw(events || :any, timeout || CLOCK_TIME_NONE) end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/caps.rb000066400000000000000000000031471511343406000230300ustar00rootroot00000000000000# Copyright (C) 2013-2025 Ruby-GNOME 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 Gst class Caps class << self def any new(:any) end def empty new(:empty) end end alias_method :initialize_raw, :initialize def initialize(*args) if args.size == 1 case args[0] when :any initialize_new_any return when :empty initialize_new_empty return end end initialize_raw(*args) end def structures size.times.collect do |i| get_structure(i) end end def set_int_value(name, value) self[name, :int] = value end def []=(name, type=nil, value) if type value_type = GLib::Type.const_get(type.to_s.upcase) set_value(name, GLib::Value.new(value_type, value)) else set_value(name, value) end end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/controller-loader.rb000066400000000000000000000016151511343406000255270ustar00rootroot00000000000000# Copyright (C) 2013-2021 Ruby-GNOME 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 GstController class Loader < GObjectIntrospection::Loader def load super("GstController") end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/element-factory.rb000066400000000000000000000020271511343406000251740ustar00rootroot00000000000000# Copyright (C) 2013 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 Gst class ElementFactory def long_name get_metadata("long-name") end def klass get_metadata("klass") end def description get_metadata("description") end def author get_metadata("author") end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/element.rb000066400000000000000000000027051511343406000235320ustar00rootroot00000000000000# Copyright (C) 2013-2018 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 Gst class Element class << self def [](name) ElementFactory.make(name) end end def stop set_state(State::NULL) end def ready set_state(State::READY) end def pause set_state(State::PAUSED) end def play set_state(State::PLAYING) end alias_method :link_element, :link def link_elements(*elements) elements.each do |element| link_element(element) end end alias_method :link, :link_elements def >>(element) link_element(element) element end alias_method :flags_raw, :flags def flags ElementFlags.new(flags_raw) end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/loader.rb000066400000000000000000000074511511343406000233520ustar00rootroot00000000000000# Copyright (C) 2013-2023 Ruby-GNOME 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 Gst class Loader < GObjectIntrospection::Loader def initialize(base_module, init_arguments) super(base_module) @init_arguments = init_arguments end def load super("Gst") end private def pre_load(repository, namespace) call_init_function(repository, namespace) define_value_modules end def call_init_function(repository, namespace) init_check = repository.find(namespace, "init_check") arguments = [ [$0] + @init_arguments, ] succeeded, argv, error = init_check.invoke(arguments) @init_arguments.replace(argv[1..-1]) raise error unless succeeded end def define_value_modules @value_functions_module = define_methods_module(:ValueFunctions) @value_methods_module = define_methods_module(:ValueMethods) end def post_load(repository, namespace) post_methods_module(@value_functions_module) post_methods_module(@value_methods_module) require_extension require_libraries self.class.start_callback_dispatch_thread end def require_extension require "gstreamer.so" end def require_libraries require "gst/bin" require "gst/bus" require "gst/caps" require "gst/element" require "gst/element-factory" require "gst/plugin-feature" require "gst/registry" require "gst/structure" require "gst/tag-list" require "gst/type-find-factory" require "gst/version" end def load_function_info(info) case info.name when "init" # ignore when /\Avalue_/ method_name = $POSTMATCH load_value_function_info(info, method_name) else super end end def load_value_function_info(info, method_name) value_functions_module = @value_functions_module define_module_function(info, value_functions_module, method_name) @value_methods_module.module_eval do define_method(method_name) do |*arguments, &block| value_functions_module.send(method_name, self, *arguments, &block) end end end def load_method_info(info, klass, method_name) case method_name when "ref", "unref" # Ignore else super end end RENAME_MAP = { "uri_protocol_is_valid" => "valid_uri_protocol?", "uri_protocol_is_supported" => "supported_uri_protocol?", "uri_is_valid" => "valid_uri?", "uri_has_protocol" => "uri_has_protocol?", } def rubyish_method_name(function_info) RENAME_MAP[function_info.name] || super end UNLOCK_GVL_METHODS = { "Gst::Element#set_state" => true, "Gst::Element#get_state" => true, "Gst::Element#query_state" => true, "Gst::Element#send_event" => true, } def prepare_function_info_lock_gvl(function_info, klass) super key = "#{klass}\##{function_info.name}" return unless UNLOCK_GVL_METHODS.key?(key) function_info.lock_gvl_default = false end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/plugin-feature.rb000066400000000000000000000016051511343406000250260ustar00rootroot00000000000000# Copyright (C) 2013 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 Gst class PluginFeature alias_method :rank_raw, :rank def rank Rank.new(rank_raw) end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/registry.rb000066400000000000000000000021001511343406000237360ustar00rootroot00000000000000# Copyright (C) 2013 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 Gst class Registry alias_method :plugins, :plugin_list def get_features(name_or_type) if name_or_type.is_a?(GLib::Type) type = name_or_type get_feature_list(type) else name = name_or_type get_feature_list_by_plugin(name) end end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/structure.rb000066400000000000000000000020661511343406000241410ustar00rootroot00000000000000# Copyright (C) 2013-2025 Ruby-GNOME 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 Gst class Structure def fields n_fields.times.collect do |i| field_name = nth_field_name(i) value = get_value(field_name) value.extend(ValueMethods) [field_name, value] end end def [](name) get_value(name) end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/tag-list.rb000066400000000000000000000021151511343406000236200ustar00rootroot00000000000000# Copyright (C) 2019 Ruby-GNOME 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 Gst class TagList include Enumerable alias_method :each_raw, :each def each each_raw do |_tag_list, tag| n_values = get_tag_size(tag) values = n_values.times.collect do |i| get_value_index(tag, i).value end yield(tag, values) end end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/type-find-factory.rb000066400000000000000000000016331511343406000254440ustar00rootroot00000000000000# Copyright (C) 2015 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 Gst class TypeFindFactory alias_method :extensions_raw, :extensions def extensions extensions_raw || [] end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gst/version.rb000066400000000000000000000022511511343406000235620ustar00rootroot00000000000000# Copyright (C) 2015 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 Gst module Version MAJOR, MINOR, MICRO, NANO = Gst.version STRING = "#{MAJOR}.#{MINOR}.#{MICRO}.#{NANO}" class << self def or_later?(major, minor, micro=nil, nano=nil) micro ||= 0 nano ||= 0 version = [ MAJOR, MINOR, MICRO, NANO, ] (version <=> [major, minor, micro, nano]) >= 0 end end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/lib/gstreamer.rb000066400000000000000000000014301511343406000232670ustar00rootroot00000000000000# Copyright (C) 2014 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 require "gst" ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/000077500000000000000000000000001511343406000214665ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/audio-example.rb000077500000000000000000000044641511343406000245600ustar00rootroot00000000000000#!/usr/bin/env ruby # -*- coding: utf-8 -*- # # audio-example.rb # # Builds a pipeline with [ audiotestsource ! autoaudiosink ] and sweeps # frequency and volume. # # Needs gst-plugin-base + gst-plugins-good installed. # # This sample code is a port of # gstreamer/tests/examples/controller/audio-example.c. It is licensed # under the terms of the GNU Library General Public License, version # 2 or (at your option) later. # # Copyright (C) 2013 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 require "gst" bin = Gst::Pipeline.new("pipeline") clock = bin.pipeline_clock src = Gst::ElementFactory.make("audiotestsrc", nil) raise "need audiotestsrc from gst-plugins-base" if src.nil? sink = Gst::ElementFactory.make("autoaudiosink", nil) raise "need autoaudiosink from gst-plugins-good" if sink.nil? bin << src << sink src >> sink # setup control sources cs1 = Gst::InterpolationControlSource.new cs2 = Gst::InterpolationControlSource.new src.add_control_binding(Gst::DirectControlBinding.new(src, "volume", cs1)) src.add_control_binding(Gst::DirectControlBinding.new(src, "freq", cs2)) # set interpolation mode cs1.mode = Gst::InterpolationMode::LINEAR cs2.mode = Gst::InterpolationMode::LINEAR # set control values cs1.set(0 * Gst::SECOND, 0.0) cs1.set(5 * Gst::SECOND, 1.0) cs2.set(0 * Gst::SECOND, 220.0 / 20000.0) cs2.set(3 * Gst::SECOND, 3520.0 / 20000.0) cs2.set(6 * Gst::SECOND, 440.0 / 20000.0) # run for 7 seconds clock_id = clock.new_single_shot_id(clock.time + (7 * Gst::SECOND)) bin.play wait_ret, jitter = Gst::Clock.id_wait(clock_id) warn "Clock::id_wait returned: #{wait_ret}" if wait_ret != Gst::ClockReturn::OK bin.stop ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/audio-extract.rb000077500000000000000000000042331511343406000245710ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2024 Ruby-GNOME 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 require "gst" pipeline = Gst::Pipeline.new("audio-extractor") src = Gst::ElementFactory.make("autoaudiosrc", nil) raise "need audiotestsrc from gst-plugins-good" if src.nil? resample = Gst::ElementFactory.make("audioresample", nil) raise "need audioresample from gst-plugins-base" if resample.nil? sink = Gst::ElementFactory.make("appsink", nil) raise "need appsink from gst-plugins-base" if sink.nil? # See https://gstreamer.freedesktop.org/documentation/additional/design/mediatype-audio-raw.html caps = Gst::Caps.new("audio/x-raw") caps["format"] = "F32LE" caps["rate", :int] = 16 * 1000 caps["channels", :int] = 1 sink.caps = caps sink.emit_signals = true sink.signal_connect(:new_sample) do |_| sample = sink.pull_sample buffer = sample.buffer success, map = buffer.map(:read) p map.data buffer.unmap(map) Gst::FlowReturn::OK end pipeline << src << resample << sink src >> resample >> sink loop = GLib::MainLoop.new bus = pipeline.bus bus.add_watch do |bus, message| case message.type when Gst::MessageType::EOS puts "End-of-stream" loop.quit when Gst::MessageType::ERROR error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" loop.quit end true end pipeline.play begin loop.run rescue Interrupt puts "Interrupt" rescue => error puts "Error: #{error.message}" ensure pipeline.stop end ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/framestep1.rb000077500000000000000000000102511511343406000240640ustar00rootroot00000000000000#!/usr/bin/env ruby # -*- coding: utf-8 -*- # # This sample code is a port of # gstreamer/tests/examples/stepping/framestep1.c. It is licensed # under the terms of the GNU Library General Public License, version # 2 or (at your option) later. # # Copyright (C) 2013 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 require "gst" def event_loop(pipe) running = true bus = pipe.bus while running message = bus.timed_pop_filtered(Gst::CLOCK_TIME_NONE, Gst::MessageType::ANY) raise "message nil" if message.nil? case message.type when Gst::MessageType::EOS puts "got EOS" running = false when Gst::MessageType::WARNING warning, debug = message.parse_warning puts "Debugging info: #{debug || 'none'}" puts "Warning: #{warning.message}" when Gst::MessageType::ERROR error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" running = false when Gst::MessageType::STEP_DONE format, amount, rate, flush, intermediate, duration, eos = message.parse_step_done if format == Gst::Format::DEFAULT puts "step done: #{gst_time(duration)} skipped in #{gst_time(amount)} frames" else puts "step done: #{gst_time(duration)} skipped" end running = false end end end def gst_time(time) Time.at(time / 1000000000.0).utc.strftime("%H:%M:%S.%N") end # create a new bin to hold the elements bin = Gst::Pipeline.new("pipeline") raise "'pipeline' gstreamer plugin missing" if bin.nil? # create a fake source videotestsrc = Gst::ElementFactory.make("videotestsrc", "videotestsrc") raise "'videotestsrc' gstreamer plugin missing" if videotestsrc.nil? videotestsrc.num_buffers = 10 # and a fake sink appsink = Gst::ElementFactory.make("appsink", "appsink") raise "'appsink' gstreamer plugin missing" if appsink.nil? appsink.emit_signals = true appsink.sync = true appsink.signal_connect("new-preroll") do |appsink| # signalled when a new preroll buffer is available sample = appsink.pull_preroll puts "have new-preroll sample #{sample}, timestamp #{gst_time(sample.buffer.pts)}" Gst::FlowReturn::OK end # add objects to the main pipeline bin << videotestsrc << appsink # link the elements videotestsrc >> appsink # go to the PAUSED state and wait for preroll puts "prerolling first frame" bin.pause bin.get_state(Gst::CLOCK_TIME_NONE) # step two frames, flush so that new preroll is queued puts "stepping three frames" unless bin.send_event(Gst::Event.new(Gst::Format::BUFFERS, 2, 1.0, true, false)) raise "Failed to send STEP event!" end # blocks and returns when we received the step done message event_loop(bin) # wait for step to really complete bin.get_state(Gst::CLOCK_TIME_NONE) result, pos = bin.query_position(Gst::Format::TIME) puts "stepped two frames, now at #{gst_time(pos)}" # step 3 frames, flush so that new preroll is queued puts "stepping 120 milliseconds" unless bin.send_event(Gst::Event.new(Gst::Format::TIME, 120 * Gst::MSECOND, 1.0, true, false)) raise "Failed to send STEP event!" end # blocks and returns when we received the step done message event_loop(bin) # wait for step to really complete bin.get_state(Gst::CLOCK_TIME_NONE) result, pos = bin.query_position(Gst::Format::TIME) puts "stepped 120ms frames, now at #{gst_time(pos)}" puts "playing until EOS" bin.play # Run event loop listening for bus messages until EOS or ERROR event_loop(bin) puts "finished" # stop the bin bin.stop ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/gst-inspect.rb000077500000000000000000000301161511343406000242570ustar00rootroot00000000000000#!/usr/bin/env ruby # # This sample code is a port of gstreamer/tools/gst-inspect.c. It is # licensed under the terms of the GNU Library General Public License, # version 2 or (at your option) later. # # The followin is the original code's copyright notation: # Copyright (C) 1999,2000 Erik Walthinsen # 2000 Wim Taymans # 2004 Thomas Vander Stichele # # # Copyright (C) 2013 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 require "optparse" require "ostruct" require "gst" def parse(argv) options = OpenStruct.new options.print_all = false options.print_auto_install_info = false opts = OptionParser.new do |opts| opts.banner += " [ELEMENT-NAME|PLUGIN-NAME]" opts.version = Gst.version opts.separator("") opts.on("-a", "--print-all", "Print all elements") do options.print_all = true end opts.on("--print-plugin-auto-install-info", "Print a machine-parsable list of features", "the specified plugin provides.", "Useful in connection with external", "automatic plugin installation mechanisms") do options.print_auto_install_info = true end end opts.parse!(argv) [options, argv.first] end class Inspector def initialize @prefix = "" end def print_list(print_all) plugins = {} n_features = 0 each_feature do |plugin, feature| plugins[plugin.name] = nil n_features += 1 if print_all if feature.is_a?(Gst::ElementFactory) print_element_factory(feature, true) end else print_feature(plugin, feature) end end puts puts("Total count: #{plugins.size} plugins, #{n_features} features") end def print_element(name) factory = Gst::ElementFactory.find(name) if factory print_element_factory(factory, false) else registry = Gst::Registry.get type_find_factory = registry.find_feature(name, Gst::TypeFindFactory) if type_find_factory # TODO else plugin = registry.find_plugin(name) print_plugin_info(plugin) # TODO: print_plugin_features(plugin) end end end private def puts(*args) if args.empty? super(@prefix) else super(*(args.collect {|arg| "#{@prefix}#{arg}"})) end end def prefix(new_prefix) prefix, @prefix = @prefix, new_prefix yield ensure @prefix = prefix end def each_feature registry = Gst::Registry.get registry.plugins.sort_by {|plugin| plugin.name}.each do |plugin| features = registry.get_features(plugin.name) features.sort_by {|feature| feature.name}.each do |feature| yield(plugin, feature) end end end def print_factory_details_info(factory) puts("Factory Details:", " Rank:\t\t#{factory.rank.nick} (#{factory.rank.to_i})", " Long name:\t#{factory.long_name}", " Class:\t#{factory.klass}", " Description:\t#{factory.description}", " Author(s):\t#{factory.author}", "") end def print_plugin_info(plugin) return if plugin.nil? puts("Plugin Details:", " Name:\t\t\t#{plugin.name}", " Description:\t\t#{plugin.description}", " Filename:\t\t#{plugin.filename || '(null)'}", " Version:\t\t#{plugin.version}", " License:\t\t#{plugin.license}", " Source module:\t#{plugin.source}") release_date = plugin.release_date_string if release_date puts(" Source release date:\t#{release_date}") end puts(" Binary package:\t#{plugin.package}", " Origin URL:\t\t#{plugin.origin}", "") end def print_hierarchy(element) ancestors = [] type = element.gtype while type ancestors << type type = type.parent end ancestors.reverse.each_with_index do |klass, i| if i.zero? mark = "" else mark = " " + (" " * (i - 1)) + "+----" end puts("#{mark}#{klass.name}") end puts end def print_interfaces(element) interfaces = element.gtype.interfaces return if interfaces.empty? puts("Implemented Interfaces:") interfaces.each do |interface| puts(" #{interface.name}") end puts end def print_caps(caps) if caps.any? puts("ANY") return end if caps.empty? puts("EMPTY") return end caps.structures.each do |structure| puts(structure.name) structure.fields.each do |name, value| puts(" %15s: %s" % [name, value.serialize]) end end end def print_pad_template_info(template) prefix("#{@prefix} ") do puts("#{template.direction.nick.upcase} template: '#{template.name_template}'") prefix("#{@prefix} ") do if template.presence == Gst::PadPresence::REQUEST puts("Availability: On request") else puts("Availability: #{template.presence.nick.capitalize}") end end end caps = template.caps return if caps.nil? prefix("#{@prefix} ") do puts("Capabilities:") prefix("#{@prefix} ") do print_caps(caps) end end puts end def print_pad_templates_info(element, factory) puts("Pad Templates:") templates = factory.static_pad_templates if templates.empty? puts(" none") return end templates.each do |template| print_pad_template_info(template) end end def print_element_flag_info(element) puts("Element Flags:") puts(" no flags set") puts return unless element.is_a?(Gst::Bin) puts("Bin Flags:") puts(" no flags set") puts end def print_implementation_info(element) puts("Element Implementation:") puts(" not supported") puts end def print_clocking_info(element) if !element.flags.require_clock? and !element.flags.provide_clock? and element.clock.nil? puts("Element has no clocking capabilities.") return end puts("Clocking Interaction:") puts(" element requires a clock") if element.flags.require_clock? if element.flags.provide_clock? clock = element.clock if clock.nil? puts(" element is supported tot provide a clock but returned nil") else puts(" element provides a clock: #{clock.name}") end end puts end def print_index_info(element) if element.flags.indexable? puts("Indexing capabilities:") puts(" element can do indexing") else puts("Element has no indexing capabilities.") end puts end def uri_type(element) case element.uri_type when Gst::URIType::SRC "source" when Gst::URIType::SINK "sink" else "unknown" end end def print_uri_handler_info(element) if element.is_a?(Gst::URIHandler) puts("URI handling capabilities:") puts(" Element can act as #{uri_type(element)}.") protocols = element.protocols if protocols.empty? puts(" No supported URI protocols") else puts(" Supported URI protocols:") protocols.each do |protocol| puts(" #{protocol}") end end else puts("Element has no URI handling capabilities.") end puts end def print_pad_info(element) puts("Pads:") pads = element.pads if pads.empty? puts(" none") return end pads.each do |pad| prefix("#{@prefix} ") do puts("#{pad.direction.nick.upcase}: '#{pad.name}'") prefix("#{@prefix} ") do template = pad.template puts("Pad Template: '#{template.name}'") if template caps = pad.caps break if caps.nil? puts("Capabilities:") prefix("#{@prefix} ") do print_caps(caps) end end end end puts end def print_element_properties_info(element) puts("Element Properties:") properties = element.class.properties if properties.empty? puts(" none") return end properties.each do |name| param = element.class.property(name) puts(" %-20s: %s" % [param.name, param.blurb]) flags = [] flags << "readable" if param.readable? flags << "writable" if param.writable? # flags << "controllable" if param.controllable? prefix("#{@prefix}#{' ' * 23} ") do puts("flags: #{flags.join(', ')}") description = "" type_name = param.value_type.name description << "#{type_name}." if param.readable? case param.gtype when GLib::Type["GParamObject"] # do nothing else default_value = element.get_property(name) description << " Default: #{default_value.inspect}" end else description << " Write only" end puts(description) end end puts end def print_signal_info(element, signal) args = ["object(#{element.class})"] signal.param_types.each_with_index do |name, i| args << "arg#{i}(#{name})" end args = args.join(", ") signature = "{|#{args}| ...} # => #{signal.return_type}" puts(" #{signal.name.inspect}: #{signature}") end def print_signals_info(element) signals = [] actions = [] element.class.signals.each do |name| signal = element.class.signal(name) next if signal.owner >= Gst::Element if signal.action? actions << signal else signals << signal end end [[signals, "Signals"], [actions, "Actions"]].each do |target_signals, description| unless target_signals.empty? puts("Element #{description}:") target_signals.each do |signal| print_signal_info(element, signal) end end end puts end def print_children_info(element) return unless element.is_a?(Gst::Bin) children = element.children return if children.empty? puts("Children:") children.each do |child| puts(" #{child.name}") end end def print_element_factory(factory, print_names) factory = factory.load if factory.nil? puts("element plugin (#{factory.name}) couldn't be loaded\n") return end element = factory.create prefix(print_names ? "#{factory.name}: " : "") do print_factory_details_info(factory) print_plugin_info(factory.plugin) print_hierarchy(element) print_interfaces(element) print_pad_templates_info(element, factory) puts print_element_flag_info(element) print_implementation_info(element) print_clocking_info(element) print_index_info(element) print_uri_handler_info(element) print_pad_info(element) print_element_properties_info(element) print_signals_info(element) print_children_info(element) end end def print_feature(plugin, feature) prefix("#{plugin.name}: #{feature.name}") do case feature when Gst::ElementFactory puts(": #{feature.long_name}") when Gst::TypeFindFactory if feature.extensions.empty? message = "no extensions" else message = feature.extensions.join(", ") end puts(": #{message}") else puts(" (#{feature.gtype})") end end end end options, element_name = parse(ARGV) inspector = Inspector.new if element_name inspector.print_element(element_name) else inspector.print_list(options.print_all) end ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/gtk-video.rb000077500000000000000000000026441511343406000237150ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2019 Ruby-GNOME 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 require "gst" require "gtk3" bin = Gst::Pipeline.new("pipeline") src = Gst::ElementFactory.make("videotestsrc", nil) raise "need audiotestsrc from gst-plugins-base" if src.nil? sink = Gst::ElementFactory.make("gtksink", nil) raise "need autoaudiosink from gst-plugins-good" if sink.nil? bin << src << sink src >> sink app = Gtk::Application.new(nil, :handles_command_line) app.signal_connect(:command_line) do app.activate 0 end app.signal_connect(:activate) do window = Gtk::ApplicationWindow.new(app) window.set_default_size 200, 200 window.add(sink.widget) bin.state = :playing window.show_all end app.run bin.state = :null ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/helloworld.rb000077500000000000000000000037001511343406000241710ustar00rootroot00000000000000#!/usr/bin/env ruby # # This sample code is a port of # gstreamer/tests/examples/helloworld/helloworld.c. It is licensed # under the terms of the GNU Library General Public License, version # 2 or (at your option) later. # # Copyright (C) 2013 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 require "gst" if ARGV.length < 1 puts "usage: #{$0} " exit(false) end playbin = Gst::ElementFactory.make("playbin") if playbin.nil? puts "'playbin' gstreamer plugin missing" exit(false) end # take the commandline argument and ensure that it is a uri if Gst.valid_uri?(ARGV.first) uri = ARGV.first else uri = Gst.filename_to_uri(ARGV.first) end playbin.uri = uri # create and event loop feed gstreamer bus messages to it loop = GLib::MainLoop.new bus = playbin.bus bus.add_watch do |bus, message| case message.type when Gst::MessageType::EOS puts "End-of-stream" loop.quit when Gst::MessageType::ERROR error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" loop.quit end true end # start play back and listed to events playbin.play begin loop.run rescue Interrupt puts "Interrupt" rescue => error puts "Error: #{error.message}" ensure playbin.stop end ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/mp3parselaunch.rb000077500000000000000000000040611511343406000247440ustar00rootroot00000000000000#!/usr/bin/env ruby # -*- coding: utf-8 -*- # # This sample code is a port of # gstreamer/tests/examples/launch/mp3parselaunch.c. It is licensed # under the terms of the GNU Library General Public License, version # 2 or (at your option) later. # # Copyright (C) 2013 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 require "gst" def event_loop(pipe) running = true bus = pipe.bus while running message = bus.poll(Gst::MessageType::ANY, Gst::CLOCK_TIME_NONE) raise "message nil" if message.nil? case message.type when Gst::MessageType::EOS running = false when Gst::MessageType::WARNING warning, debug = message.parse_warning puts "Debugging info: #{debug || 'none'}" puts "Warning: #{warning.message}" when Gst::MessageType::ERROR error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" running = false end end end if ARGV.length < 1 puts "usage: #{$0} " exit(false) end bin, error = Gst.parse_launch("filesrc name=my_filesrc ! avdec_mp3 ! autoaudiosink") if bin.nil? $stderr.puts "Parse error: #{error.message}" exit(false) end filesrc = bin.get_by_name("my_filesrc") filesrc.location = ARGV[0] # start playing bin.play # Run event loop listening for bus messages until EOS or ERROR event_loop(bin) # stop the bin bin.stop ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/queue.rb000077500000000000000000000054451511343406000231520ustar00rootroot00000000000000#!/usr/bin/env ruby # -*- coding: utf-8 -*- # # This sample code is a port of # gstreamer/tests/examples/queue/queue.c. It is licensed under # the terms of the GNU Library General Public License, version # 2 or (at your option) later. # # Copyright (C) 2013 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 require "gst" # This example uses the queue element to create a buffer between 2 elements. # The scheduler automatically uses 2 threads, 1 to feed and another to consume # data from the queue buffer # Event loop to listen to events posted on the Gst::Bus from the pipeline. Exits # on EOS or ERROR events def event_loop(pipe) running = true bus = pipe.bus while running message = bus.poll(Gst::MessageType::ANY, -1) case message.type when Gst::MessageType::EOS running = false when Gst::MessageType::WARNING warning, debug = message.parse_warning puts "Debugging info: #{debug || 'none'}" puts "Warning: #{warning.message}" when Gst::MessageType::ERROR error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" running = false end end end if ARGV.length < 1 puts "usage: #{$0} " exit(false) end # create a new pipeline to hold the elements pipeline = Gst::Pipeline.new("pipeline") raise "'pipeline' gstreamer plugin missing" if pipeline.nil? # create a disk reader filesrc = Gst::ElementFactory.make("filesrc", "disk_source") raise "'filesrc' gstreamer plugin missing" if filesrc.nil? filesrc.location = ARGV.first decode = Gst::ElementFactory.make("mad", "decode") raise "'mad' gstreamer plugin missing" if decode.nil? queue = Gst::ElementFactory.make("queue", "queue") raise "'queue' gstreamer plugin missing" if queue.nil? # and an audio sink audiosink = Gst::ElementFactory.make("alsasink", "play_audio") raise "'alsasink' gstreamer plugin missing" if audiosink.nil? # add objects to the main pipeline pipeline << filesrc << decode << queue << audiosink filesrc >> decode >> queue >> audiosink # start playing pipeline.play # listen for EOS event_loop(pipeline) pipeline.stop ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/stream-status.rb000077500000000000000000000057121511343406000246370ustar00rootroot00000000000000#!/usr/bin/env ruby # -*- coding: utf-8 -*- # # This sample code is a port of # gstreamer/tests/examples/streams/stream-status.c. It is licensed # under the terms of the GNU Library General Public License, version # 2 or (at your option) later. # # Copyright (C) 2013 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 require "gst" def event_loop(bus, pipe) loop do message = bus.poll(Gst::MessageType::ANY, Gst::CLOCK_TIME_NONE) raise "message nil" if message.nil? case message.type when Gst::MessageType::EOS puts "received EOS" return when Gst::MessageType::WARNING warning, debug = message.parse_warning puts "#{message} #{warning.message}" when Gst::MessageType::ERROR error, debug = message.parse_error puts "#{message} #{error.message}" return end end end # create a new bin to hold the elements bin = Gst::Pipeline.new("pipeline") raise "'pipeline' gstreamer plugin missing" if bin.nil? # create a source fakesrc = Gst::ElementFactory.make("fakesrc", "fakesrc") raise "'fakesrc' gstreamer plugin missing" if fakesrc.nil? # and a sink fakesink = Gst::ElementFactory.make("fakesink", "fakesink") raise "'fakesink' gstreamer plugin missing" if fakesink.nil? # add objects to the main pipeline bin << fakesrc << fakesink # link the elements fakesrc >> fakesink # get the bus, we need to install a sync handler bin.bus.sync_handler do |bus, message| case message.type when Gst::MessageType::STREAM_STATUS type, owner = message.parse_stream_status val = message.stream_status_object puts "type: #{type.inspect}" puts "source: #{message.src.path_string}" puts "owner: #{owner.path_string}" puts "object: type #{val.type.name}, value #{val.value}" # see if we know how to deal with this object if val.type == Gst::Task.gtype task = val.value end case type when Gst::StreamStatusType::CREATE puts "created task #{task}" when Gst::StreamStatusType::ENTER # puts "raising task priority" # setpriority(PRIO_PROCESS, 0, -10) when Gst::StreamStatusType::LEAVE end end Gst::BusSyncReply::PASS end # start playing bin.play # run event loop listening for bus messages until EOS or ERROR event_loop(bin.bus, bin) # stop the bin bin.stop ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/text-color-example.rb000077500000000000000000000054311511343406000255520ustar00rootroot00000000000000#!/usr/bin/env ruby # -*- coding: utf-8 -*- # # text-color-example.rb # # Builds a pipeline with [videotestsrc ! textoverlay ! ximagesink] and # modulates color, text and text pos. # # Needs gst-plugin-base installed. # # This sample code is a port of # gstreamer/tests/examples/controller/text-color-example.c. It is # licensed under the terms of the GNU Library General Public License, # version 2 or (at your option) later. # # Copyright (C) 2013-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 require "gst" bin = Gst::Pipeline.new("pipeline") clock = bin.pipeline_clock src = Gst::ElementFactory.make("videotestsrc", nil) raise "need videotestsrc from gst-plugins-base" if src.nil? src.pattern = 10 # checkers-8 text = Gst::ElementFactory.make("textoverlay", nil) raise "need textoverlay from gst-plugins-base" if text.nil? text.text = "GStreamer rocks!" text.font_desc = "Sans, 30" text.halignment = 4 # position text.valignment = 3 # position sink = Gst::ElementFactory.make("ximagesink", nil) raise "need ximagesink from gst-plugins-base" if sink.nil? bin << src << text << sink src >> text >> sink # setup control sources cs = Gst::LFOControlSource.new cs.frequency = 0.11 cs.amplitude = 0.2 cs.offset = 0.5 text.add_control_binding(Gst::DirectControlBinding.new(text, "xpos", cs)) cs = Gst::LFOControlSource.new cs.frequency = 0.04 cs.amplitude = 0.4 cs.offset = 0.5 text.add_control_binding(Gst::DirectControlBinding.new(text, "ypos", cs)) cs_r = Gst::LFOControlSource.new cs_r.frequency = 0.19 cs_r.amplitude = 0.5 cs_r.offset = 0.5 cs_g = Gst::LFOControlSource.new cs_g.frequency = 0.27 cs_g.amplitude = 0.5 cs_g.offset = 0.5 cs_b = Gst::LFOControlSource.new cs_b.frequency = 0.13 cs_b.amplitude = 0.5 cs_b.offset = 0.5 text.add_control_binding(Gst::ARGBControlBinding.new(text, "color", nil, cs_r, cs_g, cs_b)) # run for 10 seconds clock_id = clock.new_single_shot_id(clock.time + (30 * Gst::SECOND)) bin.play wait_ret, jitter = Gst::Clock.id_wait(clock_id) $stderr.puts "Clock.id_wait returned: #{wait_ret}" if wait_ret != Gst::ClockReturn::OK bin.stop ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/typefind.rb000077500000000000000000000056561511343406000236540ustar00rootroot00000000000000#!/usr/bin/env ruby # -*- coding: utf-8 -*- # # This sample code is a port of # gstreamer/tests/examples/typefind/typefind.c. It is licensed # under the terms of the GNU Library General Public License, version # 2 or (at your option) later. # # Here is the original copyright header: # Copyright (C) <2005> Stefan Kost # Copyright (C) <2006> Tim-Philipp Müller # # Copyright (C) 2013 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 require "gst" require "rexml/document" def event_loop(pipe) running = true bus = pipe.bus while running do message = bus.poll(Gst::MessageType::ANY, Gst::CLOCK_TIME_NONE) raise "message nil" if message.nil? case message.type when Gst::MessageType::EOS running = false when Gst::MessageType::WARNING warning, debug = message.parse_warning puts "Debugging info: #{debug || 'none'}" puts "Warning: #{warning.message}" when Gst::MessageType::ERROR error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" running = false end end end if ARGV.length < 1 puts "usage: #{$0} " exit(false) end # create a new pipeline to hold the elements pipeline = Gst::Pipeline.new("pipeline") raise "'pipeline' gstreamer plugin missing" if pipeline.nil? # create a file reader filesrc = Gst::ElementFactory.make("filesrc", "file_source") raise "'filesrc' gstreamer plugin missing" if filesrc.nil? filesrc.location = ARGV.first typefind = Gst::ElementFactory.make("typefind", "typefind") raise "'typefind' gstreamer plugin missing" if typefind.nil? sink = Gst::ElementFactory.make("fakesink", "sink") raise "'fakesink' gstreamer plugin missing" if sink.nil? # add objects to the main pipeline pipeline << filesrc << typefind << sink typefind.signal_connect("have-type") do |element, probability, caps| caps_str = caps.to_s xml = REXML::Document.new xml << REXML::XMLDecl.new capabilities = xml.add_element("Capabilities") cap1 = capabilities.add_element("Cap1") cap1.add_text(caps_str) xml.write($stdout, 2) puts end filesrc >> typefind >> sink # start playing pipeline.play # Run event loop listening for bus messages until EOS or ERROR event_loop(pipeline) # stop the bin pipeline.stop ruby-gnome-ruby-gnome-25972cb/gstreamer/sample/video-thumbnail.rb000077500000000000000000000043221511343406000251060ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2025 Ruby-GNOME 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 require "gst" if ARGV.size < 2 puts "usage: #{$0} " exit(false) end input = ARGV[0] output = ARGV[1] pipeline = Gst::Pipeline.new filesrc = Gst::ElementFactory.make("filesrc") filesrc.location = ARGV[0] decodebin = Gst::ElementFactory.make("decodebin", nil) raise "need decodebin from gst-plugins-base" if decodebin.nil? videoconvert = Gst::ElementFactory.make("videoconvert", nil) raise "need videoconvert from gst-plugins-base" if decodebin.nil? image_encoder_name = output.split(".").last + "enc" image_encoder = Gst::ElementFactory.make(image_encoder_name, nil) raise "need #{iamge_encoder_name}" if image_encoder.nil? filesink = Gst::ElementFactory.make("filesink", nil) filesink.location = output pipeline << filesrc << decodebin << videoconvert << image_encoder << filesink filesrc >> decodebin decodebin.signal_connect(:pad_added) do |_, pad| sink_pad = videoconvert.get_static_pad("sink") pad.link(sink_pad) end videoconvert >> image_encoder >> filesink loop = GLib::MainLoop.new bus = pipeline.bus bus.add_watch do |bus, message| case message.type when Gst::MessageType::EOS loop.quit when Gst::MessageType::ERROR error, debug = message.parse_error puts "Debugging info: #{debug || 'none'}" puts "Error: #{error.message}" loop.quit end true end pipeline.play begin loop.run rescue Interrupt puts "Interrupt" rescue => error puts "Error: #{error.message}" ensure pipeline.stop end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/000077500000000000000000000000001511343406000211645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gstreamer/test/gstreamer-test-utils.rb000066400000000000000000000020161511343406000256140ustar00rootroot00000000000000# Copyright (C) 2014-2021 Ruby-GNOME 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 require "gst" module GStreamerTestUtils private def only_gstreamer_version(major, minor, micro=nil) micro ||= 0 unless Gst::Version.or_later?(major, minor, micro) omit("Require GStreamer >= #{major}.#{minor}.#{micro}") end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/run-test.rb000077500000000000000000000022311511343406000232730ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2014-2021 Ruby-GNOME 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 require_relative "../../glib2/test/run-test" run_test(__dir__, [ "glib2", "gobject-introspection", "gstreamer", ]) do require_relative "gstreamer-test-utils" begin Gst.init rescue GObjectIntrospection::RepositoryError puts("Omit because typelib file doesn't exist: #{$!.message}") exit(true) end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-audio.rb000066400000000000000000000040001511343406000235610ustar00rootroot00000000000000# Copyright (C) 2024-2025 Ruby-GNOME 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 TestAudio < Test::Unit::TestCase include GStreamerTestUtils def test_audio_info audio_info = Gst::AudioInfo.new audio_info.set_format(:encoded, 44100, 2) structure = audio_info.to_caps.structures[0] assert_equal("ENCODED", structure["format"].value) assert_equal(44100, audio_info.rate) assert_equal(2, audio_info.channels) audio_info.set_format(:f32le, 16000, 1) modified_structure = audio_info.to_caps.structures[0] assert_equal("F32LE", modified_structure["format"].value) assert_equal(16000, audio_info.rate) assert_equal(1, audio_info.channels) end def test_audio_info_from_caps only_gstreamer_version(1, 20) caps = Gst::Caps.new("audio/ogg") caps["rate", :int] = 44100 caps["channels", :int] = 2 audio_info = Gst::AudioInfo.new(caps) structure = audio_info.to_caps.structures[0] assert_equal("ENCODED", structure["format"].value) assert_equal(44100, audio_info.rate) assert_equal(2, audio_info.channels) audio_info.set_format(:f32le, 16000, 1) modified_structure = audio_info.to_caps.structures[0] assert_equal("F32LE", modified_structure["format"].value) assert_equal(16000, audio_info.rate) assert_equal(1, audio_info.channels) end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-bin.rb000066400000000000000000000033361511343406000232430ustar00rootroot00000000000000# 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 TestBin < Test::Unit::TestCase class TestEach < self def setup @pipeline = Gst::Pipeline.new("my-pipeline") @source = Gst::ElementFactory.make("fakesrc", "source") @filter = Gst::ElementFactory.make("identity", "filter") @sink = Gst::ElementFactory.make("fakesink", "sink") @pipeline.add_elements(@source, @filter, @sink) @source.link(@filter, @sink) end def test_elements assert_equal(sort_elements([@source, @filter, @sink]), sort_elements(@pipeline.each.to_a)) end def test_sorted unless Gst::Version.or_later?(1, 9, 3) omit("Crash because gst_bin_sort_iterator_copy() doesn't copy " + "GstBinSortIterator::queue") end assert_equal([@sink, @filter, @source], @pipeline.each(:sorted => true).to_a) end private def sort_elements(elements) elements.sort_by {|element| element.class.gtype.name} end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-bus.rb000066400000000000000000000027271511343406000232670ustar00rootroot00000000000000# Copyright (C) 2019 Ruby-GNOME 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 TestBus < Test::Unit::TestCase def setup @pipeline = Gst::Pipeline.new("my-pipeline") @source = Gst::ElementFactory.make("fakesrc", "source") @filter = Gst::ElementFactory.make("identity", "filter") @sink = Gst::ElementFactory.make("fakesink", "sink") @pipeline.add_elements(@source, @filter, @sink) @source.link(@filter, @sink) @bus = @pipeline.bus end def test_add_watch message_types = [] loop = GLib::MainLoop.new @bus.add_watch do |_bus, message| message_types << message.type loop.quit GLib::Source::REMOVE end @pipeline.play loop.run assert_equal([Gst::MessageType::STATE_CHANGED], message_types) end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-caps.rb000066400000000000000000000036011511343406000234140ustar00rootroot00000000000000# Copyright (C) 2014-2025 Ruby-GNOME 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 TestCaps < Test::Unit::TestCase class TestConstructor < self def test_any assert_equal("ANY", Gst::Caps.any.to_s) end def test_empty assert_equal("EMPTY", Gst::Caps.empty.to_s) end def test_media_type assert_equal("audio/ogg", Gst::Caps.new("audio/ogg").to_s) end def test_set_int_value caps = Gst::Caps.new("audio/ogg") caps.set_int_value("rate", 44100) structure = caps.structures[0] value = structure["rate"] assert_equal([GLib::Type::INT, 44100], [value.type, value.value]) end def test_array_set_no_type caps = Gst::Caps.new("audio/ogg") caps["rate"] = 44100 structure = caps.structures[0] value = structure["rate"] assert_equal([GLib::Type::UINT, 44100], [value.type, value.value]) end def test_array_set_int caps = Gst::Caps.new("audio/ogg") caps["rate", :int] = 44100 structure = caps.structures[0] value = structure["rate"] assert_equal([GLib::Type::INT, 44100], [value.type, value.value]) end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-child-proxy.rb000066400000000000000000000020301511343406000247230ustar00rootroot00000000000000# Copyright (C) 2014-2023 Ruby-GNOME 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 TestChildProxy < Test::Unit::TestCase def setup @capsfilter = Gst::ElementFactory.make("capsfilter") end def test_property any_caps = Gst::Caps.any @capsfilter.caps = any_caps assert_equal(any_caps.to_s, @capsfilter.caps.to_s) end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-element-factory.rb000066400000000000000000000016671511343406000255760ustar00rootroot00000000000000# Copyright (C) 2014 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 TestElementFactory < Test::Unit::TestCase def test_find name = "tee" factory = Gst::ElementFactory.find(name) assert_equal(name, factory.name) end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-map-info.rb000066400000000000000000000025221511343406000241750ustar00rootroot00000000000000# Copyright (C) 2016-2023 Ruby-GNOME 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 TestMapInfo < Test::Unit::TestCase def setup unless Gst::ElementFactory.find("videotestsrc") omit("gst-plugins-good is needed") end @pipeline = Gst.parse_launch("videotestsrc ! appsink name=sink") @sink = @pipeline.get_by_name("sink") end def test_data @pipeline.play begin sample = @sink.try_pull_sample(Gst::SECOND) buffer = sample.buffer success, map_info = buffer.map(:read) assert_true(success) assert do map_info.data.size >= 115200 end ensure @pipeline.stop end end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-tag-list.rb000066400000000000000000000021621511343406000242130ustar00rootroot00000000000000# Copyright (C) 2019 Ruby-GNOME 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 TestTagList < Test::Unit::TestCase def setup @tag_list = Gst::TagList.new @tag_list.add_value(:append, "title", "Hello") end def test_each tags = [] @tag_list.each do |name, values| tags << [name, values] end assert_equal([ ["title", ["Hello"]], ], tags) end end ruby-gnome-ruby-gnome-25972cb/gstreamer/test/test-version.rb000066400000000000000000000036441511343406000241620ustar00rootroot00000000000000# Copyright (C) 2015 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 TestGstVersion < Test::Unit::TestCase test "STRING" do major = Gst::Version::MAJOR minor = Gst::Version::MINOR micro = Gst::Version::MICRO nano = Gst::Version::NANO assert_equal([major, minor, micro, nano].join("."), Gst::Version::STRING) end sub_test_case("#or_later?") do test "same" do assert_true(Gst::Version.or_later?(Gst::Version::MAJOR, Gst::Version::MINOR, Gst::Version::MICRO, Gst::Version::NANO)) end test "later" do assert_true(Gst::Version.or_later?(Gst::Version::MAJOR, Gst::Version::MINOR - 1, Gst::Version::MICRO, Gst::Version::NANO)) end test "earlier" do assert_false(Gst::Version.or_later?(Gst::Version::MAJOR, Gst::Version::MINOR + 1, Gst::Version::MICRO, Gst::Version::NANO)) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/000077500000000000000000000000001511343406000170645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/.yardopts000066400000000000000000000016471511343406000207420ustar00rootroot00000000000000# Copyright (C) 2024 Ruby-GNOME 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 --files doc/**/*.* --load yard-gobject-introspection.rb --markup markdown --markup-provider commonmarker --output-dir yard_docs --title Ruby/GTK3 lib/**/*.rb ruby-gnome-ruby-gnome-25972cb/gtk3/COPYING.LIB000066400000000000000000000636421511343406000205370ustar00rootroot00000000000000 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. Copyright (C) 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. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ruby-gnome-ruby-gnome-25972cb/gtk3/README.md000066400000000000000000000021741511343406000203470ustar00rootroot00000000000000# Ruby/GTK3 Ruby/GTK3 is a Ruby binding of GTK+ 3. ## Requirements * Ruby/GLib2, Ruby/ATK, Ruby/Pango, Ruby/GdkPixbuf2, Ruby/GIO2, Ruby/GDK3, Ruby/GObjectIntrospection and Ruby/GTK3 in [Ruby-GNOME](https://ruby-gnome.github.io/) * [rcairo](https://github.com/rcairo/rcairo) * [GTK+](http://www.gtk.org/) 3.4.2 or later ## Install gem install gtk3 ## Tutorials, examples: * [sample/misc](/gtk3/sample/misc): a lot of simple examples. * [sample/gtk-demo](/gtk3/sample/gtk-demo): the ruby version of `gtk-demo`. * [sample/tutorial](/gtk3/sample/tutorial): the ruby version of the [offical Gtk3 tutorial "getting started"](https://developer.gnome.org/gtk3/stable/gtk-getting-started.html). * a well written tutorial [on how to create a todo application](http://iridakos.com/tutorials/2018/01/25/creating-a-gtk-todo-application-with-ruby) ## License Copyright (c) 2002-2020 Ruby-GNOME 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 * https://github.com/ruby-gnome/ruby-gnome * https://ruby-gnome.github.io/ ruby-gnome-ruby-gnome-25972cb/gtk3/Rakefile000066400000000000000000000020051511343406000205260ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018 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 $LOAD_PATH.unshift("./../glib2/lib") require 'gnome/rake/package-task' package_name = File.basename(__dir__) spec = Gem::Specification.load("#{package_name}.gemspec") GNOME::Rake::PackageTask.define(spec, __dir__) do |package| end ruby-gnome-ruby-gnome-25972cb/gtk3/TODO000066400000000000000000000001301511343406000175460ustar00rootroot00000000000000* Implement Gtk::PageSetupUnixDialog by hand. * Implement Gtk::PrintUnixDialog by hand. ruby-gnome-ruby-gnome-25972cb/gtk3/ext/000077500000000000000000000000001511343406000176645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/000077500000000000000000000000001511343406000205345ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/depend000066400000000000000000000002451511343406000217170ustar00rootroot00000000000000install: install-pc install-pc: if test -n "$(pkgconfigdir)"; then \ $(MAKEDIRS) $(pkgconfigdir); \ $(INSTALL_DATA) ruby-gtk3.pc $(pkgconfigdir); \ fi ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/extconf.rb000077500000000000000000000066021511343406000225360ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2015-2023 Ruby-GNOME 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 require "pathname" base_dir = Pathname(__FILE__).dirname.parent.parent.expand_path top_dir = base_dir.parent top_build_dir = Pathname(".").parent.parent.parent.expand_path mkmf_gnome2_dir = top_dir + "glib2" + "lib" $LOAD_PATH.unshift(mkmf_gnome2_dir.to_s) if mkmf_gnome2_dir.exist? module_name = "gtk3" package_id = "gtk+-3.0" require "mkmf-gnome" depended_packages = [ "glib2", "gobject-introspection", "cairo-gobject", "pango", ] depended_packages.each do |package| add_depend_package(package, "#{package}/ext/#{package}", top_dir.to_s, top_build_dir: top_build_dir.to_s) end unless check_cairo(:top_dir => top_dir) exit(false) end unless required_pkg_config_package(package_id, :alt_linux => "libgtk+3-devel", :arch_linux => "gtk3", :conda => [ "gtk3", "xorg-xineramaproto", ], :debian => "libgtk-3-dev", :redhat => "pkgconfig(#{package_id})", :homebrew => "gtk+3", :macports => "gtk3", :msys2 => "gtk3") exit(false) end unless PKGConfig.have_package("gobject-introspection-1.0") exit(false) end create_pkg_config_file("Ruby/GTK3", package_id) $defs << "-DRUBY_GTK3_COMPILATION" case RUBY_PLATFORM when /darwin/ symbols_in_external_bundles = [ "_rb_gi_callback_data_get_rb_callback", "_rb_gi_callback_register_finder", "_rb_gi_struct_new_raw", "_rbg_check_array_type", "_rbg_cstr2rval", "_rbg_define_private_method", "_rbg_define_singleton_method", "_rbg_rval2cstr", "_rbg_rval_inspect", "_rbg_strv2rval", "_rbgobj_boxed_not_copy_obj", "_rbgobj_gc_mark_gvalue", "_rbgobj_gc_mark_instance", "_rbgobj_gvalue_to_rvalue", "_rbgobj_instance_from_ruby_object", "_rbgobj_lookup_class", "_rbgobj_make_boxed", "_rbgobj_make_flags", "_rbgobj_register_mark_func", "_rbgobj_ruby_object_from_instance", "_rbgobj_rvalue_to_gvalue", "_rbgobj_set_signal_call_func", ] symbols_in_external_bundles.each do |symbol| $DLDFLAGS << " -Wl,-U,#{symbol}" end end create_makefile(module_name) pkg_config_dir = with_config("pkg-config-dir") if pkg_config_dir.is_a?(String) File.open("Makefile", "ab") do |makefile| makefile.puts makefile.puts("pkgconfigdir=#{pkg_config_dir}") end end ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-accel-map.c000066400000000000000000000044611511343406000237760ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2022 Ruby-GNOME 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 */ #include "rb-gtk3-private.h" static void accel_map_foreach_func(gpointer data, const gchar *path, guint key, GdkModifierType accel_mods, gboolean changed) { VALUE block = (VALUE)data; ID id_call; CONST_ID(id_call, "call"); rb_funcall(block, id_call, 4, CSTR2RVAL(path), UINT2NUM(key), GFLAGS2RVAL(accel_mods, GDK_TYPE_MODIFIER_TYPE), CBOOL2RVAL(changed)); } static VALUE rg_s_each(int argc, VALUE *args, VALUE self) { RETURN_ENUMERATOR(self, argc, args); VALUE options = Qnil; VALUE block = Qnil; rb_scan_args(argc, args, ":&", &options, &block); ID keywords[1]; VALUE values[1]; CONST_ID(keywords[0], "filter"); rb_get_kwargs(options, keywords, 0, 1, values); VALUE filter = values[0]; if (filter == RUBY_Qundef || RB_NIL_P(filter)) { filter = RUBY_Qtrue; } if (RB_TEST(filter)) { gtk_accel_map_foreach((gpointer)block, accel_map_foreach_func); } else { gtk_accel_map_foreach_unfiltered((gpointer)block, accel_map_foreach_func); } return self; } void rbgtk3_accel_map_init(void) { VALUE mGtk = rb_const_get(rb_cObject, rb_intern("Gtk")); VALUE RG_TARGET_NAMESPACE = rb_const_get(mGtk, rb_intern("AccelMap")); RG_DEF_SMETHOD(each, -1); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-cell-layout.c000066400000000000000000000025741511343406000244110ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015 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 */ #include "rb-gtk3-private.h" static void rb_gtk3_cell_layout_mark(gpointer object) { GtkCellLayout *cell_layout = object; GList *node; GList *renderers; renderers = gtk_cell_layout_get_cells(cell_layout); for (node = renderers; node; node = g_list_next(node)) { GtkCellRenderer *renderer = node->data; rbgobj_gc_mark_instance(renderer); } g_list_free(renderers); } void rbgtk3_cell_layout_init(void) { rbgobj_register_mark_func(GTK_TYPE_CELL_LAYOUT, rb_gtk3_cell_layout_mark); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-container.c000066400000000000000000000077121511343406000241400ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015-2022 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 */ #include "rb-gtk3-private.h" #define RG_TARGET_NAMESPACE cContainer #define _SELF(self) (RVAL2GTKCONTAINER(self)) static GQuark q_ruby_setter; static GQuark q_ruby_getter; static void rb_gtk3_container_mark(gpointer object); static void rb_gtk3_container_mark_callback(GtkWidget *widget, G_GNUC_UNUSED gpointer data) { if (rbgobj_gc_mark_instance(widget)) return; if (GTK_IS_CONTAINER(widget)) rb_gtk3_container_mark(widget); } static void rb_gtk3_container_mark(gpointer object) { gtk_container_forall(GTK_CONTAINER(object), rb_gtk3_container_mark_callback, NULL); } /* FIXME: use rb_protect */ static void get_child_prop_func(GtkContainer *container, GtkWidget *child, G_GNUC_UNUSED guint property_id, GValue *value, GParamSpec *pspec) { ID ruby_getter = (ID)g_param_spec_get_qdata(pspec, q_ruby_getter); if (!ruby_getter) { gchar *name = g_strconcat("get_", g_param_spec_get_name(pspec), NULL); gchar *p; for (p = name; *p; p++) { if (*p == '-') *p = '_'; } ruby_getter = rb_intern(name); g_param_spec_set_qdata(pspec, q_ruby_getter, (gpointer)ruby_getter); g_free(name); } { VALUE ret = rb_funcall(GOBJ2RVAL(container), ruby_getter, 1, GOBJ2RVAL(child)); rbgobj_rvalue_to_gvalue(ret, value); } } /* FIXME: use rb_protect */ static void set_child_prop_func(GtkContainer *container, GtkWidget *child, G_GNUC_UNUSED guint property_id, const GValue *value, GParamSpec *pspec) { ID ruby_setter = (ID)g_param_spec_get_qdata(pspec, q_ruby_setter); if (!ruby_setter) { gchar *name = g_strconcat("set_", g_param_spec_get_name(pspec), NULL); gchar *p; for (p = name; *p; p++) { if (*p == '-') *p = '_'; } ruby_setter = rb_intern(name); g_param_spec_set_qdata(pspec, q_ruby_setter, (gpointer)ruby_setter); g_free(name); } rb_funcall(GOBJ2RVAL(container), ruby_setter, 2, GOBJ2RVAL(child), GVAL2RVAL(value)); } static VALUE rg_s_init(VALUE klass) { rb_call_super(0, NULL); GType type = CLASS2GTYPE(klass); GtkContainerClass *g_container_class = GTK_CONTAINER_CLASS(g_type_class_ref(type)); g_container_class->set_child_property = set_child_prop_func; g_container_class->get_child_property = get_child_prop_func; g_type_class_unref(g_container_class); return Qnil; } void rbgtk3_container_init(void) { VALUE mGtk; VALUE RG_TARGET_NAMESPACE; q_ruby_getter = g_quark_from_static_string("__ruby_getter"); q_ruby_setter = g_quark_from_static_string("__ruby_setter"); mGtk = rb_const_get(rb_cObject, rb_intern("Gtk")); RG_TARGET_NAMESPACE = rb_const_get(mGtk, rb_intern("Container")); rbgobj_register_mark_func(GTK_TYPE_CONTAINER, rb_gtk3_container_mark); RG_DEF_SMETHOD(init, 0); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-private.h000066400000000000000000000027231511343406000236320ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015-2022 Ruby-GNOME 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 */ #ifndef RB_GTK3_PRIVATE_H #define RB_GTK3_PRIVATE_H /* * CentOS 6: No GTK+ 3 * CentOS 7: GTK+ 3.22 * Ubuntu 18.04: GTK+ 3.22 */ #define GDK_VERSION_MIN_REQUIRED GDK_VERSION_3_22 #include "rb-gtk3.h" G_GNUC_INTERNAL void rbgtk3_accel_map_init(void); G_GNUC_INTERNAL void rbgtk3_cell_layout_init(void); G_GNUC_INTERNAL void rbgtk3_container_init(void); G_GNUC_INTERNAL void rbgtk3_spin_button_init(void); G_GNUC_INTERNAL void rbgtk3_tree_model_init(void); G_GNUC_INTERNAL void rbgtk3_tree_view_init(void); G_GNUC_INTERNAL void rbgtk3_widget_init(void); G_GNUC_INTERNAL void rbgtk3_window_init(void); #endif ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-spin-button.c000066400000000000000000000051411511343406000244320ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * 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 */ #include "rb-gtk3-private.h" typedef struct { RGClosureCallData *data; VALUE args; double *new_value; } InputData; static VALUE rb_gtk3_spin_button_input_body(VALUE user_data) { InputData *input_data = (InputData *)user_data; VALUE new_value; new_value = rb_apply(input_data->data->callback, rb_intern("call"), input_data->args); if (NIL_P(new_value)) { g_value_set_int(input_data->data->return_value, FALSE); } else { g_value_set_int(input_data->data->return_value, TRUE); *(input_data->new_value) = NUM2DBL(new_value); } return Qnil; } static VALUE rb_gtk3_spin_button_input_rescue(VALUE user_data, VALUE error) { InputData *input_data = (InputData *)user_data; g_value_set_int(input_data->data->return_value, GTK_INPUT_ERROR); return Qnil; } static void rb_gtk3_spin_button_input(RGClosureCallData *data) { InputData input_data; VALUE args; args = rb_ary_new_from_args(1, GVAL2RVAL(&(data->param_values[0]))); if (!NIL_P(data->extra_args)) { rb_ary_concat(args, data->extra_args); } input_data.data = data; input_data.args = args; input_data.new_value = g_value_get_pointer(&(data->param_values[1])); rb_rescue(rb_gtk3_spin_button_input_body, (VALUE)&input_data, rb_gtk3_spin_button_input_rescue, (VALUE)&input_data); } void rbgtk3_spin_button_init(void) { VALUE mGtk; VALUE RG_TARGET_NAMESPACE; mGtk = rb_const_get(rb_cObject, rb_intern("Gtk")); RG_TARGET_NAMESPACE = rb_const_get(mGtk, rb_intern("SpinButton")); rbgobj_set_signal_call_func(RG_TARGET_NAMESPACE, "input", rb_gtk3_spin_button_input); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-tree-model.c000066400000000000000000000045001511343406000242030ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015 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 */ #include "rb-gtk3-private.h" static gboolean rb_gtk3_tree_model_mark_callback(GtkTreeModel *model, G_GNUC_UNUSED GtkTreePath *path, GtkTreeIter *iter, gpointer data) { GArray *target_columns = data; guint i, n; n = target_columns->len; for (i = 0; i < n; i++) { gint nth_column; GValue value = G_VALUE_INIT; nth_column = g_array_index(target_columns, gint, i); gtk_tree_model_get_value(model, iter, nth_column, &value); rbgobj_gc_mark_gvalue(&value); g_value_unset(&value); } return FALSE; } static void rb_gtk3_tree_model_mark(gpointer object) { GtkTreeModel *tree_model; GArray *target_columns; gint i, n; tree_model = GTK_TREE_MODEL(object); target_columns = g_array_new(FALSE, FALSE, sizeof(gint)); n = gtk_tree_model_get_n_columns(tree_model); for (i = 0; i < n; i++) { GType column_type = gtk_tree_model_get_column_type(tree_model, i); if (G_TYPE_FUNDAMENTAL(column_type) != G_TYPE_OBJECT) continue; g_array_append_val(target_columns, i); } gtk_tree_model_foreach(tree_model, rb_gtk3_tree_model_mark_callback, target_columns); g_array_unref(target_columns); } void rbgtk3_tree_model_init(void) { rbgobj_register_mark_func(GTK_TYPE_TREE_MODEL, rb_gtk3_tree_model_mark); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-tree-view.c000066400000000000000000000027461511343406000240670ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015 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 */ #include "rb-gtk3-private.h" static void rb_gtk3_tree_view_mark(gpointer object) { GtkTreeView *tree_view = object; GList *node; GList *columns; GtkTreeSelection *selection; columns = gtk_tree_view_get_columns(tree_view); for (node = columns; node; node = g_list_next(node)) { GtkTreeViewColumn *column = node->data; rbgobj_gc_mark_instance(column); } g_list_free(columns); selection = gtk_tree_view_get_selection(tree_view); rbgobj_gc_mark_instance(selection); } void rbgtk3_tree_view_init(void) { rbgobj_register_mark_func(GTK_TYPE_TREE_VIEW, rb_gtk3_tree_view_mark); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-widget.c000066400000000000000000000047261511343406000234430ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015-2018 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 */ #include "rb-gtk3-private.h" #include #define RG_TARGET_NAMESPACE cWidget #define _SELF(self) (RVAL2GTKWIDGET(self)) static VALUE rg_initialize_post(VALUE self) { GObject *object = RVAL2GOBJ(self); g_object_ref_sink(object); ID id_initialize_template; CONST_ID(id_initialize_template, "initialize_template"); rb_funcall(self, id_initialize_template, 0); return Qnil; } static void rb_gtk3_widget_draw(RGClosureCallData *data) { VALUE rb_widget; VALUE rb_cairo_context; VALUE rb_args; VALUE rb_stop_propagate; rb_widget = GVAL2RVAL(&(data->param_values[0])); rb_cairo_context = GVAL2RVAL(&(data->param_values[1])); rb_args = rb_ary_new_from_args(2, rb_widget, rb_cairo_context); if (!NIL_P(data->extra_args)) { rb_ary_concat(rb_args, data->extra_args); } rb_stop_propagate = rb_apply(data->callback, rb_intern("call"), rb_args); if (!RVAL2CBOOL(rb_funcall(rb_cairo_context, rb_intern("destroyed?"), 0))) { rb_funcall(rb_cairo_context, rb_intern("destroy"), 0); } g_value_set_boolean(data->return_value, RVAL2CBOOL(rb_stop_propagate)); } void rbgtk3_widget_init(void) { VALUE mGtk; VALUE RG_TARGET_NAMESPACE; mGtk = rb_const_get(rb_cObject, rb_intern("Gtk")); RG_TARGET_NAMESPACE = rb_const_get(mGtk, rb_intern("Widget")); RG_DEF_PRIVATE_METHOD(initialize_post, 0); rbgobj_set_signal_call_func(RG_TARGET_NAMESPACE, "draw", rb_gtk3_widget_draw); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3-window.c000066400000000000000000000035461511343406000234660ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2017-2022 Ruby-GNOME 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 */ #include "rb-gtk3-private.h" typedef struct { int dummy; } ToplevelWindowMarkerData; static void toplevel_window_marker_mark(G_GNUC_UNUSED void *_) { GList *list = gtk_window_list_toplevels(); GList *node; for (node = list; node; node = g_list_next(node)) { rbgobj_gc_mark_instance(node->data); } g_list_free(list); } static void toplevel_window_marker_free(void *data) { xfree(data); } static const rb_data_type_t toplevel_window_marker_type = { "Gtk::ToplevelsMarker", { toplevel_window_marker_mark, toplevel_window_marker_free, }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY, }; void rbgtk3_window_init(void) { ToplevelWindowMarkerData *data; VALUE toplevel_window_marker = TypedData_Make_Struct(rb_cObject, ToplevelWindowMarkerData, &toplevel_window_marker_type, data); rb_gc_register_mark_object(toplevel_window_marker); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3.c000066400000000000000000000467111511343406000221620ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015-2022 Ruby-GNOME 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 */ #include "rb-gtk3-private.h" #include static ID id_call; static VALUE cGdkAtom; /* #if GTK_CHECK_VERSION(3, 10, 0) # define RB_GTK_ACTION_IS_DEPRECATED # define RB_GTK_ACTION_GROUP_IS_DEPRECATED # define RB_GTK_UI_MANAGER_IS_DEPRECATED #endif */ static gboolean name_equal(GIArgInfo *info, const gchar *target_name) { GITypeInfo type_info; GIBaseInfo *interface_info; const gchar *namespace; const gchar *name; gboolean equal_name_p = FALSE; g_arg_info_load_type(info, &type_info); interface_info = g_type_info_get_interface(&type_info); namespace = g_base_info_get_namespace(interface_info); name = g_base_info_get_name(interface_info); if (strcmp(namespace, "Gtk") == 0 && strcmp(name, target_name) == 0) { equal_name_p = TRUE; } g_base_info_unref(interface_info); return equal_name_p; } static void rb_gtk3_callback_callback(GtkWidget *widget, gpointer user_data) { RBGICallbackData *callback_data = user_data; rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 1, GOBJ2RVAL(widget)); } static void rb_gtk3_cell_layout_data_func_callback(GtkCellLayout *cell_layout, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter; CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter = BOXED2RVAL(iter, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter, id_set_model, 1, rb_model); rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 4, GOBJ2RVAL(cell_layout), GOBJ2RVAL(cell), rb_model, rb_iter); } static void rb_gtk3_clipboard_received_func_callback(GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer user_data) { RBGICallbackData *callback_data = user_data; rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 2, GOBJ2RVAL(clipboard), BOXED2RVAL(selection_data, GTK_TYPE_SELECTION_DATA)); } static void rb_gtk3_clipboard_image_received_func_callback(GtkClipboard *clipboard, GdkPixbuf *pixbuf, gpointer user_data) { RBGICallbackData *callback_data = user_data; rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 2, GOBJ2RVAL(clipboard), GOBJ2RVAL(pixbuf)); } static void rb_gtk3_clipboard_targets_received_func_callback(GtkClipboard *clipboard, GdkAtom *atoms, gint n_atoms, gpointer user_data) { RBGICallbackData *callback_data = user_data; VALUE rb_atoms; gint i; if (!atoms) { rb_atoms = Qnil; } else { rb_atoms = rb_ary_new2(n_atoms); for (i = 0; i < n_atoms; i++) { VALUE rb_atom; rb_atom = rb_gi_struct_new_raw(cGdkAtom, atoms[i], FALSE); rb_ary_push(rb_atoms, rb_atom); } } rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 2, GOBJ2RVAL(clipboard), rb_atoms); } static void rb_gtk3_clipboard_text_received_func_callback(GtkClipboard *clipboard, const gchar *text, gpointer user_data) { RBGICallbackData *callback_data = user_data; rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 2, GOBJ2RVAL(clipboard), CSTR2RVAL(text)); } static void rb_gtk3_clipboard_uri_received_func_callback(GtkClipboard *clipboard, gchar **uris, gpointer user_data) { RBGICallbackData *callback_data = user_data; rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 2, GOBJ2RVAL(clipboard), STRV2RVAL((const gchar **)uris)); } static gboolean rb_gtk3_entry_completion_match_func_callback(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter; GtkTreeModel *model; VALUE rb_match; gboolean match = FALSE; model = gtk_entry_completion_get_model(completion); CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter = BOXED2RVAL(iter, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter, id_set_model, 1, rb_model); rb_match = rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 3, GOBJ2RVAL(completion), CSTR2RVAL(key), rb_iter); match = RVAL2CBOOL(rb_match); return match; } static void rb_gtk3_menu_position_func_callback(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { RBGICallbackData *callback_data = user_data; VALUE rb_result_raw; VALUE rb_result; rb_result_raw = rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 3, GOBJ2RVAL(menu), INT2NUM(*x), INT2NUM(*y)); rb_result = rbg_check_array_type(rb_result_raw); if (NIL_P(rb_result) || !(RARRAY_LEN(rb_result) == 2 || RARRAY_LEN(rb_result) == 3)) { /* TODO: Raising an error will abort the program. :< */ rb_raise(rb_eArgError, "block should return [x, y, push_in]: %s", RBG_INSPECT(rb_result_raw)); } *x = NUM2INT(RARRAY_PTR(rb_result)[0]); *y = NUM2INT(RARRAY_PTR(rb_result)[1]); if (RARRAY_LEN(rb_result) == 3) { *push_in = RVAL2CBOOL(RARRAY_PTR(rb_result)[2]); } } static const gchar * rb_gtk3_translate_func_callback(const gchar *path, gpointer user_data) { RBGICallbackData *callback_data = user_data; VALUE rb_translated; rb_translated = rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 1, CSTR2RVAL(path)); return RVAL2CSTR(rb_translated); } static void rb_gtk3_tree_cell_data_func_callback(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter; CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter = BOXED2RVAL(iter, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter, id_set_model, 1, rb_model); rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 4, GOBJ2RVAL(column), GOBJ2RVAL(cell), rb_model, rb_iter); } static gint rb_gtk3_tree_iter_compare_func_callback(GtkTreeModel *model, GtkTreeIter *iter1, GtkTreeIter *iter2, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter1; VALUE rb_iter2; VALUE rb_result; CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter1 = BOXED2RVAL(iter1, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter1, id_set_model, 1, rb_model); rb_iter2 = BOXED2RVAL(iter2, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter2, id_set_model, 1, rb_model); rb_result = rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 3, rb_model, rb_iter1, rb_iter2); return NUM2INT(rb_result); } static void rb_gtk3_tree_model_filter_modify_func_callback(GtkTreeModel *model, GtkTreeIter *iter, GValue *value, gint column, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter; VALUE rb_value; VALUE rb_column; CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter = BOXED2RVAL(iter, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter, id_set_model, 1, rb_model); rb_column = INT2NUM(column); rb_value = rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 3, rb_model, rb_iter, rb_column); rbgobj_rvalue_to_gvalue(rb_value, value); } static gboolean rb_gtk3_tree_model_filter_visible_func_callback(GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter; VALUE rb_visible; gboolean visible = FALSE; CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter = BOXED2RVAL(iter, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter, id_set_model, 1, rb_model); rb_visible = rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 2, rb_model, rb_iter); visible = RVAL2CBOOL(rb_visible); return visible; } static gboolean rb_gtk3_tree_model_foreach_func_callback(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter; gboolean stop = FALSE; CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter = BOXED2RVAL(iter, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter, id_set_model, 1, rb_model); rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 3, rb_model, BOXED2RVAL(path, GTK_TYPE_TREE_PATH), rb_iter); return stop; } static void rb_gtk3_tree_selection_foreach_func_callback(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { RBGICallbackData *callback_data = user_data; ID id_set_model; VALUE rb_model; VALUE rb_iter; CONST_ID(id_set_model, "model="); rb_model = GOBJ2RVAL(model); rb_iter = BOXED2RVAL(iter, GTK_TYPE_TREE_ITER); rb_funcall(rb_iter, id_set_model, 1, rb_model); rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 3, rb_model, BOXED2RVAL(path, GTK_TYPE_TREE_PATH), rb_iter); } static gboolean rb_gtk3_tree_selection_func_callback(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data) { RBGICallbackData *callback_data = data; VALUE rb_selection_is_changeable; rb_selection_is_changeable = rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 4, GOBJ2RVAL(selection), GOBJ2RVAL(model), BOXED2RVAL(path, GTK_TYPE_TREE_PATH), CBOOL2RVAL(path_currently_selected)); return RVAL2CBOOL(rb_selection_is_changeable); } static void rb_gtk3_tree_view_mapping_func_callback(GtkTreeView *tree_view, GtkTreePath *path, gpointer user_data) { RBGICallbackData *callback_data = user_data; rb_funcall(rb_gi_callback_data_get_rb_callback(callback_data), id_call, 2, GOBJ2RVAL(tree_view), BOXED2RVAL(path, GTK_TYPE_TREE_PATH)); } static gpointer rb_gtk3_callback_finder(GIArgInfo *info) { if (name_equal(info, "Callback")) { return rb_gtk3_callback_callback; } else if (name_equal(info, "CellLayoutDataFunc")) { return rb_gtk3_cell_layout_data_func_callback; } else if (name_equal(info, "ClipboardReceivedFunc")) { return rb_gtk3_clipboard_received_func_callback; } else if (name_equal(info, "ClipboardImageReceivedFunc")) { return rb_gtk3_clipboard_image_received_func_callback; } else if (name_equal(info, "ClipboardTargetsReceivedFunc")) { return rb_gtk3_clipboard_targets_received_func_callback; } else if (name_equal(info, "ClipboardTextReceivedFunc")) { return rb_gtk3_clipboard_text_received_func_callback; } else if (name_equal(info, "ClipboardURIReceivedFunc")) { return rb_gtk3_clipboard_uri_received_func_callback; } else if (name_equal(info, "EntryCompletionMatchFunc")) { return rb_gtk3_entry_completion_match_func_callback; } else if (name_equal(info, "MenuPositionFunc")) { return rb_gtk3_menu_position_func_callback; } else if (name_equal(info, "TranslateFunc")) { return rb_gtk3_translate_func_callback; } else if (name_equal(info, "TreeCellDataFunc")) { return rb_gtk3_tree_cell_data_func_callback; } else if (name_equal(info, "TreeIterCompareFunc")) { return rb_gtk3_tree_iter_compare_func_callback; } else if (name_equal(info, "TreeModelFilterModifyFunc")) { return rb_gtk3_tree_model_filter_modify_func_callback; } else if (name_equal(info, "TreeModelFilterVisibleFunc")) { return rb_gtk3_tree_model_filter_visible_func_callback; } else if (name_equal(info, "TreeModelForeachFunc")) { return rb_gtk3_tree_model_foreach_func_callback; } else if (name_equal(info, "TreeSelectionForeachFunc")) { return rb_gtk3_tree_selection_foreach_func_callback; } else if (name_equal(info, "TreeSelectionFunc")) { return rb_gtk3_tree_selection_func_callback; } else if (name_equal(info, "TreeViewMappingFunc")) { return rb_gtk3_tree_view_mapping_func_callback; } else { return NULL; } } #ifndef RB_GTK_ACTION_IS_DEPRECATED static void rb_gtk3_action_mark(gpointer object) { GtkAction *action; GSList *proxies, *node; action = GTK_ACTION(object); proxies = gtk_action_get_proxies(action); for (node = proxies; node; node = g_slist_next(node)) { GtkWidget *proxy = node->data; rbgobj_gc_mark_instance(proxy); } } #endif static void rb_gtk3_builder_mark(gpointer object) { GtkBuilder *builder; GSList *objects; builder = GTK_BUILDER(object); objects = gtk_builder_get_objects(builder); g_slist_foreach(objects, (GFunc)rbgobj_gc_mark_instance, NULL); g_slist_free(objects); } #ifndef RB_GTK_ACTION_GROUP_IS_DEPRECATED static void rb_gtk3_action_group_mark(gpointer object) { GtkActionGroup *group; GList *actions, *node; group = GTK_ACTION_GROUP(object); actions = gtk_action_group_list_actions(group); for (node = actions; node; node = g_list_next(node)) { GtkWidget *action = node->data; rbgobj_gc_mark_instance(action); } g_list_free(actions); } #endif #ifndef RB_GTK_UI_MANAGER_IS_DEPRECATED static void rb_gtk3_ui_manager_mark(gpointer object) { GtkUIManager *manager; GList *action_groups, *node; manager = GTK_UI_MANAGER(object); action_groups = gtk_ui_manager_get_action_groups(manager); for (node = action_groups; node; node = g_list_next(node)) { GtkWidget *action_group = node->data; rbgobj_gc_mark_instance(action_group); } rbgobj_gc_mark_instance(gtk_ui_manager_get_accel_group(manager)); } #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 Init_gtk3(void) { id_call = rb_intern("call"); cGdkAtom = rb_const_get(rb_const_get(rb_cObject, rb_intern("Gdk")), rb_intern("Atom")); rb_gi_callback_register_finder(rb_gtk3_callback_finder); #ifndef RB_GTK_ACTION_IS_DEPRECATED rbgobj_register_mark_func(GTK_TYPE_ACTION, rb_gtk3_action_mark); #endif rbgobj_register_mark_func(GTK_TYPE_BUILDER, rb_gtk3_builder_mark); #ifndef RB_GTK_ACTION_GROUP_IS_DEPRECATED rbgobj_register_mark_func(GTK_TYPE_ACTION_GROUP, rb_gtk3_action_group_mark); #endif #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_accel_map_init(); rbgtk3_cell_layout_init(); rbgtk3_container_init(); rbgtk3_spin_button_init(); rbgtk3_tree_model_init(); rbgtk3_tree_view_init(); rbgtk3_widget_init(); rbgtk3_window_init(); rbgobj_boxed_not_copy_obj(GTK_TYPE_SELECTION_DATA); setlocale(LC_NUMERIC, "C"); } ruby-gnome-ruby-gnome-25972cb/gtk3/ext/gtk3/rb-gtk3.h000066400000000000000000000017621511343406000221640ustar00rootroot00000000000000/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* * Copyright (C) 2015 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 */ #ifndef RB_GTK3_H #define RB_GTK3_H #include #include extern void Init_gtk3 (void); #endif ruby-gnome-ruby-gnome-25972cb/gtk3/extconf.rb000077500000000000000000000036521511343406000210700ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2015 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 require "pathname" require "mkmf" require "rbconfig" require "fileutils" package = "gtk3" base_dir = Pathname(__FILE__).dirname.expand_path ext_dir = base_dir + "ext" + package mkmf_gnome2_dir = base_dir + "lib" ruby = File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"]) build_dir = Pathname("ext") + package FileUtils.mkdir_p(build_dir.to_s) unless build_dir.exist? extconf_rb_path = ext_dir + "extconf.rb" system(ruby, "-C", build_dir.to_s, extconf_rb_path.to_s, *ARGV) || exit(false) create_makefile(package) FileUtils.mv("Makefile", "Makefile.lib") File.open("Makefile", "w") do |makefile| makefile.puts(<<-MAKEFILE) all: (cd ext/#{package} && $(MAKE)) $(MAKE) -f Makefile.lib install: (cd ext/#{package} && $(MAKE) install) $(MAKE) -f Makefile.lib install site-install: (cd ext/#{package} && $(MAKE) site-install) $(MAKE) -f Makefile.lib site-install clean: (cd ext/#{package} && $(MAKE) clean) $(MAKE) -f Makefile.lib clean distclean: (cd ext/#{package} && $(MAKE) distclean) $(MAKE) -f Makefile.lib distclean @rm -f Makefile.lib MAKEFILE end ruby-gnome-ruby-gnome-25972cb/gtk3/gtk3.gemspec000066400000000000000000000050471511343406000213070ustar00rootroot00000000000000# -*- ruby -*- # # Copyright (C) 2018-2022 Ruby-GNOME 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 require_relative "../glib2/version" Gem::Specification.new do |s| s.name = "gtk3" s.summary = "Ruby/GTK3 is a Ruby binding of GTK+-3.x." s.description = "Ruby/Gtk3 is a Ruby binding of GTK 3.x. It allows Ruby " + "programmers to use the GTK graphics toolkit to make " + "graphical user interfaces for their Ruby scripts. " + "Many of the programs you use like file explorers, " + "browsers, graphics programs etc. use GTK to make their " + "GUI. In fact, there's a good chance that you're looking at " + "a GTK window right now. All the GTK commands and widgets " + "have been translated into Ruby, so Ruby programmers can " + "write scripts that create windows instead of only " + "using the command line. Visit our homepage for install " + "instructions and tutorials, at: " + "https://www.rubydoc.info/gems/gtk3/" s.author = "The Ruby-GNOME Project Team" s.email = "ruby-gnome2-devel-en@lists.sourceforge.net" s.homepage = "https://ruby-gnome.github.io/" s.licenses = ["LGPL-2.1-or-later"] s.version = ruby_glib2_version s.extensions = ["ext/#{s.name}/extconf.rb"] s.require_paths = ["lib"] s.files = [ "COPYING.LIB", "README.md", "Rakefile", "#{s.name}.gemspec", "extconf.rb", "ext/#{s.name}/depend", ] s.files += Dir.glob("lib/**/*.rb") s.files += Dir.glob("ext/#{s.name}/*.{c,h,def,rb}") s.files += Dir.glob("sample/**/*") s.files += Dir.glob("test/**/*") s.add_runtime_dependency("atk", "= #{s.version}") s.add_runtime_dependency("gdk3", "= #{s.version}") end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/000077500000000000000000000000001511343406000176325ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3.rb000066400000000000000000000030611511343406000210270ustar00rootroot00000000000000# Copyright (C) 2006-2018 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 require "atk" require "gdk3" require "gio2" require "gtk3/loader" module Gtk LOG_DOMAIN = "Gtk" GLib::Log.set_log_domain(LOG_DOMAIN) class Error < StandardError end class InitError < Error end class << self def const_missing(name) init() if const_defined?(name) const_get(name) else super end end def method_missing(name, *args, &block) init() if respond_to?(name) __send__(name, *args, &block) else super end end def init(*argv) class << self remove_method(:init) remove_method(:const_missing) remove_method(:method_missing) end Gdk.init if Gdk.respond_to?(:init) loader = Loader.new(self, argv) loader.load end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/000077500000000000000000000000001511343406000205025ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/about-dialog.rb000066400000000000000000000022421511343406000233760ustar00rootroot00000000000000# Copyright (C) 2015 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 AboutDialog class << self def show(parent=nil, attributes=nil) dialog = new (attributes || {}).each do |key, value| dialog.send("#{key}=", value) end if parent dialog.modal = true dialog.transient_for = parent dialog.destroy_with_parent = true end dialog.present end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/action-group.rb000066400000000000000000000106331511343406000234410ustar00rootroot00000000000000# Copyright (C) 2015-2017 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 ActionGroup alias_method :add_action_raw, :add_action def add_action(action, options={}) accelerator = options[:accelerator] if accelerator add_action_with_accel(action, accelerator) else add_action_raw(action) end end def add_actions(actions) actions.each do |config| if config.is_a?(Array) name = config[0] stock_id = config[1] label = config[2] accelerator = config[3] tooltip = config[4] callback = config[5] else name = config[:name] stock_id = config[:stock_id] label = config[:label] accelerator = config[:accelerator] tooltip = config[:tooltip] callback = config[:callback] end action = Action.new(name, :label => translate_string(label), :tooltip => translate_string(tooltip), :stock_id => stock_id) action.signal_connect("activate") do callback.call(self, action) end add_action(action, :accelerator => accelerator) end end def add_toggle_actions(actions) actions.each do |config| if config.is_a?(Array) name = config[0] stock_id = config[1] label = config[2] accelerator = config[3] tooltip = config[4] callback = config[5] is_active = config[6] else name = config[:name] stock_id = config[:stock_id] label = config[:label] accelerator = config[:accelerator] tooltip = config[:tooltip] callback = config[:callback] is_active = config[:is_active] end action = ToggleAction.new(name, :label => translate_string(label), :tooltip => translate_string(tooltip), :stock_id => stock_id) action.active = true if is_active action.signal_connect("activate") do callback.call(self, action) end add_action(action, :accelerator => accelerator) end end def add_radio_actions(actions, default_value=nil) actions.each_with_index do |config, i| if config.is_a?(Array) name = config[0] stock_id = config[1] label = config[2] accelerator = config[3] tooltip = config[4] value = config[5] else name = config[:name] stock_id = config[:stock_id] label = config[:label] accelerator = config[:accelerator] tooltip = config[:tooltip] value = config[:value] end action = RadioAction.new(name, value, :label => translate_string(label), :tooltip => translate_string(tooltip), :stock_id => stock_id) action.active = true if value == default_value if i.zero? action.signal_connect("changed") do |connected_action, current_action| yield(connected_action, current_action) end end add_action(action, :accelerator => accelerator) end end alias_method :translate_string_raw, :translate_string def translate_string(string) return nil if string.nil? translate_string_raw(string) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/action.rb000066400000000000000000000020331511343406000223020ustar00rootroot00000000000000# Copyright (C) 2015 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 Action alias_method :initialize_raw, :initialize def initialize(name, options={}) initialize_raw(name, options[:label], options[:tooltip], options[:stock_id]) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/application.rb000066400000000000000000000022361511343406000233350ustar00rootroot00000000000000# Copyright (C) 2018 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 Application alias_method :initialize_raw, :initialize def initialize(*args) case args.size when 0 initialize_raw(nil, :flags_none) when 1 if args[0].is_a?(String) initialize_raw(args[0], :flags_none) else initialize_raw(nil, args[0]) end else initialize_raw(*args) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/binding-set.rb000066400000000000000000000021031511343406000232260ustar00rootroot00000000000000# Copyright (C) 2015 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 BindingSet def add_signal(description) BindingEntry.add_signal_from_string(self, description) end def remove(key, modifiers) BindingEntry.remove(self, key, modifiers) end def skip(key, modifiers) BindingEntry.skip(self, key, modifiers) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/border.rb000066400000000000000000000020061511343406000223020ustar00rootroot00000000000000# Copyright (C) 2014 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 Border alias_method :initialize_raw, :initialize def initialize(left, right, top, bottom) initialize_raw self.left = left self.right = right self.top = top self.bottom = bottom end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/box.rb000066400000000000000000000042401511343406000216170ustar00rootroot00000000000000# Copyright (C) 2014 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 Box alias_method :initialize_raw, :initialize def initialize(orientation, spacing=0) initialize_raw(orientation, spacing || 0) end alias_method :pack_start_raw, :pack_start def pack_start(child, options={}) expand = options[:expand] || false fill = options[:fill] || false padding = options[:padding] || 0 pack_start_raw(child, expand, fill, padding) end alias_method :pack_end_raw, :pack_end def pack_end(child, options={}) expand = options[:expand] || false fill = options[:fill] || false padding = options[:padding] || 0 pack_end_raw(child, expand, fill, padding) end alias_method :set_child_packing_raw, :set_child_packing def set_child_packing(child, options={}) expand = options[:expand] fill = options[:fill] padding = options[:padding] pack_type = options[:pack_type] old_expand, old_fill, old_padding, old_pack_type = query_child_packing(child) expand = old_expand if expand.nil? fill = old_fill if fill.nil? padding = old_padding if padding.nil? pack_type = old_pack_type if pack_type.nil? set_child_packing_raw(child, expand, fill, padding, pack_type) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/builder.rb000066400000000000000000000106601511343406000224600ustar00rootroot00000000000000# 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 # 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 Builder class << self def connect_signal(builder, object, signal_name, handler_name, connect_object, flags, &block) handler_name = normalize_handler_name(handler_name) if connect_object handler = connect_object.method(handler_name) else handler = block.call(handler_name) end unless handler $stderr.puts("Undefined handler: #{handler_name}") if $DEBUG return end if flags.is_a?(Integer) flags = GLib::ConnectFlags.new(flags) end if flags.after? signal_connect_method = :signal_connect_after else signal_connect_method = :signal_connect end if handler.arity.zero? object.__send__(signal_connect_method, signal_name) do handler.call end else object.__send__(signal_connect_method, signal_name, &handler) end end private def normalize_handler_name(name) name.gsub(/[-\s]+/, "_") end end alias_method :initialize_raw, :initialize def initialize(options={}) path = options[:path] || options[:file] resource = options[:resource] string = options[:string] if path path = path.to_path if path.respond_to?(:to_path) initialize_new_from_file(path) elsif resource initialize_new_from_resource(resource) elsif string initialize_new_from_string(string, string.bytesize) else initialize_raw end end alias_method :[], :get_object alias_method :add_from_string_raw, :add_from_string def add_from_string(string) add_from_string_raw(string, string.bytesize) end alias_method :add_objects_from_string_raw, :add_objects_from_string def add_objects_from_string(string, object_ids) add_objects_from_string_raw(string, string.bytesize, object_ids) end def add(target_or_options={}) if target_or_options.is_a?(Hash) options = target_or_options else target = target_or_options options = {} if target.respond_to?(:to_path) options[:path] = target.to_path elsif target.start_with?("<") or target.start_with?(" ") options[:string] = target elsif File.exist?(target) options[:path] = target else options[:resource] = target end end string = options[:string] path = options[:path] || options[:file] resource = options[:resource] object_ids = options[:object_ids] if path path = path.to_path if path.respond_to?(:to_path) if object_ids add_objects_from_file(path, object_ids) else add_from_file(path) end elsif resource if object_ids add_objects_from_resource(resource, object_ids) else add_from_resource(resource) end elsif string if object_ids add_objects_from_string(string, object_ids) else add_from_string(string) end else message = ":path (:file), :resource or :string " + "must be specified: #{options.inspect}" raise InvalidArgument, message end end def <<(target) add(target) self end alias_method :connect_signals_raw, :connect_signals def connect_signals(&block) connect_signals_raw do |*args| self.class.connect_signal(*args, &block) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/button.rb000066400000000000000000000032631511343406000223460ustar00rootroot00000000000000# Copyright (C) 2014 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 Button alias_method :initialize_raw, :initialize def initialize(options={}) label = options[:label] use_underline = options[:use_underline] if use_underline.nil? mnemonic = options[:mnemonic] if mnemonic label = mnemonic use_underline = true end end stock = options[:stock_id] icon_name = options[:icon_name] icon_size = options[:icon_size] || :button if label if use_underline initialize_new_with_mnemonic(label) else initialize_new_with_label(label) end elsif stock initialize_new_from_stock(stock) elsif icon_name case icon_size when Symbol, String icon_size = IconSize.new(icon_size.to_s) end initialize_new_from_icon_name(icon_name, icon_size) else initialize_raw end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/calendar.rb000066400000000000000000000020531511343406000226000ustar00rootroot00000000000000# Copyright (C) 2015 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 Calendar alias_method :select_month_raw, :select_month def select_month(month, year) select_month_raw(month - 1, year) end alias_method :date_raw, :date def date year, month, day = date_raw [year, month + 1, day] end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/cell-layout.rb000066400000000000000000000021721511343406000232630ustar00rootroot00000000000000# Copyright (C) 2015 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 module CellLayout def set_attributes(cell, attributes) attributes.each do |key, value| add_attribute(cell, key, value) end end alias_method :add_attribute_raw, :add_attribute def add_attribute(cell, name, value) name = name.to_s if name.is_a?(Symbol) add_attribute_raw(cell, name, value) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/check-menu-item.rb000066400000000000000000000021711511343406000240030ustar00rootroot00000000000000# Copyright (C) 2015 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 CheckMenuItem alias_method :initialize_raw, :initialize def initialize(options={}) label = options[:label] if label if options[:use_underline] initialize_new_with_mnemonic(label) else initialize_new_with_label(label) end else initialize_raw end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/clipboard.rb000066400000000000000000000017051511343406000227710ustar00rootroot00000000000000# Copyright (C) 2015 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 Clipboard alias_method :set_text_raw, :set_text def set_text(text) set_text_raw(text, text.bytesize) end alias_method :text=, :set_text end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/color-chooser-dialog.rb000066400000000000000000000017621511343406000250500ustar00rootroot00000000000000# Copyright (C) 2015 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 ColorChooserDialog alias_method :initialize_raw, :initialize def initialize(options={}) title = options[:title] parent = options[:parent] initialize_raw(title, parent) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/combo-box-text.rb000066400000000000000000000020051511343406000236730ustar00rootroot00000000000000# Copyright (C) 2015 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 ComboBoxText alias_method :initialize_raw, :initialize def initialize(options={}) entry = options[:entry] if entry initialize_new_with_entry else initialize_new end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/combo-box.rb000066400000000000000000000030771511343406000227230ustar00rootroot00000000000000# Copyright (C) 2015 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 ComboBox alias_method :initialize_raw, :initialize def initialize(options={}) entry = options[:entry] model = options[:model] area = options[:area] if entry if model initialize_new_with_model_and_entry(model) elsif area initialize_new_with_area_and_entry(area) else initialize_new_with_entry end else if model initialize_new_with_model(model) elsif area initialize_new_with_area(area) else initialize_new end end end alias_method :active_iter_raw, :active_iter def active_iter found, iter = active_iter_raw if found iter.model = model iter else nil end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/container.rb000066400000000000000000000034001511343406000230060ustar00rootroot00000000000000# Copyright (C) 2014-2015 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 Container alias_method :add_raw, :add def add(child, properties={}) child.freeze_child_notify begin add_raw(child) properties.each do |key, value| child_set_property(child, key, value) end self ensure child.thaw_child_notify end end alias_method :<<, :add def add_child(*args) if args.size == 1 add(*args) else super end end alias_method :remove_child, :remove alias_method :focus_chain_raw, :focus_chain def focus_chain set_explicitly, widgets = focus_chain_raw if set_explicitly widgets else nil end end alias_method :child_get_property_raw, :child_get_property def child_get_property(child, name) property = self.class.find_child_property(name) value = GLib::Value.new(property.value_type) child_get_property_raw(child, name, value) value.value end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/css-provider.rb000066400000000000000000000030351511343406000234500ustar00rootroot00000000000000# Copyright (C) 2014-2015 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 CssProvider def load(options) data = options[:data] file = options[:file] path = options[:path] resource_path = options[:resource_path] if data load_from_data(data) elsif file load_from_file(file) elsif path load_from_path(path) elsif resource_path load_from_resource(resource_path) else message = "Must specify one of :data, :file, :path or :resource_path" raise ArgumentError, "#{message}: #{options.inspect}" end end alias_method :load_from_data_raw, :load_from_data def load_from_data(data) if data.is_a?(GLib::Bytes) load_from_data_raw(data.to_s) else load_from_data_raw(data) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/deprecated.rb000066400000000000000000001334631511343406000231410ustar00rootroot00000000000000module Gtk extend GLib::Deprecatable define_deprecated_const :Allocation, "Gdk::Rectangle" define_deprecated_const :Combo, :raise => "Use 'Gtk::ComboBoxText' instead." define_deprecated_const :ComboBoxEntry, :raise => "Use 'Gtk::ComboBox' instead." define_deprecated_const :Curve, :raise => "Don't use this widget anymore." define_deprecated_const :FileSelection, :raise => "Use 'Gtk::FileChooserDialog' instead." define_deprecated_const :FontSelection, :raise => "Use 'Gtk::FontChooserWidget' instead." define_deprecated_const :FontSelectionDialog, :raise => "Use 'Gtk::FontChooserDialog' instead." remove_const(:ColorSelection) define_deprecated_const :ColorSelection, :raise => "Use 'Gtk::ColorChooserWidget' instead." remove_const(:ColorSelectionDialog) define_deprecated_const :ColorSelectionDialog, :raise => "Use 'Gtk::ColorChooserDialog' instead." define_deprecated_const :GammaCurve, :raise => "Don't use this widget anymore." define_deprecated_const :HRuler, :raise => "Don't use this widget anymore." define_deprecated_const :InputDialog, :raise => "Don't use this widget anymore." define_deprecated_const :ItemFactory, :raise => "Use 'Gtk::UIManager' instead." define_deprecated_const :OptionMenu, :raise => "Use 'Gtk::ComboBox' instead." define_deprecated_const :PageSetupUnixDialog, :raise => "Use 'Gtk::PrintOperation' instead." define_deprecated_const :Printer, :raise => "Use 'Gtk::PrintOperation' instead." define_deprecated_const :PrintCapabilities, :raise => "Use 'Gtk::PrintOperation' instead." define_deprecated_const :PrintJob, :raise => "Use 'Gtk::PrintOperation' instead." define_deprecated_const :PrintUnixDialog, :raise => "Use 'Gtk::PrintOperation' instead." define_deprecated_const :RC, :raise => "Use 'Gtk::StyleContext' instead." define_deprecated_const :RcStyle, :raise => "Use 'Gtk::CssProvider' instead." define_deprecated_const :Ruler, :raise => "Don't use this widget anymore." define_deprecated_const :Style, :raise => "Use 'Gtk::StyleContext' instead." define_deprecated_const :Tooltips, :raise => "Use 'Gtk::Tooltip' API." define_deprecated_const :VRuler, :raise => "Don't use this widget anymore." define_deprecated_flags :AccelFlags, 'ACCEL' define_deprecated_flags :AttachOptions define_deprecated_enums :CornerType, 'CORNER' define_deprecated_enums :DeleteType, 'DELETE' define_deprecated_enums :DirectionType, 'DIR' define_deprecated_enums :ExpanderStyle, 'EXPANDER' define_deprecated_enums :Justification, 'JUSTIFY' define_deprecated_enums :MovementStep, 'MOVEMENT' define_deprecated_enums :Orientation, 'ORIENTATION' define_deprecated_enums :PackType, 'PACK' define_deprecated_enums :PathPriorityType, 'PATH_PRIO' define_deprecated_enums :PathType, 'PATH' define_deprecated_enums :PolicyType, 'POLICY' define_deprecated_enums :PositionType, 'POS' define_deprecated_enums :ReliefStyle, 'RELIEF' define_deprecated_enums :ResizeMode, 'RESIZE' define_deprecated_enums :ScrollStep, 'SCROLL' define_deprecated_enums :ScrollType, 'SCROLL' define_deprecated_enums :SelectionMode, 'SELECTION' define_deprecated_enums :ShadowType, 'SHADOW' define_deprecated_enums :StateType, 'STATE' define_deprecated_enums :SortType, 'SORT' define_deprecated_const :AnchorType define_deprecated_const :ANCHOR_CENTER define_deprecated_const :ANCHOR_NORTH define_deprecated_const :ANCHOR_NORTH_WEST define_deprecated_const :ANCHOR_NORTH_EAST define_deprecated_const :ANCHOR_SOUTH define_deprecated_const :ANCHOR_SOUTH_WEST define_deprecated_const :ANCHOR_SOUTH_EAST define_deprecated_const :ANCHOR_WEST define_deprecated_const :ANCHOR_EAST define_deprecated_const :ANCHOR_N define_deprecated_const :ANCHOR_NW define_deprecated_const :ANCHOR_NE define_deprecated_const :ANCHOR_S define_deprecated_const :ANCHOR_SW define_deprecated_const :ANCHOR_SE define_deprecated_const :ANCHOR_W define_deprecated_const :ANCHOR_E define_deprecated_const :UpdateType define_deprecated_const :UPDATE_CONTINUOUS define_deprecated_const :UPDATE_DISCONTINUOUS define_deprecated_const :UPDATE_DELAYED define_deprecated_singleton_method :init_add, :warn => "Don't use this method." define_deprecated_singleton_method :quit_add, :warn => "Don't use this method." define_deprecated_singleton_method :quit_remove, :warn => "Don't use this method." define_deprecated_singleton_method :get_event_widget, :warn => "Use 'Gdk::Event#widget'." do |_self, event| event && event.widget end define_deprecated_singleton_method :timeout_add, :warn => "Use 'GLib::Timeout.add'." do |_self, interval, &block| GLib::Timeout.add(interval, &block) end define_deprecated_singleton_method :timeout_remove, :warn => "Use 'GLib::Source.remove'." do |_self, id| GLib::Source.remove(id) end define_deprecated_singleton_method :idle_add, :warn => "Use 'GLib::Idle.add'." do |_self, &block| GLib::Idle.add(&block) end define_deprecated_singleton_method :idle_add_priority, :warn => "Use 'GLib::Idle.add'." do |_self, priority, &block| GLib::Idle.add(priority, &block) end define_deprecated_singleton_method :idle_remove, :warn => "Use 'GLib::Source.remove'." do |_self, id| GLib::Source.remove(id) end define_deprecated_singleton_method :grab_add, :warn => "Use 'Gtk::Widget#grab_add'." do |_self, widget| widget.grab_add end define_deprecated_singleton_method :grab_remove, :warn => "Use 'Gtk::Widget#grab_remove'." do |_self, widget| widget.grab_remove end class AboutDialog extend GLib::Deprecatable define_deprecated_singleton_method :set_email_hook, :warn => "Use 'activate-link' signal." define_deprecated_singleton_method :set_url_hook, :warn => "Use 'activate-link' signal." end class Action extend GLib::Deprecatable define_deprecated_method :connect_proxy, :warn => "Use 'Gtk::Activatable#set_related_action'." define_deprecated_method :disconnect_proxy, :warn => "Use 'Gtk::Activatable#set_related_action'." define_deprecated_method :block_activate_from, :warn => "Don't use this method." define_deprecated_method :unblock_activate_from, :warn => "Don't use this method." define_deprecated_method_by_hash_args :initialize, 'name, label, tooltip = nil, stock_id = nil', 'name, :label => nil, :tooltip => nil, :stock_id => nil', 1 do |_self, name, label, tooltip, stock_id| [name, {:label => label, :tooltip => tooltip, :stock_id => stock_id}] end end class Alignment extend GLib::Deprecatable define_deprecated_const :Align, "Gtk::Align" end class Arrow extend GLib::Deprecatable define_deprecated_enums :Type end class Assistant extend GLib::Deprecatable define_deprecated_const :PageType, "Gtk::AssistantPageType" define_deprecated_enums :AssistantPageType, 'PAGE' define_deprecated_method :set_page_header_image, :warn => "Don't use this method." define_deprecated_method :get_page_header_image, :warn => "Don't use this method." define_deprecated_method :set_page_side_image, :warn => "Don't use this method." define_deprecated_method :get_page_side_image, :warn => "Don't use this method." end class BindingSet extend GLib::Deprecatable define_deprecated_method :entry_clear, :remove define_deprecated_method :entry_skip, :skip define_deprecated_method :entry_add_signal, :add_signal define_deprecated_method :add_path, :raise => "Don't use this method." end class Box extend GLib::Deprecatable define_deprecated_method :pack_start_defaults, :pack_start define_deprecated_method :pack_end_defaults, :pack_end define_deprecated_method_by_hash_args :pack_start, 'child, expand = true, fill = true, padding = 0', 'child, :expand => true, :fill => true, :padding => 0', 1 do |_self, child, expand, fill, padding| [child, {:expand => expand, :fill => fill, :padding => padding}] end define_deprecated_method_by_hash_args :pack_end, 'child, expand = true, fill = true, padding = 0', 'child, :expand => true, :fill => true, :padding => 0', 1 do |_self, child, expand, fill, padding| [child, {:expand => expand, :fill => fill, :padding => padding}] end define_deprecated_method_by_hash_args :set_child_packing, 'child, expand, fill, padding, pack_type', 'child, :expand => nil, :fill => nil, :padding => nil, :pack_type => nil', 1 do |_self, child, expand, fill, padding, pack_type| [child, {:expand => expand, :fill => fill, :padding => padding, :pack_type => pack_type}] end end class Button extend GLib::Deprecatable define_deprecated_method :enter, :warn => "Don't use this method." define_deprecated_method :leave, :warn => "Don't use this method." define_deprecated_method :pressed, :warn => "Don't use this method." define_deprecated_method :released, :warn => "Don't use this method." define_deprecated_signal :enter, :warn => "Use 'Gtk::Widget::enter-notify-event' signal." define_deprecated_signal :leave, :warn => "Use 'Gtk::Widget::leave-notify-event' signal." define_deprecated_signal :pressed, :warn => "Use 'Gtk::Widget::button-press-event' signal." define_deprecated_signal :released, :warn => "Use 'Gtk::Widget::button-release-event' signal." define_deprecated_method_by_hash_args :initialize, 'label_or_stock_id, use_underline = nil', ':label => nil, :use_underline => nil, :stock_id => nil' do |_self, label_or_stock_id, use_underline| case label_or_stock_id when String [{:label => label_or_stock_id, :use_underline => use_underline}] when Symbol [{:stock_id => label_or_stock_id}] else [label_or_stock_id] end end end class ButtonBox extend GLib::Deprecatable define_deprecated_const :Style, "Gtk::ButtonBoxStyle" define_deprecated_enums "Gtk::ButtonBoxStyle", "STYLE" end class Calendar extend GLib::Deprecatable define_deprecated_flags "Gtk::CalendarDisplayOptions" define_deprecated_method :freeze, :warn => "Don't use this method." define_deprecated_method :thaw, :warn => "Don't use this method." end class CellRenderer extend GLib::Deprecatable define_deprecated_const :Mode, "Gtk::CellRendererMode" define_deprecated_enums :CellRendererMode, 'MODE' define_deprecated_const :State, "Gtk::CellRendererState" define_deprecated_flags :CellRendererState define_deprecated_method :editing_canceled, :warn => "Use '#{self}#stop_editing'." do |_self| _self.stop_editing(true) end define_deprecated_method :get_size, :raise => "Use Gtk::CellRenderer#get_preferred_size." end class CellRendererAccel extend GLib::Deprecatable define_deprecated_const :Mode, "Gtk::CellRendererAccelMode" define_deprecated_enums :CellRendererAccelMode, 'MODE' end class CellView extend GLib::Deprecatable define_deprecated_method :cell_renderers, :warn => "Use 'Gtk::CellLayout#cells'." do |_self| _self.cells end define_deprecated_method :get_size_of_row, :raise => "Use Gtk::Widget#get_preferred_size." end class CheckMenuItem extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, "label, use_underline=false", ":label => label, :use_underline => use_underline" do |_self, label, use_underline| [{:label => label, :use_underline => use_underline}] end end class ComboBox extend GLib::Deprecatable define_deprecated_method :append_text, :raise => "Use 'Gtk::ComboBoxText#append_text'." define_deprecated_method :insert_text, :raise => "Use 'Gtk::ComboBoxText#insert_text'." define_deprecated_method :prepend_text, :raise => "Use 'Gtk::ComboBoxText#prepend_text'." define_deprecated_method :remove_text, :raise => "Use 'Gtk::ComboBoxText#remove'." define_deprecated_method :active_text, :raise => "Use 'Gtk::ComboBoxText#active_text'." define_deprecated_method_by_hash_args :initialize, 'model', ':entry => false, :model => nil, :area => nil' do |_self, model| case model when TreeModel [{:model => model}] when true, false raise GLib::DeprecatedError.new("#{caller[0]}: '#{self}#initialize(is_text_only)' style has been deprecated. Use 'Gtk::ComboBoxText'.") end end end class Container extend GLib::Deprecatable define_deprecated_singleton_method :child_property, :find_child_property define_deprecated_method :each_forall, :each_all end class Dialog extend GLib::Deprecatable define_deprecated_const :Flags, "Gtk::DialogFlags" define_deprecated_flags :DialogFlags define_deprecated_const :ResponseType, 'Gtk::ResponseType' define_deprecated_enums 'Gtk::ResponseType', 'RESPONSE' define_deprecated_method :vbox, :child define_deprecated_method_by_hash_args :initialize, 'title, parent, flags, *buttons', ':title => nil, :parent => nil, :flags => 0, :buttons => nil' do |_self, title, parent, flags, *buttons| [{:title => title, :parent => parent, :flags => flags, :buttons => buttons}] end end module Drag extend GLib::Deprecatable define_deprecated_const :DestDefaults, "Gtk::DestDefaults" define_deprecated_const :TargetFlags, "Gtk::TargetFlags" define_deprecated_singleton_method :finish, :warn => "Use 'Gdk::DragContext#finish'." do |_self, context, success, del, time| context.finish(:success => success, :delete => delete, :time => time) end define_deprecated_singleton_method :set_icon_default, :warn => "Use 'Gdk::DragContext#set_icon_default'." do |_self, context| context.set_icon_default end define_deprecated_singleton_method :set_icon_name, :warn => "Use 'Gdk::DragContext#set_icon'." do |_self, context, name, hot_x, hot_y| context.set_icon(:name => name, :hot_x => hot_x, :hot_y => hot_y) end define_deprecated_singleton_method :set_icon, :warn => "Use 'Gdk::DragContext#set_icon'." do |_self, context, icon, hot_x, hot_y| case icon when Symbol context.set_icon(:stock_id => icon, :hot_x => hot_x, :hot_y => hot_y) 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) end end define_deprecated_singleton_method :dest_set, :warn => "Use 'Gtk::Widget#drag_dest_set'." do |_self, widget, flags, targets, actions| widget.drag_dest_set(flags, targets, actions) end define_deprecated_singleton_method :dest_set_proxy, :warn => "Use 'Gtk::Widget#drag_dest_set_proxy'." do |_self, widget, proxy_window, protocol, use_coordinates| widget.drag_dest_set_proxy(proxy_window, protocol, use_coordinates) end define_deprecated_singleton_method :dest_unset, :warn => "Use 'Gtk::Widget#drag_dest_unset'." do |_self, widget| widget.drag_dest_unset end define_deprecated_singleton_method :dest_find_target, :warn => "Use 'Gtk::Widget#drag_dest_find_target'." do |_self, widget, context, target_list| widget.drag_dest_find_target(context, target_list) end define_deprecated_singleton_method :dest_get_target_list, :warn => "Use 'Gtk::Widget#drag_dest_get_target_list'." do |_self, widget| widget.drag_dest_get_target_list end define_deprecated_singleton_method :dest_set_target_list, :warn => "Use 'Gtk::Widget#drag_dest_set_target_list'." do |_self, widget, target_list| widget.drag_dest_set_target_list(target_list) end define_deprecated_singleton_method :dest_add_text_targets, :warn => "Use 'Gtk::Widget#drag_dest_add_text_targets'." do |_self, widget| widget.drag_dest_add_text_targets end define_deprecated_singleton_method :dest_add_image_targets, :warn => "Use 'Gtk::Widget#drag_dest_add_image_targets'." do |_self, widget| widget.drag_dest_add_image_targets end define_deprecated_singleton_method :dest_add_uri_targets, :warn => "Use 'Gtk::Widget#drag_dest_add_uri_targets'." do |_self, widget| widget.drag_dest_add_uri_targets end define_deprecated_singleton_method :dest_set_track_motion, :warn => "Use 'Gtk::Widget#drag_dest_set_track_motion'." do |_self, widget, track_motion| widget.drag_dest_set_track_motion(track_motion) end define_deprecated_singleton_method :dest_get_track_motion, :warn => "Use 'Gtk::Widget#drag_dest_get_track_motion'." do |_self, widget| widget.drag_dest_get_track_motion end define_deprecated_singleton_method :get_data, :warn => "Use 'Gtk::Widget#drag_get_data'." do |_self, widget, context, target, time| widget.drag_get_data(context, target, time) end define_deprecated_singleton_method :highlight, :warn => "Use 'Gtk::Widget#drag_highlight'." do |_self, widget| widget.drag_highlight end define_deprecated_singleton_method :unhighlight, :warn => "Use 'Gtk::Widget#drag_unhighlight'." do |_self, widget| widget.drag_unhighlight end define_deprecated_singleton_method :begin, :warn => "Use 'Gtk::Widget#drag_begin'." do |_self, widget, target_list, actions, button, event| widget.drag_begin(target_list, actions, button, event) end define_deprecated_singleton_method :threshold?, :warn => "Use 'Gtk::Widget#drag_threshold?'." do |_self, widget, start_x, start_y, current_x, current_y| widget.drag_threshold?(start_x, start_y, current_x, current_y) end define_deprecated_singleton_method :source_set, :warn => "Use 'Gtk::Widget#drag_source_set'." do |_self, widget, start_button_mask, targets, actions| widget.drag_source_set(start_button_mask, targets, actions) end define_deprecated_singleton_method :source_set_icon, :warn => "Use 'Gtk::Widget#drag_source_set_icon(:stock_id => nil, :pixbuf => nil)'." do |_self, widget, icon| case icon when Symbol widget.drag_source_set_icon(:stock_id => icon) else widget.drag_source_set_icon(:pixbuf => icon) end end define_deprecated_singleton_method :source_set_icon_name, :warn => "Use 'Gtk::Widget#drag_source_set_icon(:icon_name => nil)'." do |_self, widget, icon| widget.drag_source_set_icon(:icon_name => icon) end define_deprecated_singleton_method :source_unset, :warn => "Use 'Gtk::Widget#drag_source_unset'." do |_self, widget| widget.drag_source_unset end define_deprecated_singleton_method :source_set_target_list, :warn => "Use 'Gtk::Widget#drag_source_set_target_list'." do |_self, widget, target_list| widget.drag_source_set_target_list(target_list) end define_deprecated_singleton_method :source_get_target_list, :warn => "Use 'Gtk::Widget#drag_source_get_target_list'." do |_self, widget| widget.drag_source_get_target_list end define_deprecated_singleton_method :source_add_text_targets, :warn => "Use 'Gtk::Widget#drag_source_add_text_targets'." do |_self, widget| widget.drag_source_add_text_targets end define_deprecated_singleton_method :source_add_image_targets, :warn => "Use 'Gtk::Widget#drag_source_add_image_targets'." do |_self, widget| widget.drag_source_add_image_targets end define_deprecated_singleton_method :source_add_uri_targets, :warn => "Use 'Gtk::Widget#drag_source_add_uri_targets'." do |_self, widget| widget.drag_source_add_uri_targets end end module FileChooser extend GLib::Deprecatable define_deprecated_const :Action, "Gtk::FileChooserAction" define_deprecated_enums :FileChooserAction, 'ACTION' define_deprecated_const :Confirmation, "Gtk::FileChooserConfirmation" define_deprecated_enums :FileChooserConfirmation, 'CONFIRMATION' end class FileChooserDialog extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'title, parent, action, back, *buttons', ':title => nil, :parent => nil, :action => :open, :buttons => nil' do |_self, title, parent, action, back, *buttons| options = { :title => title, :parent => parent, :action => action, :buttons => buttons, } [options] end end class FileFilter extend GLib::Deprecatable define_deprecated_const :Flags, "Gtk::FileFilterFlags" define_deprecated_flags :FileFilterFlags end class HBox extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Box.new(:horizontal, spacing)'." do |_self, homogeneous, spacing| box = Gtk::Box.new(:horizontal, spacing) box.set_homogeneous(homogeneous) box end end class HButtonBox extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::ButtonBox.new(:horizontal)'." do |_self| Gtk::ButtonBox.new(:horizontal) end end class HPaned extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Paned.new(:horizontal)'." do |_self| Gtk::Paned.new(:horizontal) end end class HScale extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Scale.new(:horizontal, *args)'." do |_self, *args| Gtk::Scale.new(:horizontal, *args) end end class HScrollbar extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Scrollbar.new(:horizontal, adjustment)'." do |_self, adjustment| Gtk::Scrollbar.new(:horizontal, adjustment) end end class HSeparator extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Separator.new(:horizontal)'." do |_self| Gtk::Separator.new(:horizontal) end end class IconSet extend GLib::Deprecatable define_deprecated_method :render_icon, :raise => "Use '#{self}#render_icon_pixbuf'." end class IconSize extend GLib::Deprecatable define_deprecated_const :IconSize, "Gtk::IconSize" end class IconTheme extend GLib::Deprecatable define_deprecated_const :LookupFlags, "Gtk::IconLookupFlags" define_deprecated_flags :IconLookupFlags, 'LOOKUP' end class IconView extend GLib::Deprecatable define_deprecated_enums :IconViewDropPosition end class Image extend GLib::Deprecatable define_deprecated_const :Type, "Gtk::ImageType" define_deprecated_enums :ImageType define_deprecated_method :set, :warn => "Use '#{self}#set_stock', '#{self}#set_icon_name', '#{self}#set_icon_set', '#{self}#set_file', '#{self}#set_pixbuf' or '#{self}#set_pixbuf_animation'." define_deprecated_method_by_hash_args :initialize, 'image, size = nil', ':stock => nil, :icon_name => nil, :icon_set => nil, :icon => nil, :file => nil, :pixbuf => nil, :animation => nil, :surface => nil, :size => nil' do |_self, image, size| case image when String if size [{:icon_name => image, :size => size}] else [{:file => image}] end when Symbol [{:stock => image, :size => size}] when GdkPixbuf::Pixbuf [{:pixbuf => image}] when Gtk::IconSet [{:icon_set => image, :size => size}] when Gio::Icon [{:icon => image, :size => size}] else message = "Image must be String, Symbol, GdkPixbuf::Pixbuf, Gtk::IconSet or " + "Gio::Icon: #{image.inspect}" raise ArgumentError, message end end end class ImageMenuItem extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'label_or_stock_id = nil, use_underline_or_accel_group = nil', ':label => nil, :mnemonic => nil, :stock_id => nil, :accel_group => nil' do |_self, label_or_stock_id, use_underline_or_accel_group| case label_or_stock_id when String if use_underline_or_accel_group [{:mnemonic => label_or_stock_id}] else [{:label => label_or_stock_id}] end when Symbol [{:stock_id => label_or_stock_id, :accel_group => use_underline_or_accel_group}] end end end class LinkButton extend GLib::Deprecatable define_deprecated_singleton_method :set_uri_hook, :warn => "Use 'clicked' signal." end class MenuBar extend GLib::Deprecatable define_deprecated_enums :PackDirection, 'PACK_DIRECTION' end class MenuItem extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, "label, use_underline=false", ":label => label, :use_underline => use_underline" do |_self, label, use_underline| [{:label => label, :use_underline => use_underline}] end define_deprecated_method :remove_submenu, :warn => "Use '#{self}#set_submenu'." do |_self| _self.set_submenu(nil) end end class MenuShell extend GLib::Deprecatable define_deprecated_enums :DirectionType, 'DIR' end class MenuToolButton extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'icon_widget_or_stock_id = nil, label = nil', ':icon_widget => nil, :label => nil, :stock_id => nil' do |_self, icon_widget_or_stock_id, label| case icon_widget_or_stock_id when String, Symbol [{:stock_id => icon_widget_or_stock_id}] when Gtk::Widget [{:icon_widget => icon_widget_or_stock_id, :label => label}] end end end class MessageDialog extend GLib::Deprecatable define_deprecated_const :ButtonsType, "Gtk::ButtonsType" define_deprecated_enums "Gtk::ButtonsType", "BUTTONS" define_deprecated_const :Type, 'Gtk::MessageType' define_deprecated_enums 'Gtk::MessageType' define_deprecated_method_by_hash_args :initialize, 'parent, flags, type, buttons_type, message', ':parent => nil, :flags => 0, :type => :info, :buttons => :ok, :message => ""' do |_self, parent, flags, type, buttons, message| [{:parent => parent, :flags => flags, :type => type, :buttons => buttons, :message => message}] end end class Notebook extend GLib::Deprecatable define_deprecated_singleton_method :set_window_creation_hook, :warn => "Use 'create-window' signal." define_deprecated_method :query_tab_label_packing, :warn => "Use 'tab-expand' and 'tab-fill' child property." do |_self, child| [_self.child_get_property(child, 'tab-expand'), _self.child_get_property(child, 'tab-fill')] end define_deprecated_method :set_tab_label_packing, :warn => "Use 'tab-expand' and 'tab-fill' child property." do |_self, child, expand, fill, pack_type| _self.child_set_property(child, 'tab-expand', expand) _self.child_set_property(child, 'tab-fill', fill) end end class PaperSize extend GLib::Deprecatable define_deprecated_enums :Unit, 'UNIT' end class PrintOperation extend GLib::Deprecatable define_deprecated_const :Action, "Gtk::PrintOperationAction" define_deprecated_enums :PrintOperationAction, 'ACTION' define_deprecated_const :Result, "Gtk::PrintOperationResult" define_deprecated_enums :PrintOperationResult, 'RESULT' define_deprecated_const :Status, "Gtk::PrintStatus" define_deprecated_enums :PrintStatus, 'STATUS' end class PrintSettings extend GLib::Deprecatable define_deprecated_enums :PageOrientation, 'ORIENTATION' define_deprecated_enums :PageSet, 'PAGE_SET' define_deprecated_enums :PrintDuplex, 'DUPLEX' define_deprecated_enums :PrintPages, 'PAGES' define_deprecated_enums :PrintQuality, 'QUALITY' end class Paned extend GLib::Deprecatable %w(child1 child2).product(%w(resize shrink)).each do |child, prop| define_deprecated_method "#{child}_#{prop}?", :warn => "Use '#{prop}' child property." do |_self| _self.child_get_property(_self.send(child), prop) end end define_deprecated_method_by_hash_args :pack1, 'child, resize, shrink', 'child, :resize => false, :shrink => true', 1 do |_self, child, resize, shrink| [child, {:resize => resize, :shrink => shrink}] end define_deprecated_method_by_hash_args :pack2, 'child, resize, shrink', 'child, :resize => true, :shrink => true', 1 do |_self, child, resize, shrink| [child, {:resize => resize, :shrink => shrink}] end end class RadioAction extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'name, label, tooltip, stock_id, value', 'name, value, :label => nil, :tooltip => nil, :stock_id => nil', 2 do |_self, name, label, tooltip, stock_id, value| [name, value, {:label => label, :tooltip => tooltip, :stock_id => stock_id}] end end class RadioButton extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'member_or_label, label_or_use_underline, use_underline', ':label => label, :member => member, :use_underline => use_underline', 0 do |_self, member_or_label, label_or_use_underline, use_underline| options = {} if member_or_label.is_a?(Gtk::RadioButton) options[:member] = member_or_label if label_or_use_underline.is_a?(String) options[:label] = label_or_use_underline options[:use_underline] = use_underline end else options[:label] = member_or_label options[:use_underline] = label_or_use_underline end [options] end end class Range extend GLib::Deprecatable define_deprecated_enums :SensitivityType, 'SENSITIVITY' define_deprecated_method :update_policy, :raise => "Don't use this method." define_deprecated_method :set_update_policy, :warn => "Don't use this method." alias :update_policy= :set_update_policy end class RecentAction extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'name, label, tooltip = nil, stock_id = nil, manager = nil', 'name, :label => nil, :tooltip => nil, :stock_id => nil, :manager => nil', 1 do |_self, name, label, tooltip, stock_id, manager| [name, {:label => label, :tooltip => tooltip, :stock_id => stock_id, :manager => manager}] end end module RecentChooser extend GLib::Deprecatable define_deprecated_enums :SortType, 'SORT' define_deprecated_method :show_numbers, :warn => "Use 'Gtk::RecentChooserMenu#show_numbers?'." do |_self| false end define_deprecated_method :set_show_numbers, :warn => "Use 'Gtk::RecentChooserMenu#set_show_numbers'." alias :show_numbers= :set_show_numbers end class RecentChooserDialog extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'title, parent, manager, *buttons', ':title => nil, :parent => nil, ' + ':recent_manager => nil, :buttons => nil' do |_self, title, parent, *buttons| if buttons.first.is_a?(RecentManager) recent_manager = buttons.shift else recent_manager = nil end [ { :title => title, :parent => parent, :recent_manager => recent_manager, :buttons => buttons, }, ] end end class RecentFilter extend GLib::Deprecatable define_deprecated_const :Flags, "Gtk::RecentFilterFlags" define_deprecated_flags :RecentFilterFlags end class RecentManager extend GLib::Deprecatable define_deprecated_singleton_method :get_for_screen, :warn => "Use '#{self}.default'." do |_self, screen| _self.default end define_deprecated_method :set_screen, :warn => "Don't use this method." alias :screen= :set_screen end class ProgressBar extend GLib::Deprecatable define_deprecated_method :set_activity_mode, :warn => "Don't use this method." alias :activity_mode= :set_activity_mode define_deprecated_method :activity_mode?, :warn => "Don't use this method." do |_self| false end define_deprecated_method :set_text_xalign, :warn => "Don't use this method." alias :text_xalign= :set_text_xalign define_deprecated_method :text_xalign, :warn => "Don't use this method." do |_self| 0.0 end define_deprecated_method :set_text_yalign, :warn => "Don't use this method." alias :text_yalign= :set_text_yalign define_deprecated_method :text_yalign, :warn => "Don't use this method." do |_self| 0.0 end end class SelectionData extend GLib::Deprecatable define_deprecated_method :type, :data_type end class SizeGroup extend GLib::Deprecatable define_deprecated_const :Mode, "Gtk::SizeGroupMode" define_deprecated_enums :SizeGroupMode end class SpinButton extend GLib::Deprecatable define_deprecated_const :Type, "Gtk::SpinType" define_deprecated_enums :SpinType define_deprecated_const :UpdatePolicy, "Gtk::SpinButtonUpdatePolicy" define_deprecated_enums :SpinButtonUpdatePolicy, 'UPDATE' end class TextAttributes extend GLib::Deprecatable define_deprecated_method :realized?, :warn => "Don't use this method." do |_self| false end define_deprecated_method :set_realized, :warn => "Don't use this method." alias :realized= :set_realized end class TextBuffer extend GLib::Deprecatable define_deprecated_method :get_iter_at_line, :warn => "Use '#{self}#get_iter_at(:line => nil)'." do |_self, line| _self.get_iter_at(:line => line) end define_deprecated_method :get_iter_at_line_offset, :warn => "Use '#{self}#get_iter_at(:line => nil, :offset => nil)'." do |_self, line, offset| _self.get_iter_at(:line => line, :offset => offset) end define_deprecated_method :get_iter_at_line_index, :warn => "Use '#{self}#get_iter_at(:line => nil, :index => nil)'." do |_self, line, index| _self.get_iter_at(:line => line, :index => index) end define_deprecated_method :get_iter_at_offset, :warn => "Use '#{self}#get_iter_at(:offset => nil)'." do |_self, offset| _self.get_iter_at(:offset => offset) end define_deprecated_method :get_iter_at_mark, :warn => "Use '#{self}#get_iter_at(:mark => nil)'." do |_self, mark| _self.get_iter_at(:mark => mark) end define_deprecated_method :get_iter_at_child_anchor, :warn => "Use '#{self}#get_iter_at(:anchor => nil)'." do |_self, anchor| _self.get_iter_at(:anchor => anchor) end define_deprecated_method :insert_pixbuf, :insert define_deprecated_method :insert_child_anchor, :insert define_deprecated_method :insert_with_tags, :insert end class TextIter extend GLib::Deprecatable define_deprecated_const :SearchFlags, "Gtk::TextSearchFlags" define_deprecated_flags :TextSearchFlags, 'SEARCH' define_deprecated_method :backword_visible_word_start, :backward_visible_word_start end class TextTag extend GLib::Deprecatable define_deprecated_const :WrapMode, "Gtk::WrapMode" define_deprecated_enums "Gtk::WrapMode", "WRAP" end class TextView extend GLib::Deprecatable define_deprecated_enums :WindowType, 'WINDOW' end class ToggleAction extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'name, label, tooltip = nil, stock_id = nil', 'name, :label => nil, :tooltip => nil, :stock_id => nil', 1 do |_self, name, label, tooltip, stock_id| [name, {:label => label, :tooltip => tooltip, :stock_id => stock_id}] end end class ToggleButton extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'label=nil, use_underline=nil', ':label => label, :use_underline => use_underline', 0 do |_self, label, use_underline| [{:label => label, :use_underline => use_underline}] end end class Toolbar extend GLib::Deprecatable define_deprecated_const :Style, "Gtk::ToolbarStyle" define_deprecated_method :append, :warn => "Don't use this method." define_deprecated_method :prepend, :warn => "Don't use this method." define_deprecated_method :item_index, :get_item_index define_deprecated_method :nth_item, :get_nth_item define_deprecated_method :drop_index, :get_drop_index define_deprecated_method :append_space, :warn => "Don't use this method." define_deprecated_method :prepend_space, :warn => "Don't use this method." define_deprecated_method :insert_space, :warn => "Don't use this method." define_deprecated_method :remove_space, :warn => "Don't use this method." end class ToolButton extend GLib::Deprecatable define_deprecated_method_by_hash_args :initialize, 'icon_widget_or_stock_id = nil, label = nil', ':icon_widget => nil, :label => nil, :stock_id => nil' do |_self, icon_widget_or_stock_id, label| case icon_widget_or_stock_id when String, Symbol [{:stock_id => icon_widget_or_stock_id}] when Gtk::Widget [{:icon_widget => icon_widget_or_stock_id, :label => label}] end end end class Tooltip extend GLib::Deprecatable define_deprecated_method :set_icon_from_stock, :warn => "Use '#{self}#set_icon'." do |_self, stock_id, size| _self.set_icon(:stock_id => stock_id, :size => size) end end module TreeModel extend GLib::Deprecatable define_deprecated_const :Flags, "Gtk::TreeModelFlags" define_deprecated_flags :TreeModelFlags end class TreeSelection extend GLib::Deprecatable define_deprecated_method :selected_each, :each end class TreeView extend GLib::Deprecatable define_deprecated_const :DropPosition, "Gtk::TreeViewDropPosition" define_deprecated_enums :TreeViewDropPosition, 'DROP' define_deprecated_const :GridLines, "Gtk::TreeViewGridLines" define_deprecated_enums :TreeViewGridLines, 'GRID_LINES' define_deprecated_method :widget_to_tree_coords, :convert_widget_to_bin_window_coords define_deprecated_method :tree_to_widget_coords, :convert_bin_window_to_widget_coords end class TreeViewColumn extend GLib::Deprecatable define_deprecated_const :Sizing, "Gtk::TreeViewColumnSizing" define_deprecated_enums :TreeViewColumnSizing define_deprecated_method :cell_renderers, :warn => "Use 'Gtk::CellLayout#cells'." do |_self| _self.cells end end class UIManager extend GLib::Deprecatable define_deprecated_const :ItemType, "Gtk::UIManagerItemType" define_deprecated_flags :UIManagerItemType end class VBox extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Box.new(:vertical, spacing)'." do |_self, homogeneous, spacing| box = Gtk::Box.new(:vertical, spacing) box.set_homogeneous(homogeneous) box end end class VButtonBox extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::ButtonBox.new(:vertical)'." do |_self| Gtk::ButtonBox.new(:vertical) end end class VPaned extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Paned.new(:vertical)'." do |_self| Gtk::Paned.new(:vertical) end end class VScale extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Scale.new(:vertical, *args)'." do |_self, *args| Gtk::Scale.new(:vertical, *args) end end class VScrollbar extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Scrollbar.new(:vertical, adjustment)'." do |_self, adjustment| Gtk::Scrollbar.new(:vertical, adjustment) end end class VSeparator extend GLib::Deprecatable define_deprecated_singleton_method :new, :warn => "Use 'Gtk::Separator.new(:vertical)'." do |_self| Gtk::Separator.new(:vertical) end end class Widget extend GLib::Deprecatable define_deprecated_const :Align, "Gtk::Align" define_deprecated_const :HelpType, "Gtk::WidgetHelpType" define_deprecated_enums :WidgetHelpType, 'HELP' define_deprecated_const :TextDirection, "Gtk::TextDIrection" define_deprecated_enums "Gtk::TextDirection", 'TEXT_DIR' define_deprecated_singleton_method :push_colormap, :warn => "Don't use this method." define_deprecated_singleton_method :pop_colormap, :warn => "Don't use this method." define_deprecated_singleton_method :set_default_colormap, :warn => "Don't use this method." class << self alias :default_colormap= :set_default_colormap end define_deprecated_singleton_method :default_colormap, :raise => "Don't use this method." define_deprecated_singleton_method :default_visual, :raise => "Don't use this method." define_deprecated_singleton_method :default_style, :raise => "Use 'Gtk::StyleContext' and 'Gtk::CssProvider'." define_deprecated_const :Flags, :raise => "Don't use this flags anymore." define_deprecated_method :flags, :raise => "Use the proper method." define_deprecated_method :set_flags, :warn => "Use the proper method." alias :flags= :set_flags define_deprecated_method :unset_flags, :warn => "Use the proper method." define_deprecated_method :get_size_request, :size_request define_deprecated_method :no_window?, :warn => "Use '#{self}#has_window?'." do |_self| !_self.has_window? end define_deprecated_method :rc_style?, :has_rc_style? define_deprecated_method :parent_sensitive?, :warn => "Use '#{self}#sensitive?' on the parent widget." do |_self| _self.parent.sensitive? end define_deprecated_method :hide_all, :hide define_deprecated_method :colormap, :raise => "Use '#{self}#visual'." define_deprecated_method :set_colormap, :warn => "Use '#{self}#set_visual'." alias :colormap= :set_colormap define_deprecated_method :shape_combine_mask, :warn => "Use '#{self}#shape_combine_region' instead." define_deprecated_method :input_shape_combine_mask, :warn => "Use '#{self}#input_shape_combine_region' instead." define_deprecated_method :reset_shapes, :warn => "Don't use this method." define_deprecated_method :set_scroll_adjustments, :warn => "Use 'Gtk::Scrollable#set_hadjustment' and 'Gtk::Scrollable#set_vadjustment'." do |_self, hadj, vadj| _self.set_hadjustment(hadj) _self.set_vadjustment(vadj) true end alias :set_scroll_adjustment :set_scroll_adjustments define_deprecated_method :action, :warn => "Use 'Gtk::Activatable#related_action'." do |_self| _self.related_action end define_deprecated_method :child_requisition, :warn => "Use '#{self}#preferred_size'." do |_self| _self.preferred_size.last end define_deprecated_method :set_state, :warn => "Use '#{self}#set_state_flags'." alias :state= :set_state define_deprecated_method :ensure_style, :warn => "Use 'Gtk::StyleContext'." define_deprecated_method :reset_rc_styles, :warn => "Use '#{self}#reset_style'." define_deprecated_method :class_path, :raise => "Use '#{self}#widget_path'." define_deprecated_method :modify_style, :warn => "Use 'Gtk::StyleContext'." define_deprecated_method :modifier_style, :raise => "Use 'Gtk::StyleContext'." define_deprecated_method :modify_fg, :warn => "Use '#{self}#override_color'." define_deprecated_method :modify_bg, :warn => "Use '#{self}#override_background_color'." define_deprecated_method :modify_text, :warn => "Use '#{self}#override_color'." define_deprecated_method :modify_base, :warn => "Use '#{self}#override_background_color'." define_deprecated_method :modify_font, :warn => "Use '#{self}#override_font'." define_deprecated_method :modify_cursor, :warn => "Use '#{self}#override_cursor'." define_deprecated_method :render_icon, :warn => "Use '#{self}#render_icon_pixbuf'." do |_self, stock_id, size, detail| _self.render_icon_pixbuf(stock_id, size) end define_deprecated_method :state, :raise => "Use '#{self}#state_flags'." define_deprecated_method :has_rc_style?, :warn => "Use 'Gtk::StyleContext'." do |_self| false end define_deprecated_method :requisition, :raise => "Don't use this method." define_deprecated_method :set_requisition, :warn => "Don't use this method." define_deprecated_method :saved_state, :raise => "Don't use this method." define_deprecated_method :pointer, :raise => "Use 'Gdk::Window#get_device_position'." alias :__set_allocation__ :set_allocation private :__set_allocation__ def set_allocation(*args) case args.size when 1 __set_allocation__(args.first) when 4 warn "#{caller[0]}: '#{self.class}#set_allocation(x, y, width, height)' style has been deprecated. Use '#{self.class}#set_allocation(alloc)' style." __set_allocation__(Gtk::Allocation.new(*args)) else raise ArgumentError.new("need 1 or 4 arguments.") end end define_deprecated_signal :expose_event, :warn => "Use '#{self}::draw' signal." define_deprecated_signal :state_changed, :warn => "Use '#{self}::state-flags-changed' signal." define_deprecated_signal :style_set, :warn => "Use '#{self}::style-updated' signal." end class Window extend GLib::Deprecatable define_deprecated_const :Position, "Gtk::WindowPosition" define_deprecated_enums "Gtk::WindowPosition", 'POS' define_deprecated_const :Type, "Gtk::WindowType" define_deprecated_enums "Gtk::WindowType" define_deprecated_method :active_focus, :activate_focus define_deprecated_method :active_default, :activate_default end class RecentFilter extend GLib::Deprecatable define_deprecated_const :Flags, 'Gtk::RecentFilterFlags' end end module Gdk class DragContext define_deprecated_method_by_hash_args :finish, 'success, delete, time', ':success => true, :delete => false, :time => Gdk::CURRENT_TIME' do |_self, success, delete, time| [{:success => success, :delete => delete, :time => time}] end end class Event define_deprecated_method :event_widget, :warn => "Use 'Gdk::Event#widget'." do |_self| _self.widget end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/dialog.rb000066400000000000000000000050131511343406000222650ustar00rootroot00000000000000# Copyright (C) 2015-2020 Ruby-GNOME 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 Dialog alias_method :initialize_raw, :initialize def initialize(options={}) initialize_raw title = options[:title] parent = options[:parent] flags = options[:flags] buttons = options[:buttons] set_title(title) if title set_transient_for(parent) if parent if flags unless flags.is_a?(DialogFlags) flags = DialogFlags.new(flags) end set_modal(true) if flags.modal? set_destroy_with_parent(true) if flags.destroy_with_parent? end add_buttons(*buttons) if buttons end alias_method :run_raw, :run def run response_id = run_raw if response_id < 0 ResponseType.new(response_id) else response_id end end def add_buttons(*buttons) buttons.each do |text, response_id| add_button(text, response_id) end end alias_method :add_button_raw, :add_button def add_button(text, response_id) add_button_raw(text, ResponseType.resolve(response_id)) end alias_method :get_widget_for_response_raw, :get_widget_for_response def get_widget_for_response(response_id) get_widget_for_response_raw(ResponseType.resolve(response_id)) end alias_method :set_default_response_raw, :set_default_response def set_default_response(response_id) set_default_response_raw(ResponseType.resolve(response_id)) end alias_method :default_response_raw=, :default_response= alias_method :default_response=, :set_default_response if method_defined?(:use_header_bar) alias_method :use_header_bar_raw, :use_header_bar undef_method :use_header_bar def use_header_bar? use_header_bar_raw != 0 end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/entry-buffer.rb000066400000000000000000000017661511343406000234510ustar00rootroot00000000000000# Copyright (C) 2015 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 EntryBuffer alias_method :initialize_raw, :initialize def initialize(text=nil) if text.nil? initialize_raw(nil, -1) else initialize_raw(text, text.size) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/entry.rb000066400000000000000000000022761511343406000221770ustar00rootroot00000000000000# Copyright (C) 2018 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 Entry # TODO: It's workaround for a GTK+ problem: # It should be removed when GTK+ fix the problem. # https://github.com/ruby-gnome2/ruby-gnome2/issues/1176 alias_method :set_attributes_raw, :set_attributes def set_attributes(attrs) attrs ||= Pango::AttrList.new set_attributes_raw(attrs) end remove_method :attributes= alias_method :attributes=, :set_attributes end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/file-chooser-dialog.rb000066400000000000000000000024421511343406000246450ustar00rootroot00000000000000# Copyright (C) 2015 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 FileChooserDialog alias_method :initialize_raw, :initialize def initialize(options={}) GLib::Object.instance_method(:initialize).bind(self).call Loader.reference_gobject(self, :sink => true) title = options[:title] parent = options[:parent] action = options[:action] || :open buttons = options[:buttons] set_title(title) if title set_action(action) if action set_transient_for(parent) if parent add_buttons(*buttons) if buttons end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/font-chooser-dialog.rb000066400000000000000000000017611511343406000246770ustar00rootroot00000000000000# Copyright (C) 2015 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 FontChooserDialog alias_method :initialize_raw, :initialize def initialize(options={}) title = options[:title] parent = options[:parent] initialize_raw(title, parent) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/gdk-drag-context.rb000066400000000000000000000021531511343406000241720ustar00rootroot00000000000000# Copyright (C) 2015 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 Gdk # Not Gtk! class DragContext alias_method :finish_raw, :finish def finish(options={}) success = options[:success] success = true if success.nil? delete = options[:delete] delete = false if delete.nil? time = options[:time] || Gdk::CURRENT_TIME finish_raw(success, delete, time) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/gdk-screen.rb000066400000000000000000000020621511343406000230510ustar00rootroot00000000000000# Copyright (C) 2019 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 Gdk # Not Gtk! class Screen def add_style_provider(provider, priority=nil) Gtk::StyleContext.add_provider_for_screen(self, provider, priority) end def remove_style_provider(provider) Gtk::StyleContext.remove_provider_for_screen(self, provider) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/gesture-multi-press.rb000066400000000000000000000020321511343406000247640ustar00rootroot00000000000000# Copyright (C) 2015 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 if const_defined?(:GestureMultiPress) class GestureMultiPress alias_method :area_raw, :area def area filled, rectangle = area_raw if filled rectangle else nil end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/icon-size.rb000066400000000000000000000021061511343406000227260ustar00rootroot00000000000000# Copyright (C) 2015 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 IconSize class << self alias_method :lookup_raw, :lookup def lookup(size) size = new(size) unless size.is_a?(self) valid, width, height = lookup_raw(size) if valid [width, height] else nil end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/icon-theme.rb000066400000000000000000000025201511343406000230560ustar00rootroot00000000000000# Copyright (C) 2015 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 IconTheme alias_method :choose_icon_raw, :choose_icon def choose_icon(icon_names, size, flags=nil) icon_names = [icon_names] unless icon_names.is_a?(Array) flags ||= 0 choose_icon_raw(icon_names, size, flags) end alias_method :lookup_icon_raw, :lookup_icon def lookup_icon(icon, size, flags=nil) case icon when String, Symbol flags ||= :generic_fallback lookup_icon_raw(icon.to_s, size, flags) else flags ||= 0 lookup_by_gicon(icon, size, flags) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/icon-view.rb000066400000000000000000000025601511343406000227320ustar00rootroot00000000000000# Copyright (C) 2015 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 IconView alias_method :initialize_raw, :initialize def initialize(options={}) model = options[:model] area = options[:area] if model initialize_new_with_model(model) elsif area initialize_new_with_area(area) else initialize_new end end if method_defined?(:get_cell_rect) alias_method :get_cell_rect_raw, :get_cell_rect def get_cell_rect(path, cell=nil) exist, rect = get_cell_rect_raw(path, cell) if exist rect else nil end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/image-menu-item.rb000066400000000000000000000023401511343406000240060ustar00rootroot00000000000000# Copyright (C) 2015 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 ImageMenuItem alias_method :initialize_raw, :initialize def initialize(options={}) stock = options[:stock] || nil label = options[:label] || nil if stock initialize_new_from_stock(stock) elsif label if options[:use_underline] initialize_new_with_mnemonic(label) else initialize_new_with_label(label) end else initialize_raw end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/image.rb000066400000000000000000000107621511343406000221170ustar00rootroot00000000000000# Copyright (C) 2014-2015 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 Image alias_method :initialize_raw, :initialize # Creates a Gtk::Image. The source of the image depends on the options # given. # # @param Hash{Symbol => Gtk::Stock, String, Gtk::IconSet, Gio::Icon, # GdkPixbuf::Pixbuf, GdkPixbuf::PixbufAnimation, Cairo::Surface, # Fixnum} # # @example Create an empty image. # image = Gtk::Image.new # # @example Create an image from a file. # image = Gtk::Image.new :file => 'path/to/the/image.png' # # @example Create an image from stock. # image = Gtk::Image.new :stock => Gtk::Stock::OPEN, :size => :dialog # # @example Create an image from icon name. # image = Gtk::Image.new :icon_name => 'gtk-open', :size => :dialog # # @example Create an image from a Gio::Icon, that itself is loaded from a # file. # icon = Gio::Icon.new_for_string 'path/to/the/image.png' # image = Gtk::Image.new :icon => icon, :size => :dialog # # @example Create an image from from a Gio::Icon that is an Gio::ThemedIcon. # icon = Gio::ThemedIcon.new 'gtk-open' # image = Gtk::Image.new :icon => icon, :size => :dialog # # @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 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 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 # resource = Gio::Resource.load(a_resource_file) # Gio::Resources.register(resource) # resource_path = "/path/to/image.png" # image = Gtk::Image.new :resource => resource_path # # @example Create an image from a Cairo::Surface that is a # Cairo::ImageSurface. # surface = Cairo::ImageSurface.new :RGB24, 60, 60 # context = Cairo::Context.new surface # context.set_source_rgb 0, 1, 0 # context.rectangle 10, 10, 40, 40 # context.fill.stroke # image = Gtk::Image.new :surface => surface def initialize(options={}) stock = options[:stock] || nil icon_name = options[:icon_name] || nil icon_set = options[:icon_set] || nil icon = options[:icon] || options[:gicon] || nil file = options[:file] || nil pixbuf = options[:pixbuf] || nil animation = options[:animation] || nil resource = options[:resource] ||nil surface = options[:surface] || nil size = options[:size] || nil case size when String, Symbol size = IconSize.new(size) else size ||= IconSize::BUTTON end if stock initialize_new_from_stock(stock, size) elsif icon_name initialize_new_from_icon_name(icon_name, size) elsif icon_set initialize_new_from_icon_set(icon_set, size) elsif icon initialize_new_from_gicon(icon, size) elsif file initialize_new_from_file(file) elsif pixbuf initialize_new_from_pixbuf(pixbuf) elsif animation initialize_new_from_animation(animation) elsif resource initialize_new_from_resource(resource) elsif surface initialize_new_from_surface(surface) else initialize_raw end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/label.rb000066400000000000000000000036561511343406000221200ustar00rootroot00000000000000# Copyright (C) 2014 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 Label alias_method :initialize_raw, :initialize def initialize(text=nil, options={}) if options == true or options == false or options.nil? mnemonic = options warn "Gtk::Label.new(text, mnemonic) style has been deprecated. " + "Use Gtk::Label.new(text, {:use_underline => #{mnemonic}}) style instead." options = { :use_underline => mnemonic, } end if options[:use_underline] initialize_new_with_mnemonic(text) else initialize_raw(text || "") end end private :set_markup_with_mnemonic alias_method :set_markup_raw, :set_markup def set_markup(text, options={}) if options == true or options == false or options.nil? mnemonic = options warn "Gtk::Label#set_markup(text, mnemonic) style has been deprecated. " + "Use Gtk::Label#set_markup(text, {:use_underline => #{mnemonic}}) style instead." options = { :use_underline => mnemonic, } end if options[:use_underline] set_markup_with_mnemonic(text) else set_markup_raw(text) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/level-bar.rb000066400000000000000000000021061511343406000226770ustar00rootroot00000000000000# Copyright (C) 2014 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 LevelBar if method_defined?(:get_offset_value) alias_method :get_offset_value_raw, :get_offset_value def get_offset_value(name) found, offset = get_offset_value_raw(name) if found offset else nil end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/list-store.rb000066400000000000000000000037121511343406000231370ustar00rootroot00000000000000# Copyright (C) 2015 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 ListStore alias_method :initialize_raw, :initialize def initialize(*columns) if columns.empty? raise ArgumentError, "No column type is specified" end initialize_raw(columns) end alias_method :append_raw, :append def append iter = append_raw setup_iter(iter) iter end alias_method :prepend_raw, :prepend def prepend iter = prepend_raw setup_iter(iter) iter end alias_method :insert_raw, :insert def insert(index, values=nil) iter = insert_raw(index) setup_iter(iter) set_values(iter, values) if values iter end alias_method :insert_before_raw, :insert_before def insert_before(index) iter = insert_before_raw(index) setup_iter(iter) iter end alias_method :insert_after_raw, :insert_after def insert_after(index) iter = insert_after_raw(index) setup_iter(iter) iter end alias_method :set_column_types_raw, :set_column_types def set_column_types(*types) if types.size == 1 and types[0].is_a?(Array) types = types[0] end set_column_types_raw(types) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/loader.rb000066400000000000000000000326421511343406000223040ustar00rootroot00000000000000# Copyright (C) 2014-2025 Ruby-GNOME 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 Loader < GObjectIntrospection::Loader def initialize(base_module, init_arguments) super(base_module) @init_arguments = init_arguments end def load self.version = "3.0" super("Gtk") end private def pre_load(repository, namespace) call_init_function(repository, namespace) define_stock_module define_version_module define_methods_modules setup_pending_constants end def call_init_function(repository, namespace) init_check = repository.find(namespace, "init_check") arguments = [ [$0] + @init_arguments, ] succeeded, argv = init_check.invoke(arguments) @init_arguments.replace(argv[1..-1]) raise InitError, "failed to initialize GTK+" unless succeeded end def define_stock_module @stock_module = Module.new @base_module.const_set("Stock", @stock_module) end def define_version_module @version_module = Module.new @base_module.const_set("Version", @version_module) end def define_methods_modules @stock_singleton_methods_module = define_methods_module(:StockSingletonMethods) @widget_methods_module = define_methods_module(:WidgetMethods) @gdk_drag_context_methods_module = define_methods_module(:GdkDragContextMethods) @icon_size_class_methods_module = define_methods_module(:IconSizeClassMethods) @accel_group_class_methods_module = define_methods_module(:AccelGroupClassMethods) @gdk_event_methods_module = define_methods_module(:GdkEventMethods) end def apply_methods_modules apply_methods_module(@stock_singleton_methods_module, @base_module::Stock.singleton_class) apply_methods_module(@widget_methods_module, @base_module::Widget) apply_methods_module(@gdk_drag_context_methods_module, Gdk::DragContext) apply_methods_module(@icon_size_class_methods_module, @base_module::IconSize.singleton_class) apply_methods_module(@accel_group_class_methods_module, @base_module::AccelGroup.singleton_class) apply_methods_module(@gdk_event_methods_module, Gdk::Event) end def level_bar_class @level_bar_class ||= @base_module.const_get(:LevelBar) end def style_provider_module @style_provider_module ||= @base_module.const_get(:StyleProvider) end def post_load(repository, namespace) apply_pending_constants apply_methods_modules require_extension require_libraries end def require_extension require "gtk3.so" end def require_libraries require_relative "gdk-drag-context" require_relative "gdk-screen" require_relative "about-dialog" require_relative "action" require_relative "action-group" require_relative "application" require_relative "binding-set" require_relative "border" require_relative "box" require_relative "button" require_relative "builder" require_relative "calendar" require_relative "cell-layout" require_relative "check-menu-item" require_relative "clipboard" require_relative "color-chooser-dialog" require_relative "combo-box" require_relative "combo-box-text" require_relative "container" require_relative "css-provider" require_relative "dialog" require_relative "entry" require_relative "entry-buffer" require_relative "file-chooser-dialog" require_relative "font-chooser-dialog" require_relative "gesture-multi-press" require_relative "icon-size" require_relative "icon-theme" require_relative "icon-view" require_relative "image" require_relative "image-menu-item" require_relative "label" require_relative "level-bar" require_relative "list-store" require_relative "menu-item" require_relative "message-dialog" require_relative "paned" require_relative "popover" require_relative "radio-action" require_relative "radio-button" require_relative "recent-chooser-dialog" require_relative "response-type" require_relative "scale-button" require_relative "scrolled-window" require_relative "search-bar" require_relative "selection-data" require_relative "spin-button" require_relative "show-uri" require_relative "stack" require_relative "stock" require_relative "stock-item" require_relative "style-context" require_relative "style-properties" require_relative "table" require_relative "target-list" require_relative "target-entry" require_relative "text-buffer" require_relative "text-iter" require_relative "text-tag" require_relative "text-tag-table" require_relative "text-view" require_relative "toggle-action" require_relative "toggle-button" require_relative "tool-button" require_relative "tree-iter" require_relative "tree-model" require_relative "tree-model-filter" require_relative "tree-model-sort" require_relative "tree-path" require_relative "tree-selection" require_relative "tree-store" require_relative "tree-view" require_relative "tree-view-column" require_relative "ui-manager" require_relative "version" require_relative "widget" require_relative "window" require_relative "deprecated" end def rubyish_method_name(function_info, options={}) name = function_info.name case name when /\Alist_(child_properties|style_properties)\z/ $1 else super end end def load_function_info(info) name = info.name case name when "init", /_get_type\z/ # ignore when /\Astock_/ method_name = rubyish_method_name(info, :prefix => "stock_") define_module_function(info, @stock_singleton_methods_module, method_name) when /\Adrag_(?:source_|dest_|get_data\z|(?:un)highlight\z|begin|check_threshold\z)/ # For OS X. It may be broken. It's not tested. method_name = rubyish_method_name(info) define_method(info, @widget_methods_module, method_name) when /\Adrag_/ method_name = rubyish_method_name(info, :prefix => "drag_", :n_in_args_offset => -1) define_method(info, @gdk_drag_context_methods_module, method_name) when /\Abinding_/ # Ignore because singleton methods are defined. when /\Aicon_size_/ method_name = rubyish_method_name(info, :prefix => "icon_size_") define_module_function(info, @icon_size_class_methods_module, method_name) when /\Atest_widget_/ name = $POSTMATCH define_method(info, @widget_methods_module, name) when /\Aaccel_groups_/ method_name = rubyish_method_name(info, :prefix => "accel_groups_") define_module_function(info, @accel_group_class_methods_module, method_name) else super end end def define_singleton_method(info, klass, name) case klass.name when "Gtk" case name when "get_event_widget" define_method(info, @gdk_event_methods_module, "widget") return when "events_pending" name = "events_pending?" end when "Gtk::AccelMap" case name when "each", "foreach_unfiltered" # Implemented in C return end when "Gtk::Widget" case name when "default_style" # Ignore deprecated method return end end super(info, klass, name) end def define_enum(info) case info.name when /\AArrow/ self.class.define_class(info.gtype, $POSTMATCH, Arrow) when /\ALevelBar/ self.class.define_class(info.gtype, $POSTMATCH, LevelBar) when /\ARevealer/ self.class.define_class(info.gtype, $POSTMATCH, Revealer) when /\AStack/ self.class.define_class(info.gtype, $POSTMATCH, Stack) else super end end def rubyish_class_name(info) case info when GObjectIntrospection::EnumInfo case info.name when /\ARc/ "RC#{$POSTMATCH}" else super end else super end end def flags_class_name(info) case info.name when /\ARc/ "RC#{$POSTMATCH}" else super end end def field_name(field_info, klass) case klass.name when "Gtk::AccelKey" super.gsub(/\Aaccel_/, "") else super end end def load_method_info(info, klass, method_name) case klass.name when "Gtk::Assistant" case method_name when /\A(?:set|get)_page_(?:header|side)_image\z/ # Ignore deprecated methods return end when "Gtk::Buildable" case method_name when "name" method_name = "builder_name" when "set_name" method_name = "set_builder_name" end when "Gtk::Builder" case method_name when "connect_signals" return when "connect_signals_full" method_name = "connect_signals" when "get_type_from_name" method_name = "get_type" end when "Gtk::BindingSet" case method_name when "add_path" # Ignore deprecated methods return end when "Gtk::Button" case method_name when "enter", "leave", "pressed", "released" # Ignore deprecated methods return end when "Gtk::CellRenderer" case method_name when "get_size" # Ignore deprecated methods return end when "Gtk::CellView" case method_name when "get_size_of_row" # Ignore deprecated methods return end when "Gtk::Container" case method_name when "forall" method_name = "each_all" end when "Gtk::IconSet" case method_name when "render_icon" # Ignore deprecated methods return end when "Gtk::IconTheme" case method_name when "list_icons" method_name = "icons" end when "Gtk::Image" method_name = method_name.gsub(/\Agicon/, "icon") when "Gtk::Tooltip" case method_name when "set_icon_from_stock" # Ignore deprecated methods return end when "Gtk::TreePath" case method_name when "next", "prev", "up", "down" method_name += "!" end when "Gtk::TreeSelection" case method_name when "selected_foreach" method_name = "each" end when "Gtk::TreeView" case method_name when "row_expanded" method_name += "?" end when "Gtk::Widget" case info.name when "size_request", "get_child_requisition", "ensure_style", "reset_rc_styles", "class_path", "modify_style", "get_modifier_style", "modify_fg", "modify_bg", "modify_text", "modify_base", "modify_font", "modify_cursor", "render_icon", "get_state", "has_rc_style", "get_requisition", "get_pointer" # Ignore deprecated method return end end super(info, klass, method_name) end def load_constant_info(info) case info.name when /\ASTOCK_/ @stock_module.const_set($POSTMATCH, info.value) when /_VERSION\z/ @version_module.const_set($PREMATCH, info.value) when /\ALEVEL_BAR_/ @pending_constants << info when /\ASTYLE_PROVIDER_/ @pending_constants << info else super end end def setup_pending_constants @pending_constants = [] end def apply_pending_constants @pending_constants.each do |info| case info.name when /\ALEVEL_BAR_/ level_bar_class.const_set($POSTMATCH, info.value) when /\ASTYLE_PROVIDER_/ style_provider_module.const_set($POSTMATCH, info.value) end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/menu-item.rb000066400000000000000000000021641511343406000227320ustar00rootroot00000000000000# Copyright (C) 2015 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 MenuItem alias_method :initialize_raw, :initialize def initialize(options={}) label = options[:label] if label if options[:use_underline] initialize_new_with_mnemonic(label) else initialize_new_with_label(label) end else initialize_raw end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/message-dialog.rb000066400000000000000000000032321511343406000237100ustar00rootroot00000000000000# Copyright (C) 2015 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 MessageDialog def initialize(options={}) parent = options[:parent] flags = options[:flags] || 0 type = options[:type] || :info buttons = options[:buttons] || options[:buttons_type] || :ok message = options[:message] initialize_general = GLib::Object.instance_method(:initialize).bind(self) initialize_general.call(:message_type => type, :buttons => buttons) Loader.reference_gobject(self, :sink => true) if message self.use_markup = false self.text = message end if parent self.transient_for = parent end if flags unless flags.is_a?(DialogFlags) flags = DialogFlags.new(flags) end self.modal = true if flags.modal? self.destroy_with_parent = true if flags.destroy_with_parent? end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/paned.rb000066400000000000000000000024431511343406000221210ustar00rootroot00000000000000# Copyright (C) 2015 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 Paned alias_method :pack1_raw, :pack1 def pack1(child, options={}) resize = options[:resize] resize = false if resize.nil? shrink = options[:shrink] shrink = true if shrink.nil? pack1_raw(child, resize, shrink) end alias_method :pack2_raw, :pack2 def pack2(child, options={}) resize = options[:resize] resize = true if resize.nil? shrink = options[:shrink] shrink = true if shrink.nil? pack2_raw(child, resize, shrink) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/popover.rb000066400000000000000000000017431511343406000225260ustar00rootroot00000000000000# Copyright (C) 2025 Ruby-GNOME 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 Popover alias_method :pointing_to_raw, :pointing_to def pointing_to have, rectangle = pointing_to_raw if have rectangle else nil end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/radio-action.rb000066400000000000000000000021031511343406000233740ustar00rootroot00000000000000# Copyright (C) 2015 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 RadioAction alias_method :initialize_raw, :initialize def initialize(name, value, options={}) initialize_raw(name, options[:label], options[:tooltip], options[:stock_id], value) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/radio-button.rb000066400000000000000000000031121511343406000234330ustar00rootroot00000000000000# Copyright (C) 2015 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 RadioButton alias_method :initialize_raw, :initialize def initialize(options={}) group = options[:group] label = options[:label] member = options[:member] use_underline = options[:use_underline] if label if member if use_underline initialize_new_with_mnemonic_from_widget(member, label) else initialize_new_with_label_from_widget(member, label) end else if use_underline initialize_new_with_mnemonic(group, label) else initialize_new_with_label(group, label) end end else if member initialize_new_from_widget(member) else initialize_raw end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/recent-chooser-dialog.rb000066400000000000000000000025641511343406000252130ustar00rootroot00000000000000# Copyright (C) 2015 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 RecentChooserDialog alias_method :initialize_raw, :initialize def initialize(options={}) initialize_options = { :recent_manager => options[:recent_manager], } gobject_initialize = GLib::Object.instance_method(:initialize).bind(self) gobject_initialize.call(initialize_options) Loader.reference_gobject(self, :sink => true) title = options[:title] parent = options[:parent] buttons = options[:buttons] set_title(title) if title set_transient_for(parent) if parent add_buttons(*buttons) if buttons end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/response-type.rb000066400000000000000000000017111511343406000236440ustar00rootroot00000000000000# Copyright (C) 2020 Ruby-GNOME 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 ResponseType class << self def resolve(id) case id when Symbol new(id) else id end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/scale-button.rb000066400000000000000000000024141511343406000234300ustar00rootroot00000000000000# Copyright (C) 2015 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 ScaleButton alias_method :initialize_raw, :initialize def initialize(options={}) icon_size = options[:icon_size] || :button min = options[:min] || 0 max = options[:max] || 100 step = options[:step] || 2 icons = options[:icons] || nil case icon_size when Symbol, String icon_size = IconSize.new(icon_size.to_s) end initialize_raw(icon_size, min, max, step, icons) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/scrolled-window.rb000066400000000000000000000017201511343406000241430ustar00rootroot00000000000000# Copyright (C) 2014 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 ScrolledWindow alias_method :initialize_raw, :initialize def initialize(hadjustment=nil, vadjustment=nil) initialize_raw(hadjustment, vadjustment) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/search-bar.rb000066400000000000000000000017551511343406000230460ustar00rootroot00000000000000# Copyright (C) 2014 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 SearchBar if method_defined?(:connect_entry) alias_method :connect_entry_raw, :connect_entry def connect_entry(entry) connect_entry_raw(entry) self end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/selection-data.rb000066400000000000000000000026221511343406000237250ustar00rootroot00000000000000# Copyright (C) 2015 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 SelectionData alias_method :set_raw, :set def set(type, data, options={}) format ||= options[:format] if format.nil? case type when Gdk::Selection::TYPE_INTEGER format = 32 when Gdk::Selection::TYPE_STRING format = 8 else message = "specify :format as the number of bits of each data" raise ArgumentError, message end end set_raw(type, format, data) end alias_method :set_text_raw, :set_text def set_text(text) set_text_raw(text, text.bytesize) end alias_method :text=, :set_text end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/show-uri.rb000066400000000000000000000022641511343406000226100ustar00rootroot00000000000000# Copyright (C) 2015 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 << self alias_method :show_uri_raw, :show_uri def show_uri(uri_or_options) if uri_or_options.is_a?(String) options = {:uri => uri_or_options} else options = uri_or_options end screen = options[:screen] uri = options[:uri] timestamp = options[:timestamp] || Gdk::CURRENT_TIME show_uri_raw(screen, uri, timestamp) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/spin-button.rb000066400000000000000000000023111511343406000233060ustar00rootroot00000000000000# Copyright (C) 2014 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 SpinButton alias_method :initialize_raw, :initialize def initialize(arg0, arg1=nil, arg2=nil) if arg0.is_a?(Adjustment) adjustment = arg0 climb_rate = arg1 || 0.0 digits = arg2 || 0 initialize_raw(adjustment, climb_rate, digits) else min = arg0 max = arg1 step = arg2 initialize_new_with_range(min, max, step) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/stack.rb000066400000000000000000000032251511343406000221360ustar00rootroot00000000000000# Copyright (C) 2014 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 Stack if method_defined?(:set_visible_child) alias_method :set_visible_child_raw, :set_visible_child def set_visible_child(widget_or_name, transition_type=nil) case widget_or_name when String name = widget_or_name else widget = widget_or_name end if widget set_visible_child_raw(widget) else if transition_type set_visible_child_full(name, transition_type) else set_visible_child_name(name) end end end end if method_defined?(:add_titled) and method_defined?(:add_named) def add(widget, name=nil, title=nil) if title add_titled(widget, name, title) elsif name add_named(widget, name) else super(widget) end self end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/stock-item.rb000066400000000000000000000022141511343406000231050ustar00rootroot00000000000000# Copyright (C) 2015 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 StockItem def [](*args) warn("#{self.class}\##{__method__} is deprecated. " + "Use \#stock_id, \#label, \#modifier, \#keyval and " + "\#translation_domain instead.") to_a[*args] end def to_a [ stock_id, label, modifier, keyval, translation_domain, ] end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/stock.rb000066400000000000000000000040111511343406000221460ustar00rootroot00000000000000# Copyright (C) 2015 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 module Stock class << self alias_method :add_raw, :add def add(stock_id, label, *rest) case rest.size when 0 options = {} when 1 if rest[0].is_a?(Hash) options = rest[0] else options = {:modifier => rest[0]} end else options = { :modifier => rest[0], :key_value => rest[1], :translation_domain => rest[2], } end item = StockItem.new stock_id = stock_id.to_s if stock_id.is_a?(Symbol) item.stock_id = stock_id item.label = label modifier = options[:modifier] item.modifier = modifier if modifier key_value = options[:key_value] item.keyval = key_value if key_value translation_domain = options[:translation_domain] item.translation_domain = translation_domain if translation_domain add_raw([item]) end alias_method :lookup_raw, :lookup def lookup(stock_id) stock_id = stock_id.to_s if stock_id.is_a?(Symbol) found, item = lookup_raw(stock_id) if found item else nil end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/style-context.rb000066400000000000000000000032721511343406000236550ustar00rootroot00000000000000# Copyright (C) 2015-2019 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 StyleContext class << self def resolve_priority(priority) case priority when Symbol, String StyleProvider.const_get("PRIORITY_#{priority.to_s.upcase}") else priority || StyleProvider::PRIORITY_APPLICATION end end alias_method :add_provider_for_screen_raw, :add_provider_for_screen def add_provider_for_screen(screen, provider, priority=nil) priority = resolve_priority(priority) add_provider_for_screen_raw(screen, provider, priority) end alias_method :reset_widgets_raw, :reset_widgets def reset_widgets(screen=nil) reset_widgets_raw(screen || Gdk::Screen.default) end end alias_method :add_provider_raw, :add_provider def add_provider(provider, priority=nil) priority = self.class.resolve_priority(priority) add_provider_raw(provider, priority) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/style-properties.rb000066400000000000000000000020161511343406000243600ustar00rootroot00000000000000# Copyright (C) 2015 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 StyleProperties alias_method :get_property_raw, :get_property def get_property(key, state) found, property = get_property_raw(key, state) if found property.value else nil end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/table.rb000066400000000000000000000031151511343406000221160ustar00rootroot00000000000000# Copyright (C) 2015 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 Table alias_method :initialize_raw, :initialize def initialize(n_rows, n_columns, homogeneous=false) initialize_raw(n_rows, n_columns, homogeneous) end alias_method :default_column_spacing, :default_col_spacing def column_spacings(column) get_col_spacings(column) end alias_method :set_column_spacings, :set_col_spacings alias_method :column_spacings=, :col_spacings= alias_method :attach_raw, :attach def attach(child, left, right, top, bottom, x_options=nil, y_options=nil, x_space=nil, y_space=nil) attach_raw(child, left, right, top, bottom, x_options || [:expand, :fill], y_options || [:expand, :fill], x_space || 0, y_space || 0) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/target-entry.rb000066400000000000000000000020271511343406000234550ustar00rootroot00000000000000# Copyright (C) 2015 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 TargetEntry alias_method :initialize_raw, :initialize def initialize(target, flags, info) unless flags.is_a?(TargetFlags) flags = TargetFlags.new(flags) end initialize_raw(target, flags.to_i, info) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/target-list.rb000066400000000000000000000020241511343406000232640ustar00rootroot00000000000000# Copyright (C) 2015 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 TargetList alias_method :find_raw, :find def find(target) target = Gdk::Atom.intern(target) if target.is_a?(String) found, info = find_raw(target) if found info else nil end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/text-buffer.rb000066400000000000000000000164221511343406000232670ustar00rootroot00000000000000# Copyright (C) 2014-2018 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 TextBuffer def create_tag(tag_name=nil, properties={}) tag = TextTag.new(tag_name) succeeded = tag_table.add(tag) return nil unless succeeded properties.each do |name, value| property_name = name.to_s.gsub(/-/, "_") tag.__send__("#{property_name}=", value) end 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 alias_method :get_iter_at_line_raw, :get_iter_at_line alias_method :get_iter_at_offset_raw, :get_iter_at_offset alias_method :get_iter_at_mark_raw, :get_iter_at_mark alias_method :get_iter_at_child_anchor_raw, :get_iter_at_child_anchor def get_iter_at(arguments) line = arguments[:line] offset = arguments[:offset] index = arguments[:index] mark = arguments[:mark] anchor = arguments[:anchor] if line if offset get_iter_at_line_offset_raw(line, offset) elsif index get_iter_at_line_index_raw(line, index) else get_iter_at_line_raw(line) end elsif offset get_iter_at_offset_raw(offset) elsif mark get_iter_at_mark_raw(mark) elsif anchor get_iter_at_child_anchor_raw(anchor) else message = "Must specify one of :line, :offset, :mark or :anchor: #{arguments.inspect}" raise ArgumentError, message end end alias_method :insert_raw, :insert alias_method :insert_pixbuf_raw, :insert_pixbuf alias_method :insert_child_anchor_raw, :insert_child_anchor def insert(iter, target, *args) options = nil tags = nil case args.size when 0 options = {} when 1 case args.first when Hash options = args.first else tags = args end else tags = args end if options.nil? signature_prefix = "#{self.class}\##{__method__}(iter, target" warn("#{signature_prefix}, *tags) style has been deprecated. " + "Use #{signature_prefix}, options={:tags => tags}) style instead.") options = {:tags => tags} end interactive = options[:interactive] default_editable = options[:default_editable] tags = options[:tags] start_offset = iter.offset if interactive default_editable = true if default_editable.nil? insert_interactive(iter, target, default_editable) else case target when GdkPixbuf::Pixbuf insert_pixbuf_raw(iter, target) when TextChildAnchor insert_text_child_anchor_raw(iter, target) when GLib::Bytes insert_raw(iter, target, target.size) else insert_raw(iter, target, target.bytesize) end end if tags start_iter = get_iter_at(:offset => start_offset) tags.each do |tag| if tag.is_a?(String) resolved_tag = tag_table.lookup(tag) if resolved_tag.nil? raise ArgumentError "unknown tag: #{tag.inspect}" end tag = resolved_tag end apply_tag(tag, start_iter, iter) end end self end if method_defined?(:insert_markup) alias_method :insert_markup_raw, :insert_markup def insert_markup(iter, markup, n_bytes=nil) case markup when GLib::Bytes n_bytes ||= markup.size else n_bytes ||= markup.bytesize end insert_markup_raw(iter, markup, n_bytes) end end alias_method :insert_at_cursor_raw, :insert_at_cursor def insert_at_cursor(text, options={}) interactive = options[:interactive] default_editable = options[:default_editable] if interactive default_editable = true if default_editable.nil? insert_interactive_at_cursor(text, default_editable) else insert_at_cursor_raw(text, text.bytesize) end end alias_method :set_text_raw, :set_text def set_text(text) if text.is_a?(GLib::Bytes) text, text_size = text.to_s, text.size else text_size = text.bytesize end set_text_raw(text, text_size) end remove_method :text= alias_method :text=, :set_text alias_method :apply_tag_raw, :apply_tag def apply_tag(tag, start, last) if tag.is_a?(String) apply_tag_by_name(tag, start, last) else apply_tag_raw(tag, start, last) end end alias_method :serialize_raw, :serialize def serialize(*arguments) serialize_raw(*arguments).pack("C*") end alias_method :selection_bounds_raw, :selection_bounds def selection_bounds selected, start_iter, end_iter = selection_bounds_raw if selected [start_iter, end_iter] else nil end end private alias_method :insert_interactive_raw, :insert_interactive def insert_interactive(iter, text, default_ediatable) if text.is_a?(GLib::Bytes) text, text_size = text.to_s, text.size else text_size = text.bytesize end insert_interactive_raw(iter, text, text_size, default_ediatable) end alias_method :insert_interactive_at_cursor_raw, :insert_interactive_at_cursor def insert_interactive_at_cursor(text, default_ediatable) if text.is_a?(GLib::Bytes) text, text_size = text.to_s, text.size else text_size = text.bytesize end insert_interactive_at_cursor_raw(text, text_size, default_ediatable) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/text-iter.rb000066400000000000000000000025031511343406000227540ustar00rootroot00000000000000# Copyright (C) 2015 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 TextIter alias_method :forward_search_raw, :forward_search def forward_search(text, flags, limit=nil) found, start_iter, end_iter = forward_search_raw(text, flags, limit) if found [start_iter, end_iter] else nil end end alias_method :backward_search_raw, :backward_search def backward_search(text, flags, limit=nil) found, start_iter, end_iter = backward_search_raw(text, flags, limit) if found [start_iter, end_iter] else nil end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/text-tag-table.rb000066400000000000000000000020771511343406000236570ustar00rootroot00000000000000# Copyright (C) 2015 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 TextTagTable alias_method :add_raw, :add def add(tag) succeeded = add_raw(tag) # GTK+ 3.12 or older returns nothing. # We assume that it's always succeeded for the case. if succeeded.nil? true else succeeded end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/text-tag.rb000066400000000000000000000025321511343406000225660ustar00rootroot00000000000000# Copyright (C) 2017 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 TextTag alias_method :set_weight_raw, :set_weight def set_weight(weight) case weight when Symbol, String weight = Pango::Weight.new(weight).to_i end set_weight_raw(weight) end undef_method :weight= alias_method :weight=, :set_weight alias_method :set_scale_raw, :set_scale def set_scale(scale) case scale when Symbol, String scale = Pango::Scale.const_get(scale.to_s.upcase) end set_scale_raw(scale) end undef_method :scale= alias_method :scale=, :set_scale end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/text-view.rb000066400000000000000000000035651511343406000227740ustar00rootroot00000000000000# Copyright (C) 2016-2017 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) result = get_iter_at_location_raw(x, y) if result.is_a?(Gtk::TextIter) # For GTK+ < 3.20 iter = result iter else found, iter = result if found iter else nil end end end alias_method :get_iter_at_position_raw, :get_iter_at_position def get_iter_at_position(x, y) result = get_iter_at_position_raw(x, y) if result.size == 2 # For GTK+ < 3.20 result else found, iter, trailing = result if found [iter, trailing] else nil end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/toggle-action.rb000066400000000000000000000020411511343406000235600ustar00rootroot00000000000000# Copyright (C) 2015 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 ToggleAction alias_method :initialize_raw, :initialize def initialize(name, options={}) initialize_raw(name, options[:label], options[:tooltip], options[:stock_id]) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/toggle-button.rb000066400000000000000000000022341511343406000236220ustar00rootroot00000000000000# Copyright (C) 2015 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 ToggleButton alias_method :initialize_raw, :initialize def initialize(options={}) label = options[:label] use_underline = options[:use_underline] if label if use_underline initialize_new_with_mnemonic(label) else initialize_new_with_label(label) end else initialize_raw end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tool-button.rb000066400000000000000000000023041511343406000233140ustar00rootroot00000000000000# Copyright (C) 2015 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 ToolButton alias_method :initialize_raw, :initialize def initialize(options={}) icon_widget = options[:icon_widget] label = options[:label] stock_id = options[:stock_id] if icon_widget initialize_new(icon_widget) elsif stock_id initialize_new_from_stock(stock_id) else initialize_new end set_label(label) if label end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-iter.rb000066400000000000000000000036661511343406000227420ustar00rootroot00000000000000# 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 # 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 TreeIter def model @model end def model=(model) @model = model end def get_value(column) @model.get_value(self, column) end alias_method :[], :get_value def set_value(column, value) gtype = @model.get_column_type(column) gvalue = GLib::Value.new(gtype, value) @model.set_value(self, column, gvalue) end alias_method :[]=, :set_value def set_values(values) @model.set_values(self, values) end alias_method :values=, :set_values def path @model.get_path(self) end def previous! @model.iter_previous(self) end def next! @model.iter_next(self) end def parent @model.iter_parent(self) end def has_child? @model.iter_has_child(self) end def n_children @model.iter_n_children(self) end def nth_child(n) @model.iter_nth_child(self, n) end def children @model.iter_children(self) end def first_child nth_child(0) end def ==(other) other.is_a?(self.class) and @model == other.model and path == other.path end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-model-filter.rb000066400000000000000000000031761511343406000243560ustar00rootroot00000000000000# Copyright (C) 2015 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 TreeModelFilter def initialize(child_model, root=nil) super(:child_model => child_model, :virtual_root => root) end alias_method :set_modify_func_raw, :set_modify_func def set_modify_func(*types, &block) raise ArgumentError, "one or more types are required" if types.empty? set_modify_func_raw(types, &block) end alias_method :convert_iter_to_child_iter_raw, :convert_iter_to_child_iter def convert_iter_to_child_iter(iter) child_iter = convert_iter_to_child_iter_raw(iter) child_iter.model = model child_iter end alias_method :convert_child_iter_to_iter_raw, :convert_child_iter_to_iter def convert_child_iter_to_iter(child_iter) converted, iter = convert_child_iter_to_iter_raw(child_iter) return nil unless converted iter.model = self iter end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-model-sort.rb000066400000000000000000000017301511343406000240520ustar00rootroot00000000000000# Copyright (C) 2019 Ruby-GNOME 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 TreeModelSort if TreeModel.method_defined?(:sort_new_with_model) class << self def new(model) model.sort_new_with_model end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-model.rb000066400000000000000000000054621511343406000230730ustar00rootroot00000000000000# Copyright (C) 2014-2015 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 module TreeModel alias_method :get_iter_raw, :get_iter def get_iter(path) if path.is_a?(String) got, iter = get_iter_from_string(path) else got, iter = get_iter_raw(path) end if got setup_iter(iter) iter else nil end end alias_method :iter_first_raw, :iter_first def iter_first got, iter = iter_first_raw if got setup_iter(iter) iter else nil end end alias_method :iter_parent_raw, :iter_parent def iter_parent(iter) got, iter = iter_parent_raw(iter) if got setup_iter(iter) iter else nil end end alias_method :get_value_raw, :get_value def get_value(iter, column) get_value_raw(iter, column).value end alias_method :iter_nth_child_raw, :iter_nth_child def iter_nth_child(iter, n) got, iter = iter_nth_child_raw(iter, n) if got setup_iter(iter) iter else nil end end alias_method :iter_children_raw, :iter_children def iter_children(iter) got, iter = iter_children_raw(iter) if got setup_iter(iter) iter else nil end end def set_values(iter, values) columns = [] _values = [] if values.is_a?(Hash) values.each do |column_id, value| type = get_column_type(column_id) columns << column_id _values << GLib::Value.new(type, value) end else values.each_with_index do |value, i| type = get_column_type(i) columns << i _values << GLib::Value.new(type, value) end end 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 alias_method :create_filter, :filter_new private def setup_iter(iter) iter.model = self end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-path.rb000066400000000000000000000016741511343406000227300ustar00rootroot00000000000000# Copyright (C) 2015 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 TreePath include Comparable def <=>(other) if other.is_a?(self.class) compare(other) else nil end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-selection.rb000066400000000000000000000017621511343406000237570ustar00rootroot00000000000000# Copyright (C) 2014-2015 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 TreeSelection alias_method :selected_raw, :selected def selected selected_p, model, iter = selected_raw return nil unless selected_p iter.model = model iter end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-store.rb000066400000000000000000000033711511343406000231240ustar00rootroot00000000000000# Copyright (C) 2014 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 TreeStore alias_method :initialize_raw, :initialize def initialize(*column_types) initialize_raw(column_types) end alias_method :insert_raw, :insert def insert(parent, position, values=nil) iter = insert_raw(parent, position) setup_iter(iter) set_values(iter, values) if values iter end alias_method :insert_before_raw, :insert_before def insert_before(parent, sibling) iter = insert_before_raw(parent, sibling) setup_iter(iter) iter end alias_method :insert_after_raw, :insert_after def insert_after(parent, sibling) iter = insert_after_raw(parent, sibling) setup_iter(iter) iter end alias_method :prepend_raw, :prepend def prepend(parent) iter = prepend_raw(parent) setup_iter(iter) iter end alias_method :append_raw, :append def append(parent) iter = append_raw(parent) setup_iter(iter) iter end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-view-column.rb000066400000000000000000000040021511343406000242250ustar00rootroot00000000000000# 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 # 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 TreeViewColumn alias_method :initialize_raw, :initialize def initialize(*args) if args.size == 1 and args[0].is_a?(Hash) options = args[0].dup area = options.delete(:area) renderer = options.delete(:renderer) title = options.delete(:title) attributes = options.delete(:attributes) unless options.empty? names = options.keys.inspect available_names = [:area, :renderer, :title, :attributes].inspect message = "unknown option(s): #{names}: available options: #{available_names}" raise ArgumentError, message end else area = nil title, renderer, attributes = args end attributes ||= {} if area initialize_new_with_area(area) else initialize_raw end set_title(title) if title if renderer pack_start(renderer, true) attributes.each_entry do |key, value| add_attribute(renderer, key, value) end end end alias_method :add_attribute_raw, :add_attribute def add_attribute(renderer, key, value) key = key.to_s if key.is_a?(Symbol) add_attribute_raw(renderer, key, value) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/tree-view.rb000066400000000000000000000055641511343406000227500ustar00rootroot00000000000000# Copyright (C) 2015 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 TreeView alias_method :get_path_at_pos_raw, :get_path_at_pos def get_path_at_pos(x, y) found, *info = get_path_at_pos_raw(x, y) if found info else nil end end alias_method :enable_model_drag_source_raw, :enable_model_drag_source def enable_model_drag_source(flags, targets, actions) targets = ensure_drag_targets(targets) enable_model_drag_source_raw(flags, targets, actions) end alias_method :enable_model_drag_dest_raw, :enable_model_drag_dest def enable_model_drag_dest(targets, actions) targets = ensure_drag_targets(targets) enable_model_drag_dest_raw(targets, actions) end alias_method :insert_column_raw, :insert_column def insert_column(*args, &block) case args.size when 2 column, position = args insert_column_raw(column, position) when 3 position, title, cell = args insert_column_with_data_func(position, title, cell, &block) when 4 position, title, cell, attributes = args column = TreeViewColumn.new column.sizing = :fixed if fixed_height_mode? column.title = title column.pack_start(cell, true) attributes.each do |name, column_id| column.add_attribute(cell, name, column_id) end insert_column_raw(column, position) else 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 ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/ui-manager.rb000066400000000000000000000024341511343406000230570ustar00rootroot00000000000000# Copyright (C) 2015 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 UIManager alias_method :add_ui_raw, :add_ui def add_ui(buffer_or_filename, *args) if args.empty? if buffer_or_filename =~ // add_ui_from_string(buffer_or_filename, buffer_or_filename.length) else add_ui_from_file(buffer_or_filename) end else merge_id = buffer_or_filename path, name, action, type, top, = args add_ui_raw(merge_id, path, name, action, type, top) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/version.rb000066400000000000000000000020231511343406000225110ustar00rootroot00000000000000# Copyright (C) 2014-2015 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 module Version STRING = [MAJOR, MINOR, MICRO].join(".") class << self def or_later?(major, minor, micro=nil) error_message = Gtk.check_version(major, minor, micro || 0) error_message.nil? end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/widget.rb000066400000000000000000000124251511343406000223160ustar00rootroot00000000000000# Copyright (C) 2015-2022 Ruby-GNOME 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 Widget class << self def have_template? @have_template ||= false end def template_children @template_children ||= [] end if method_defined?(:set_template) alias_method :set_template_raw, :set_template def set_template(template) resource = template[:resource] data = template[:data] if resource set_template_from_resource(resource) else set_template_raw(data) end @have_template = true end def bind_template_child(name, options={}) internal_child = options[:internal_child] internal_child = false if internal_child.nil? bind_template_child_full(name, internal_child, 0) template_children << name attr_reader(name) end end alias_method :set_connect_func_raw, :set_connect_func def set_connect_func(&block) set_connect_func_raw do |*args| Builder.connect_signal(*args, &block) end end end alias_method :events_raw, :events def events Gdk::EventMask.new(events_raw) end alias_method :add_events_raw, :add_events def add_events(new_events) unless new_events.is_a?(Gdk::EventMask) new_events = Gdk::EventMask.new(new_events) end add_events_raw(new_events.to_i) end alias_method :set_events_raw, :set_events def set_events(new_events) unless new_events.is_a?(Gdk::EventMask) new_events = Gdk::EventMask.new(new_events) end set_events_raw(new_events.to_i) end alias_method :events_raw=, :events= alias_method :events=, :set_events alias_method :set_size_request_raw, :set_size_request def set_size_request(*args) case args.size when 1 options = args[0] raise ArgumentError, ":width is missing" unless options.key?(:width) width = options[:width] raise ArgumentError, ":height is missing" unless options.key?(:height) height = options[:height] when 2 width, height = args else message = "wrong number of arguments (given #{args.size}, expected 1..2)" raise ArgumentError, message end set_size_request_raw(width, height) end alias_method :drag_source_set_raw, :drag_source_set def drag_source_set(flags, targets, actions) targets = ensure_drag_targets(targets) drag_source_set_raw(flags, targets, actions) end alias_method :drag_dest_set_raw, :drag_dest_set def drag_dest_set(flags, targets, actions) targets = ensure_drag_targets(targets) drag_dest_set_raw(flags, targets, actions) end alias_method :style_get_property_raw, :style_get_property def style_get_property(name) property = self.class.find_style_property(name) if property.nil? raise ArgumentError, "unknown style: #{name.inspect}" end value = GLib::Value.new(property.value_type) style_get_property_raw(name, value) value.value end alias_method :render_icon_pixbuf_raw, :render_icon_pixbuf def render_icon_pixbuf(stock_id, size) size = IconSize.new(size) unless size.is_a?(IconSize) render_icon_pixbuf_raw(stock_id, size) end alias_method :translate_coordinates_raw, :translate_coordinates def translate_coordinates(widget, x, y) translated, x, y = translate_coordinates_raw(widget, x, y) if translated [x, y] else nil end end alias_method :style_context_raw, :style_context def style_context @style_context ||= style_context_raw end alias_method :insert_action_group_raw, :insert_action_group def insert_action_group(name, group) insert_action_group_raw(name, group) @action_groups ||= {} if group.nil? @action_groups.delete(name) else @action_groups[name] = group end end private def initialize_template klass = self.class return unless klass.have_template? return unless respond_to?(:init_template) init_template gtype = klass.gtype klass.template_children.each do |name| instance_variable_set("@#{name}", get_template_child(gtype, name)) end end def ensure_drag_targets(targets) return targets unless targets.is_a?(Array) targets.collect do |target| case target when Array TargetEntry.new(*target) else target end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/lib/gtk3/window.rb000066400000000000000000000024771511343406000223500ustar00rootroot00000000000000# Copyright (C) 2014 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 Window alias_method :initialize_raw, :initialize def initialize(type=:toplevel) if type.is_a?(String) initialize_raw(:toplevel) self.title = type else initialize_raw(type) end end alias_method :set_icon_raw, :set_icon def set_icon(icon_or_file_name) case icon_or_file_name when String set_icon_from_file(icon_or_file_name) else set_icon_raw(icon_or_file_name) end end remove_method :icon= alias_method :icon=, :set_icon end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/000077500000000000000000000000001511343406000203455ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/000077500000000000000000000000001511343406000220545ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/README000066400000000000000000000003121511343406000227300ustar00rootroot00000000000000# gtk-demo for Ruby/GTK To run, do ruby main.rb in this directory. NOTE: `glib-compile-resources` program must be in the PATH. On Windows, try the following command. ridk exec ruby main.rb ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/TODO000066400000000000000000000060341511343406000225470ustar00rootroot00000000000000# Ruby version : is there already a ruby version of the demo # Updated 3.22 : if there is a ruby version is it udapted to 3.22 # C version Ruby version Updated 3.22 assistant.c ok ok builder.c ok ok button_box.c ok ok clipboard.c ok ok colorsel.c ok ok css_basics.c ok ok css_multiplebgs.c ok ok css_pixbufs.c ok ok css_shadows.c ok ok cursors.c ok ok dialog.c ok ok drawingarea.c ok ok editable_cells.c ok ok entry_buffer.c ok ok entry_completion.c ok ok expander.c ok ok filtermodel.c ok ok glarea.c ok ok headerbar.c ok ok hypertext.c ok ok iconview.c ok ok iconview_edit.c ok ok infobar.c ok ok links.c ok ok listbox.c ok ok list_store.c ok ok markup.c ok ok menus.c ok ok modelbutton.c ok ok overlay.c ok ok overlay2.c ok ok panes.c ok ok pickers.c ok ok pixbufs.c ok ok popover.c ok ok printing.c ok ok revealer.c ok ok rotated_text.c ok ok scale.c ok ok search_entry.c ok ok search_entry2.c ok ok sidebar.c ok ok sizegroup.c ok ok spinbutton.c ok ok spinner.c ok ok stack.c ok ok textmask.c ok ok textscroll.c ok ok theming_style_classes.c ok ok transparent.c ok ok images.c ok ok textview.c ok ok event_axes.c ok ok combobox.c ok ok css_blendmodes.c ok ok fishbowl.c ok ok flowbox.c ok ok tree_store.c ok ok toolpalette.c ok ok shortcuts.c ok ok Remains : application.c no no changedisplay.c ok no foreigndrawing no no gestures.c no no # Ruby version Check all the ruby demos that doesn't correspond to a C version. # Demo that are not to be done pagesetup.c font_features.c -> https://github.com/ruby-gnome2/ruby-gnome2/issues/756 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/alias_cursor.png000066400000000000000000000025471511343406000252600ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±DIDATX…í–MhTWÇ/3of?ÈIh0MH"1"A©.JK‰µnÒ,RwDƒ B@²©]Y¤ÙéÂEí®XliÑ!b§DI!bÁX°8“/ˆS’̼™¼q¦jcšÉÎ?Þ}{Ïÿß9÷œ ¯ñ/ã8íÙlvĶí9Û¶çmÛžÏd2 ˲þ\XXè?räH0Ö±ìbI5’þˆF£¾ÑÑQ£¤¤„ÖÖVnß¾M0¤³³Ó}ôèÑåH$r°­EÈ‹ä[\×ýÔó<¯µµU;vìо}û466¦ææf555éâÅ‹šïèèxŒ|qq±ÕqK’ÇQuuuÞúûûUUU¥ÊÊJ>}Z’´¸¸èÄãñÏ“5†€l6û],sŽ;&Çq  ´sçN™¦)Ó4å÷ûUVV¦S§NÉó<ïÆ'5çÙlö¯'N¨««KŽãˆ¥Ø¾Ô†††Ü¡¡¡_zÀ¿¾M6MsËôô4ñxœ«W¯PQQAqq1ÓÓÓX–EUU†a099I  N¡P( ¼$ç 0 ÃÄðð0ÃÃÃø|>***¨­­%óøñc"‘>Ÿ……JKKdaV‚—ëºX–E4åÉ“'ìÚµ‹›7oâóùhlldttt5|+ °,k¶¶¶¶ìÙoãããùñ;wp'OdÛ¶[étúëÞÞÞîl6[”N§Wt`š&mmm\ºtixQD5ðîÓçoÀ +åÇáÇ߈Åb?'“ÉÌüüüâJ677—½uëÖøÆ?Þ‚O]u ›6mRCCƒŠŠŠüT>Ë÷_ ãgé8}l]f΋p8ð-0Ô÷{zz6œ?Ó4yøð!àÁƒß½Ì™ÁRU+"@ó+ØÛ@à{ê£oÛ¶m²m[gÏžUKK‹b±˜rµcë+ljMøòàÁƒ’¤P($@ÝÝÝJ&“9ïå&­“€"Ãx>r©TŠp8œ{ÍÖK@*•JÐÖÖÆøø8åååHùެ½{=7.à“òòò¦x<ŽmÛÜ»w˲…BìÙ³ ø½ÀÜ’ÕÕÕjoo×öíÛ511!Ïó$Iñx\---¢~ã| ØGU&“‘$¹®«©©)ÕÕÕ)‰Èçó ê MÞ¤{zzäyžúúútýúuY–¥‰‰‰\Ö_>6šà›½{÷Êu]9sF¥¥¥Ó¹sç”N§sðÐzç¸pá‚FFFò”††% ]¹rE,UÉÊå¯êö² fgffªjjj¨¯¯§¤¤„k×®‘H$8~ü8ÀÀdx–EïæÍ›u÷î]å088¨ââb?ðOsZ7˜À€ßï×þýûµ{÷n†!à«W!/äyì`©{ÀÀOô½~ø©Ì.‹dF7˜IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/all_scroll_cursor.png000066400000000000000000000033601511343406000263070ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±ÍIDATX…½–olSUÆŸÛ2EÔMhø·U0mJ;`J– Aü£ Ìü ‘«n61F ‘Ó˜ˆF†¥FdßUÊ’mÀ®Ý î¶‹«£¡ÿ²Ûµ·ûà(ç}ýP.©Ýê Or¾Ü{Ï}~çyÏ}Þ ÜûÐ¥R©ºH$ò>€ÇÌ ÝÇû¦'®(J=1Ñ… >°@Ñÿ¡©#"nnnæÆÆF&"îêêú ÀB=( Ùï%">xð `ÜÐÐÀDÄÝÝÝ_Xô $zEQö8pàŽ¸633_ºté{‹gB O&“Ÿ;Ž âÚ¬¯¯g"â‹/~;S½ªªG˜™ëëë Šk³®®Ž‰hFœÐv~˜ˆxß¾}SŠks÷îÝLD|ùòåîB O¥RŸG"žîˆÇãLDìv»Û”xx2ˆÉ¨$ºÑÑÑ%%%ŸîÙ³ÕÕÕ°Ûí±'Nôët:Òff $IbíÚöíÛŸ÷x<å.— ÇŽƒÇãi³ÙlM7o;Uxç‰Db?ñÞ½{;Nv»ÝïØ `£Õj}µµµµáèÑ£ûW¯^ý€M6¨ñûýÚÛÛïÚµ‹…ìv»Oý—ÚÐ%‰òO»ÓédÇ#x À²ÁÁÁ¦L&ó·f÷øøøøùóç?ð$€…Ñhô7 ×ÖÖ²‚{{{ü/¢(766þëP9Nöz½6÷ôôì""niiaƒÁÀƒ:ÄDħOŸnPÇÉÀ;wîd!y½ÞŸ”åC܉×Ü„›`‹¢(§N¢ügÚÚÚ( °æ; Í;v°‚úúúÎh:R<iÞ¼y_ž—Ë%-X° L¯×—ÞºuK?Ùz§Ó‰––Él6¿ÝÑÑñ!€biÛ¶m—Âáp÷Ö­[iÆ „º±±±Ñ¥K—N¸·lÙ2$‰1!Ä!„n²õ‹‡ƒBµµµ^Ù:Ì)//V–åßÇÆÆDuuu¡¼~åÊ•6UUÅš5kîÜ·Z­¬ªª8sæL'€7B¡PG~ ¬V+' áóùBóçÏoð²Ý3ë.€'-Z´N–eO:v»}Ò3`4íÁ`ðÚÍ›7©³³Stuu‰L&CýýýÃÅÅÅuªÂáðÙ\€ÊÊJN&“¢¯¯ïºÁ`Ø` #€ÙšU`,nÚ´é½7nøÎž=KUUUù.ÒððpÌd2½süøño\Îd2½GŽùÙb±|¡ªê5áY³f mÁºuëÐÑÑAÁ`0TSSó¢(ˆÏ}¹„ìoÕܲ²²*Y–½étZ¬_¿>7¶X‚l¾›¼àM¯¨B6 ±Xì×ööv¶ÙlœL&…ÇãùkîܹMȆX€Ù(F¹v¿ß߯ªªðz½ÓîœN§Eooo°¤¤D_’/^¨ègAMA±Ž|ûQ“ cHRMo?r‡ô$„Ïm_èj<‹W§–mªg,IDATxœbüÿÿ?Ã(£`Œ‚áˆi 0 FÁ(£€> €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 9]:= ¨h´À£`ƒÿþ3Œ–÷£€Z €G[£`Œ‚Q02@¶ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(£`„€-ðGÁ(äàÿ£€R@,í€Q0 F~ÀÈ8Ð.ÃÐh Œ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F ÑŒ‚Q0 F –vÀ(C D–,óRî ŒŒÚ@Z›È``dø"€èµŠñÿö¥áŸÚ­£` €büÿÿ?Ý,SLWRÜdhæ$†—7×Ï|4C—Hõÿ¡4Àì UÁˆPvÈãfdd”€Ã3 Ìgm0ø$‡ÄúriUÿR=7 †ˆ(YªŒä^`ÜëÓ8õ ¥FXrøÏð¨¦pIgØñtò(( €èÝÂObm(›Fèò5@ü ˆ›qèE7B+:`ÆeD(·ÒÊ œNˆÂÿ°< $ÿƒuþG©"þ³=X!ÔÜ‹@\ŒÃ?£`àÂ|kûˆn û Õ©èÿÿc€$Fpúÿšª@Í'FF¦ÿ ”Á \S¾ºxIgè*ZùcŒR@Ñ{ ÿƒ È¿Hührÿ‘Ø ú°ujÆ45ÿ°°ÿca£©cüÇ¢ÿ1#ÿ¹‡áúÚi—€UÁQ4}E;D-”T2¨¬ï?È,H΃Îç–Í‹‰U^²$˜&ºþÃÓ,#,Îÿƒ ÿÿÐt¢a|Hÿ”þwÇT¬¶¤™gFÁ( ½ |X!ú—³0F.ÑÅW"™­’øË€¨@þ¢‰c˜)œ‘äÿƒ!L¨±6 ˜aAîFF¨JË™{ÁýIÝe`ëþ*’¸zØÌý .œ½opÆfØÿˆŒ ×ÖN{ äìe\ˆÜ0þVy02BZxŒˆÞh ƒ ‚y¼ÿÿ/Æš:$-À8ÎÆ*¤‚÷òþ‚ óÿÐtñÿ?¬¢‡÷ S<aâÀô![±&„†^£€(@9¤ƒk(½u¿‡¸0º9è½ °¨u)¨ÿ#*F”{h¸†nhR9@+Ѐí_¤–Ü?D•1 ,˜§ŒË5ŒÿÕái…0øÏNà!#\´âø?:¤3APþ\u`¡<A’ÿ¡®ÿ!…5^V²D¨ˆi¸¬&jã024ë‰M ˆþÈj-ðуà]ÛÈö'ˆ`³€½U`a¿”&ž£€D@]à£Ý¶î“`¶ñzlC<ÈG9@ÖIÿG¬¡ÿè’ã,ò¯®™ü˜Ñýg@ÚxkEÂímáðÏ¥¤ú¥9'$W`‡VþÃçZ Ã9¤l’[ÙóˆA‡öõñ§ÿð4ňÎúŒˆ¹H¥3sIghõ}< Fy €rH Ê,[I0¹ Ç×êÇŠaÝpX‹÷X·‡|¦Î?Fä%x£ëðéürgºã­ð\³¾ÁKeaC-ÿa󌈉Wp¯ŒˆI[t°¢'z%P_ Ù4í&Ê!|Hïš dø-í ›E]ߎ‚Q@ Üx…¾Qê$°uÿ–H3`z`‹ßð-Ë„±ajÿ1ÀöÝ@EÀ‹+1ÍÀW€­|мu@ft=>ÔÈ’m"Övê`aï ÷è[”tõzÞ5#R,CS‚ϸdüÏ@z+º£¿0@óèYºÂÉÞ[K»Â¿Pâ§Q0 h h ×á#ï¬ÝN¤È•˜¶XvÛB®}vÿ¾íòQK³A‡ª10ºi.ÈJè=G-–£-|:ßÜnÀh+aüÏôé $p¼CwÃ"n¸ÊýGì‹Å¶—,°¼;âÖùØŠ Øú{ø>ãºWVOþ¤v3ÀV|ÀVû€ON´¥ðË™á ,³‹ áý>.[=Æ6Ì™¬…·#–7 FÁ4PC:È-{ØI‚°3t`×p¶Ö?Rw|”ÎâZõ¨¨ctC[’›±H˜4Ž,ÇnÔ'Ô,ÇZ7ÎÈxýÌÒŽNdufÑ•@ñJh?âMƒèë'7¿!Ùñ$ÇäQ ]ÚÀ°RÒ¢@·,Ø7»ìµsj7踂l Ÿ±ÿ˜Ñ¥·¯!ÃíL1Àä`ƒ+`ÅL Þ¾mÓr‰Ú˜ä—3Ýhn!dîbÚØá5Ðq›ÿÿNŸiOð!¾Âù=§Á¯,ƒ9õîªÞ8ÐÆ-Ðå'@¸ÿ‡;æˆ>Ⱦ]ÁÈÀ¹‹ÙŸŒ°ÅóÅ¡X{±ñ•ëò€f©¡t<À &¤]¼hA9Ͷ]âÆ­³š<· ›^¿Ã(éÃøîèŒpßÞê½ 93µÎù1q@MPÚy ˜ù€NÑrynX÷¹«Ì¤ Y]eÏy üÿjDÈ"4ªá#v8ò4²`sK‘.ú¡Œ#Ð@ éÀ |X|†„Ö=º0€­gÀ"×Òð€ù‰Ø«.¯žôM74T@ùÀLjÿÃÅ Œ"K€£ PµÐnX9 ™Wd„´LÑ#t Š<&¡$Ôy×d¡ElíY v_ÔŒíÌ!Š€Cr;èþVO ­¦pW02,ö ù½³K¿ ýU@75Å‘ï)f‚¬A‡•ê°«$¡ÁÄ[eOð)ÓŒ—‰q“oÎtg ž|FÈYóHe#Rf‡l¸øÿQügD¤ˆ3tUB!R<â@ÁX¸]ÐÝ0w .Äd€Z+ü¡i tý%®aKÐ*#}H‹Q®ƒúLÐzUŽî?HÉsöYL£%Ž5Bò##ríL– ›!@Fd7í» T±XðoÆáNª€’Ž xt2]A X”0Âv ]м ´ˆrꂃ³ØK|ä2‚J^r €z v“hlý4¾–<2@WÎ댈$= Ö$0þªæÔ‰Ô.Ã9L`Yâ ´Â ˜¤¹¡Nø‡p”…µ‡®þ1@/Jeüu,¤ÝldYÆÕ*\v|QÓ7â=€ {Pç ½¿z0ÃþÙ(«¨€…þ—Ôž ³Žtù;lòô?tfÑþEtªÀœÿïÂd+Z`aT›‡4ÿ‚<@ÿ:mÎs2Ø*Dó! Hص 7@F8ÿ#ÍAlù+µ!U2ãx óÙ!ÿU ¬Ô†ž¬óÿ±< ÿÐÂRŽCV¡TbP ð^ ¬ÀþÏ€-ýþ‡êSoB€3tñ¼ÂP²ë€*P¤qJ­– „вÃ6`è퟼Æç…RBFB6Ÿ½Vy;lÊ?¡ ~CªµÎ4Yõ9v² ˆ*J1Q.QðŽ!Âçɦ˜;v2XXðŽàŸ²AÑ¥gNô+Y” éº:”©,Cü [JÔ[ýu/ôÿã~~q÷ß! –¡QRP2áI§˜jƒvo·MgÒD9 N'•yg¯dˆI0-z7ù’lBò,˜z|!}i¦˜8i©¹|¿Ò ['D!s§öfÿ}n{ÐúS´A×ÀÜ7­¯q0‘R-æl ‚Þi°ý!=Ç™¦z"uŠb‰ e52,FËséE݃ŸÉêÚp?;÷­bv+”ˆ ‡úÇ$|oÿç'6é<ȳšñׄÿ€¼+Öi †¡và/˜ØYA0ÁwTêÐ ‰ é$`de@]øª*Hü ;+ƉßKr¢J DjÓëÇιî³ïî/ªtXe³þ¶«³î{öÖŸ¡X;(;èo»æ>ñÙéN4Uì4²ùмpÎ;‰Z©‰(Í€m[#Ò†3–/m’”bç¤ÈwSD|<n^Ÿ†­0ýÓÙí¡³8B•-E¶µÁãÓDìÜþÞjqµèù,/_Îæ÷ió‚ [ÜXkBŽ\‰K\!;nîìSDøæ.a€z¨¿}ï¦Â«&qG\ެÂö&ô•¼@£×"p³uœõ{•D…ÿ&Æb„þs‘F­êšð¹XfËd?8%ÁùĪ|/¥‰Ö.Ë€Öá…gßFÆù¢"nÿãÿS Ô¤í`ëþ™fÀ2,c êÈ?’Šü.øz°$'„K«'~× +¶nÜa‰J?¼(HI2€/º†ÙËI¬ð‹W`Ù© „tÕ±¹üür FD9«$ ³‡ˆ5i@QPWýxìà?c8dÈà?R ^fˆâˆé`VΩ]ÿ÷Î.›‹n°Ð?ìš:r†!l êü8´û÷Ù¸'PÀÖ©Ù BcéœoÎôÿÿ!—’À¦4aSxÐÉ\ئgFjdf6‘ ZÓŸp…`Ø@ ‘¿HóÏŒ°yZ&Øô0¢ü„ÿ¶Tk ŒøŽÎfÏ»þƒE-ÌœÿðZ“á|Á't‰"õÃÖ-eÂRPÂ4QM;p{aY"‚ÔÓñ` ²Àöª@ÍSÀG‰ÃRP«ÿCBÚ)ÿᣨЋi`é Ã-/ 3™“äðÅYÿáXÉ÷>*Iz‹n˜€ä=Â0 …#p$F3,Hœ‰V&ÄÈ à(,&ÄX=Ò$Ïq˯`` [DÚÚ yŸ‹ý †_.äó—sXI[O±lûdžâó±?½›]Ê“e{4oú~_[G܈ •¤.¡§ðÝ”©)Ûæ“.%°Ë%‰hCålD=áþÓ‚ôƫ֫ ÷§ûŽ_m ©òÏ(³uä ¡Âdd~ÓN7“{sî·‹“¿Q…3¨->sÚ ám¥7S³  XVñQ‰+ÂÆ`²˜‚XÊŽ}SÚóWD´èI!±P"1I®` ãhîžlžÝ#¬]éÙOùì„F¶…A…ÂXÂÍåà,ǘL\Šœ Û@‘0UèÏÖ‡n}îm‰ðŸ’4Ÿ#ò²±‰ßÁÄ´„~BVmIdô³~Ô.6`n?ƒdûýþe» @Þµã ÃÐø,ììÌlÜ$vĘXX¹G`D¹ ,åÑøƒRQÁÀ@†ªªÒ4uêgËÏÃ?wÞýíË1¢‚ÅÅ­Åñï=פ-!*ÕGírØ]»ÛO̽QÊÛ.XN}ˆ1*éç D¾›=¿ ´L„dïjÀP²+ÚÏÉcÍHs¬Cç•ðø°¹ ¢´H“ér;¯ {ܯ› úéUñr5(Vtv$[ÄÁÂ&‹ý;ÉäŸË<¥2•Æ%„÷ðøu¬M;¤YÅ*1|ɲ|Ð ž]"I³žÉSžø„¾f}Ú´Ð5Pp–²¯‹’µ0þ§nTdNåÛóõPAþ:w‡®G"3ÞIjµiÜ¿K*»ÉNx°ËÛH o"—¡ê=à£TXŸgHÑö:| ö¹= ïÚq†ah½3p`ggç\€…ÛpŽǪ&yþ´i+$$†ªjIâ†Ç³ýjÿðßIÎo{{6l}t4¥Óçþ•1ÛI»/æõÐàZÏ[/Û)-,±ÊF}~mÒ5êä K)8Á“ 1«9P@{eù›ÅYKw¨$I0…«E @"+T¸]‹÷q<]o—©¯VÐê=÷dzeÝìCL¾p67ÝúTã™IJÊŽŸ2ðôxgbÓŸŒÇ Gß…ŒÓâí}ì!3…É5£t‡Ëg—ÆónköÇo¶òÄ0¢ÆõLÅ}oRÄ™1,qŒšµJë'Ùá^¥mh')!¦ $"»%;)دôš³íû¢,sé$™9(N€•5¡üÔ¤ÑÃ.bC uYýemª×bë‘ìµ´`oxð× ÿ%ygo„0 Ca«#° 4lÀ =;P2 ‹0+q+zO „ðwGƒ«¾sâXÒ'ùÅùµÃ?}I÷µ EîüR‡#½âÈÜŽ!Ü*åK^|A¡žUÃðY6ñ°$êêÕ£[ñÙœI¡B‡úi¦¸ö ñ/Õ$ÃÓÙ£{ž®¶Íµ÷(½Ñ¥B¦h*&á¹ïi·Ó´NæëݲoŒã~SþáÆ˜©Ò7 _Q&` ýv.o•à]ª…S}‘ðÚkfãåHSùC-@º£÷ï;J*W0 ŒCÅ6p%A2¥—ö„–ðp¥-öï@Cú…:J­Õ +yÞøž|³Ú®ÇO&jqíÚ@•’^ѼV|Mž;}/J•ÕÝs`2JêlO‹Ð¦Aý´ƒà2ðým»@ÞÛ ÄÀ÷tôÔHÔ,À”´´0=s°ƒ°9üg;É' „hˆ„D}'¾;_,ýO¿ûÛ–)xü_ÿ„J­)`Émÿç¿ØìgõZ“¸QöS}ÀÒ=IŒSèí;xæðõ‹*!1½k@'-žüIŒ`õ|(æú¤Fýç´hÄíŠ2N,®& ¸3X-W»ã¶tËép­;'}ððe ÀǘÅ'Ð<–)•[T´Ó¨–ƒöæž¶9°À»Ð]€ã¬jûaöÉÐU EÇ2ÌĬ4hWÓU²Bí-.$sϬŸ3„9!±Ù}å±Óéx¢°'—vžÔâ¡@¹;iƒãÄìÈ´£(O4Ñ ãJ$Zðþ{{eK+G­ÿy< ïìq†a(loˆ‰ƒ +ç`cæ œ ‰[!Sšçç±Ð©?Rš¤ýúÅN­ð¿±Ý{ìÞqvê?”r Ø߃¥€Ý‚_ÐQ Z»¢ã¨ÜBÕ™f«m"¸œu6±x-°™{¾Éz{˜gÊÁJ’FUéL<~qŠ"dáþ%…û)öm±ÙåFPúg¹-:§dÄ>°ßfø2F´¸¡oy¹'T;U°osEn@_/|e?ش٠m<>2¸Ëù1V$Pܳû)T°iÝ¥]…vÓ± Ëc»›¬Û¤ôâ ÛqŽFw êÎ2Ëæ$ø¬Wýýñ´Êšh9¿{4$Î)þ:¦pøVµYÓ|„ØÄ3õ1ëý¢u—þ—þßnWÈ»–#bª±Ç«kñj%žíÁ lÀ®wù<Ø,fFoŽ÷ Ùax< üªÁ¯}Fû½7_­ï¦^Èïþ„î熧 'Ú‚04›<„Öä†_Ò?û®’Ã*‰ÈpC8,èZ«´K‘МÈ-ùW«)|F½ÈeB%wf EV³•„m!AØÕ¹3Q¦í4zhKþÛþv<àæÚ†ah4+0ð @ËT4,A†i¨©Œ°#½çÏù’K i’Üq‰PdéYzÒ/:ürõœ|X¸&Rz¡3^É/DÚ‰µäƒ‡íò™A*ézÒ X¬Z¤hºÆh(N”Ꜻp¾9ªÁ'™6=©ÇÛùñRèÆXaÀ& dær“õ‘Ñ£*—¥ûCtúûÞ{×Ó=žž¾}2ëÃ;„„ {Bì¡`2ùèŒâúUäÄWR I{m)€¦ëlG¹¨®K¨R‰¬ù\Á¨EÀ7luî†lw­Â̱*ä Ð@ÚÎûQ&ý”éBÒ‰uÔ•ÿxS1wëÀæC[2î=kTêºáÿDTSapÆZi>Á”þÉY¤dÅÒ§Ø]{#oõ]šû™ÀõÿÇWòÎåa¢Þ&.F”CtD=Ž[ZI&8a¸1á”É!1!Ò>},þÑáïQüž ÄKà½ðN?. §u{iDF›+A’ö;=¯’lË£{Á4þ­«_Còœš^ P1Sƒkdxž/½<Ã9†÷¡³LÏ.ºIª0=eyyŒ«Ÿ»Nþýö¢¤¿¹)éý£[3« ÔÉÀk ¶¡'½PÌY„óâ_¾‚eˆm#|P\‹ Ò¢£~ÞÓÂôÆVDáƒð‡™¢P0ÏÎáiIð½pýñ+:£Cþž,äZ{/4T£sæ1áavýÅ)fó” PÑIï@ªap#¢Ù–R0ÇN>Œä*E1‰Ó]#Üe :<å¿ ç n†a`úbÄL€XŒÂ“ ˜ø0Jîì‹ä´ðDäW©u¢&9Ÿ/v~ð?‘sæÒ2ï*‰H}¯á¯6‡‘=/ ˜%íɦ"ÛÃ3ÓÔ¨ÛGêf BuD¼ÙóÍLk;. s‡ãŒÔ|'ج ·ÈÃ×È0ÀÎÃpóB"l`èÇZ+)xe»ÞÓ¢Ëi~}ví±ÇÞˆÁz)Ù@2«,Ø”œ02qÇ;0kg¾;ƒ—Z ¯õfÞG3'SQŒ¹ìTLþ{e®&vIøþвõLäEcˆr8^”›a?²GÏ6zX„‹T¾&ÎBI¯SÌg=›’Ë“‰0Ø B‡¹0%&­L›É9 öc{ @Þ!AÒ„ ²Ÿö`–`þ­Ã¿U@ÄÜîÞ†¯#3¼“;2,›»½ã¿fî½N òëÓ‹W:úvsâËR·Hbldi‹H¤ÞáVµÑ4ê{(Ž •@Xa¢\ùjÅYd}jGÛ<ž÷ë{ü ’¼%=> eMògë•“Åþ ©«m×]E29Ÿ.·ckþGýaׯìaX±NfÅ©Ûf)9àríS]ß1Ÿ+ZA¤©ÁØ,tôÎí ÈGˆ&# k‰ÿ(ÅL f©v˜l…ß+Ÿ²ûLÛ)·Ä\ÓPG‚Ûùa 6ç=Q•Tð‰ådᎋÅp‹õ $¬·6LŒòÛvy¨WP>¨~ïë¹ÿô?w7Ã0ÐoÆaø° /FéF¬À™VöÙ—6*UˆN’È2û¡@gá*NNLw¹ _蔇í•Áå¢ÂH½9TAëÿKeŸxa4%ša}÷ߘrH™)”$ID"àØ½ŒŸZD_Î×û¡7ýð¸=7¯·u²ÐcвIü>T¢ÄE"Å÷á+G’,õ²˜7ºI³GÌ+{à÷$¼o"Á×;åÁýûÚ?ŒÓ›Ã"1‚ÿÏ §\1¿ž^)S›ô$Ã>N•Ô´ÀG^b—¨© F+ÖÕ7¦]!kÎ6(Y2.1¹¹>ÿoÇGr®ea†5$øH>áÃRÛé*í†Øi¦e[b×vµáûð;znW4®CN´@JyêE¨oô¥»Ä+ Ÿ-2&Mi™lÙÇ£ MOW§:}[¢Ó{ âóQQþÑô±OLÀ0N ”ÚDXB %h<š¾™žK4áúz¯Mÿz¦Î,Fˆ¶ÙVë.‹"—!Lƒ A¢Õ>+ûë…JüÊîª@ÊY—é–&8tynoùå@ $l >‰½Á«îb5d8´>®þÚ}ÔŠà‘'2N@ÂuO²Íÿ’#¸q‰Ë9بù˜jõ’µUÃS6ÐS)ÅñÝ:ÂOíF§@Ú¼âÖ y¼ ï r†aXóÄ ù&_àE#LIì¸LÀ ÑË4­šÖ¬MœÌî~Õá#²käÞû¦Ïî܉< úb"ø Ï,¤ÚH™‰Ò õ˜)Êž„OS«Mc´eaYCéŠDktL‡muú·õp »à[D—):‡*7¯'ûƒB'ª%ióBEõ<¯íò¹Åƒµ^Eƒ%€ g)ïØ„jJ;€9òֻ¢Fd; EƒhŸ}’4zTÒÉù%1+f ÕCÊESwîG„o,»;gFL=/é’±Õ<ñW/ìÕc]&Þۧ|j¢Zµ­´^Eé( ΢¶Ùm^àëÅ[¯`Sê€3­ûÈ„þ¶= a •hÙ‚(銊è驨žމXÁéÿm‘ Gƒ‹pbÉÒËgËFúu<üoAzsÞëÓRý-Õ•ô;<šøÃŠZy¿ê~QÒ‰€ˆÈÆ™&\-m´qIÜ‘R Õxm¾×AÁýúhèÒúe­‡µ÷Æ 8rN›ò¶œ÷ëÓt±=žŸ…w]-}—œ» ¼&ê€|½“ œ§¨}<[nçÇÝêðW½Ñä¨7 fu×WÃRWØÛÅ– ®Ô.[}(R³iS|šê´ðÄ<µD]È=óІ\}àØ©B.U®ˆø ªGšpRùÐPÛ$åqøHãHÞ`íÉè¢\„¸áÁ:‹4T7¥°G©Ú` Î_ڷפ‰4)‹øù±:i„Ù")ñŽ"Jíþí ÿ.yW„0 ¡¯ð¾Ò—ø/Þ¼øÇˆµ, trÐzrì¥3M É0Ý_üÑG[C  ÚtÕN¨‚û|Q‡;ŒX´`8ÁJ„/"û4Å™¯¸ËÂI3(´ëz<ÜçÛe£^[&rÒ×STvz g#̱ÑŒ½Ì"ºÀ¬ÄÛ¥'Æðø¶ŸAÿ6ƒþùsýxÌ$ÐÆwé¤ý Ê.!Xœ¦ÐÉ’Ýé yÊ2F ÏTW §h E}¸"VI=ª?ª@wŸh„×Ô3Ù½hâìÛ­›Ì³gE©§?3 ÞÆ÷q¬²à¤¼±½–>Ê*®z(±¶®£ò6¥FÁ¥4â•.*+«& !ŠÁÎÿ"Ñ£áª1þ9à @ÞÜ ±d3ž¬Â ŒÁŸ“°âgªÔ¾øªDÀ ¡FªTõÑ&×´ÊÙ>ç_!”®Ž¤à©Qq¨±ôÕþ °{ËF,¹`‹_ ‹Oö¹L©¿ð¸_ÏÏ¥·¥_”n;tfU™Õ  Æ!ô¸KFJ¹Ž§Ë§›jl›”Cî¸H·2íw&¢¦~yÛøJŸ!ø.‡W¯îÌJ—F¤¶JØ9éYLùcs¤WôrfjÓ—6gÐÇ ¬ºöL¥X´â4͹Z´)äcœ”‡¤«Ä»Cn9ê¼`”Ä@ÜEòxbÝDxÑs át Ûht†š¾gZZFÄ蟀õ™Ó8í¢½àîJŽ„a Ô]RJÚI )„.ÒI&PI»"#fÂ#üa†>°W°ÚµÏø\lû²Ìf æ‹ÁyÒÃežÔï|>øòºQUYd"UÃ]8|ØÄ¡—a}ÑÇ</ªÉ©·f«Šˆp?*ûÍþ'¯º‚Üåz»ï›Âú²áÔÃxÅà£È)ï¥7Àü¶Ž>k+ç²y‚V(àýrrªKû¹z¦ßÉ’=2ǃ1Ÿ“u½jññ Tn›:Šá¬´såÏó€R'€p*—Tê/KæYT´×ÿÂŒíg½BÎß”Û"xÿ Mn—*ÞÝ$ÕT‚O°Ûø p=”»9kù@ÞÜ Ã@ûÇl,ÀlÀ¼ƒ?ë ±J ñ/QKûÑG[©UmµîÙNìË/þ\5ÎXvUä|¼—Àƒ†àüƒ+[±‡>r\@Ý] $úR¦Å/ñc»]N÷×áj ÐQÚEºp`¼fYAú'˜üèj…Óa<ï6+ÖÆ®»oë©c±±Æ­âÙÔ U½çæ¿î„, K( &h•:#ÀÈ(wU–%"â>³*ÆrÛKÚy˜†è°lIõ!«µ÷–Åi·ÈØ–’ŽÉ¸ßò\ô‡Ýó_s4£…LNåx‘ìÉÀάÎh[&¨3þû:üIò®ía* °0›ðÁü³[ðϬÀ ­ µï|•Ò¨ýABDÊO+õ‘ºgŸ{vð;Qûâl9 ‹Ä²ƒSã͆`ŸŸàÒuhJÂ’Õ†ªbøê8ž¯û:­}ÛåYW倞do†ulá—Ard¤Wb³5îwW·žV_pVW XdÒ‘R?úLm€)Ÿ§CZìÄ—âÄyg$ºtux½ÊÞ)OAçåšr:‘dV^Èá g(ÐóXRÒ°-R'T4‰„цì\iÚÇŸïX§xï%6µ“±Æÿ‚y!ê·di´Ÿ¢Ï°1Í8G›±çøsV3ºŸ³Ô?oÈ»‚„a(/Á:¼@b žìÁŒÅ—1`…š´¾³(•¢}äÕÖ²’sbû®¿ø=0o§ZE{Û|VÍy0…3çX9‘Õj_)s’y~Évi’Bøöe¶ï·Çs÷G)ôoe¸ «=¢s¡s±¢ÒA#TI !sÀ¶Õ2n§Ën…Ñ9¨±IyÓ^]Zd•À=]ï¬z$ÈŠ}3¤+2ŸÛˆ]"­¿Æ“+¤²… k@žÎ ¢Â`*Î:%£[{ÅNËýÃ#¬{8á)„ÆÈ[€rç„Ò³³®Gþ*Ïß™vø‚°E¦54—*=¦Ì†•ð[´[N* ¡ûö¦W?k¡4o0¦™SVÕÈ -¹¥12JE#jèù ¯µ£‹ÁXg,Tû€ÂºŒ<3GH‘ÓÖ.Œ3WTš´î¸½©ÿ‰zatM.[Źï0ÙlYK0xžö$¬ ;]ÃâH.@ýk´Ì‡Ô]Û Â0 t`>‘‚˜„­˜‡$†@Gkû÷‘¨?è/¨ÄIkÎgûü µg‡žÌ>ˈ~ÞåÚë]Ep„oˆñðƒƒ›‹WìbpÄdÓA‡óu×ÿ†®i,Ñ=/M§lzJ¥S ‘t‹©EAßd="ã"2 å19Ëakö› *!û`Dí:lf,>TÑ1§G‚F‚„c±¶6¨Ò :— 7ñ0ÑéöÔÆ#+ZD8Íû‹Ôd-èhMO?xñ¨ö2çšï!¬þŒfãYè ëê{BÖÕ¿µ°ÑLgÔZþÝP|áz |UÁuî#ÑÍD¿Ù£”RýÒ*õm”W'¾»Jr™Ø\’ð–ü<Ù7®·ä]±Â0 ´ ŽQ( 蘀ž)‚-˜ˆ2%Cä„cé%ë…»t.’ÆDZ-)/éõ‹ÉA;³6Ël¡³žr¿±Ñ€g¯5Á'™'Æ]^ÜQ$³D ¬gcnj§ë}*oxH;ˆÅ«<,¼«×K&ôk‡g}ÿ·Â7cóçdÍ1{ß~,Á–Æ_‚eO(îÎÇãùöدNÈØ;-’E¹Z$c”ÝYÅžaÚGË|ÁÔÀm IÅ&dJƒ…Ô1dRÁjó!¨.øÒr‡&î‘$±|/s§|sz†R.ÀîØ„C=ž¶ˆ–µ0Ke6ƒ™âPhÆ ¼®”'‡ý!wÔ_ð5Ê8о›øS$':ËE1s¥³tæ¡þ²}àa ÜÀÔ B•;† ¥c V`†h)býKq’Ë]:p‘"qìÈŽßÒ[–ðãÏYvj©ÝYfþ´Ì³$=…¾áü¾k…„X)ÐMÞ¬šHû,¬4íçu[~%srñЈ®þU{ÝWÇ˦Ìö¸žÞíºµ¥½0Iš+$,º+züyí{#%w¯{|ë÷í¬`¾[3ÆiÔâÚ%À+òínx"2é i:hÕMÞ ‡@éVJž¸uÁ÷ÃGÁX`%iŠ“/„ú3÷H‰4ÙP…ò!üÿ’a¦º ¼>5á–ZòûSÜårñš”…èÈ{4´tÅA1¬}5I·i,_K’"–’µ;O•ÉìA4ÿŸ>PwÅ8Ã0Ð L¼ˆ…G±ð‰>€03ó&žÀÂÆ2&¶ÏNQ êDBU!MªâÚÎårùG‡ßrö}ÇÞÂõÝ1eYaýŒ\‚wØvq§d°6Ìž¸‘9ä›OäàãYØW{D‘¾æÒê¬5Ö×J/ºq©åf¦òÝRœþK¶½ß¬nRo'W])8ð*œ‚YŒš*Ñ8Nª†.(—q9on–]ʳ6 kW¡dÔ¥PÙ5U˜<£õQƧO1ÃnX*Q 3éÙ82|<›7pðó€€8ìˆÊ\‡«T5m¡_! 4š¦*@(A!±©\G‡ d¦Á˜#1²¡n½8Ëá¨%&©óæ0¦»„ߺ71Çc;¨aaVÿ ®5¢«%{€ý¡Ÿì0 þrÄ”‡Ê>òŒ>¶]Mê  »zÀ$tï?R&…obDO|Œ(™’yÿ#vêR XÇ׃–Zª@&åø 6‰èZƒ°0°pösHîÀ,ôg—¿fÎu@¿|g@«/郚…TèC†þ#Z˜¨“™(•/80z®ýï†Nâ!ÙÛœƒ4© ­LaöÂâèW Êé.Ä$?ôZIøÒOè\Èág°uåЂO@w¶þ‡M¤Â[ì° åð1¤ÞÄÿ`»q sâèn(<¼‚˜[V*ÿ¡sŒ°a)áõ;T?ÂLئFDƒs/#Ü-ȇõaÚ…˜†ÇùȆ5èÊè²O´Epÿ#³ÉØQ?\@ò®Ýa†Êô Á t À TÌ@KËìAÇÔܱ=ÂŽ¬÷D.Îq ‡›¤‰?±-?}žüË¿5©c¨Ÿï4+ÐiûAÉ(ÿ–…Í]°i@ÀaÛH?lvÍŠ®4¤tý òXnöó¼C†Ö;$×,Êp@þ7KŸUlá³ÜÇõj{˜ö¿;w…pv¢4iR¿h;•ŽqË ´/Õœ·I'£ƒ3âÕkÝŒô¡zß -Dƒ@ó@&Ê·æ»ÊÐG5(Bjyh©›•ÁΜÆNÊ¢öÒœaÝ@½îtr~° Y­h§EŽJn6 ¤$#EU­Jî™?8JÞæHÉ(ÿš^¿ˆ}Ö?5k– +8¢‡u•Я²Î’k%ýùƒ ZÙß"ü§ä]ÁÂ0 sF`–àØ…-x³ c°óp&¹X²Ò#m'øÑG>I›DqËþÀÇDnq÷‹ö ¥33å¿¶º+Ÿ9ŽÂéXtAÐÓé’ÿ¥ f-to¯.·cíó ºª¤w=7rð4-j‚›Õõ9ýk‹NzÀ+ôæH‡ÔÉG÷ùC´I÷˜ÒxŽž$=Hrë•qEõ¥­oÂîxI=üEŒÔŠKZ‚Âu Ji…F(…ªÔ~þ§Hið‚ˆ(j_âr:´Sá•EZñ°© ‚óVáƱðÂw|¬»µB:z·@€·‡:ŽJ[G*ÒI^Cÿ>!‚{õ.©Š«{Ó’¶OrÔÚFª‚ÓÎr³›§®‚njºóÜ1‹p‚P³ãsÞœ³ô\´¾OBÿ‰Ðè‚wõqSÔK^ÀQ°œBøóœÅ >ðs½,L½¹÷8ëhŒFf+ Tgòw':‚™/÷r‚a³úÁ»¨×©ß{ÜM¡òÄ$‡ ª ,í`àêUIø ï°öœ¶Ö5!P.æ)¹ë©Z§ˆµèºüÀ*Þo×·ôÞ1ÈËÂ'ï5Q€ìˆ`ÊÝ”4>V\?Å­6o mnA2k·ÎŸ–‡ä]1Â0 4 /aeGB0ð6žÀ„ÄÎÆÎ x;?`gbd¦&Â>û@-T0!*U’(Nj_ì³ó« ŸðKGéM„×ÒÚÿRáúsÀää$M~sÒ2äëâCô1˜.»EÙ˘}(øM=^šÚzucªÑ¶K vGÉÚ›ÌV£º>v›ù±|öáÊ 9M¦.OÆ øxç׳íÀ_míÌ7Ÿ§*Ë‚ªHö÷:-,dŸvkíôpBò—Q>Y&â7´M§–ˆ34"Ìî²54.¿Jú§Á0K×—O¨,©\¨•jæØ1ˆ u¸Z j§¾¼Ö‹á©4Ûzÿ<Ÿ«³PUõ1Öbüï>‰{ÊeJ{5–›Ï A-8¬þWÝ‹Ü ïÚmb¨o:X‚"53P1¢§É ”°% ˆIs‰ý|9¢ Ñ ¨ ‚(ÎÏ~Ï~ùŀ߽y$ÄíLæ²ej/û-ç|(ÿú‹?&vY%¸gpµÈô >þ+NëqÜ÷<¾¹ãª¾w›û»ß$d‚2e}r&³å¶Èí§ úñûWYŒTaAT;x®¯d–z-ü6ÂGÿ³FaT1„~l±v¼3ihaSŸÉçeP¾X͇$¦±¯ä€ÐŠ«’-˜Ö¨ CŸHÌžæR‘TzeAÿ9@ïG 4PfÛ³´‘eìä:¼ö"`bÀ^CH:Œ÷ W¹*NñBï™ì9Éjûàl¥dàcâz\š“HšIEð™«dwî€=Ÿþ5‡ÿ@C±ÀǿܒpE€PElU§Îr-`¡˜¨ž“%ãÿÿH­>ØnÂÐeŒ‘ŒÂ>v‰˜ÇÖ([öî@]& e”ÿë”á-ö;G4ÇkÐð$è_èzkèšmHë :, +ør=%`¡oͨݳJí¿‰âOèò;˜» ã¸ÐzæûØ>†OÛ¦å¾!àuþÂç`”02Àþ‚‡/¤wÛ ]eƒ:D0—ZþGI;ÐÖø´‚å/¢`…o*ƒ 7à‰[èxùXEi”À—b2 sèä+t²¾Ê >y‹Õä9è’L´óäÿÃZ@TÈ›ºð ³àý•Ög€vÍ2Ÿ0ÀZøùѳýÛ«€Ø¿€ @þvv|XˆÕä5ù£cø@@C±ÀG/ıµèÑ+\•´… ß!K5L¶çæÂÆóa¥Õ Ëè°3ÈŽÅ$ºç:tó˜jQóØj}‹ØO 9 cø~€·– …ÓÿãG6œ$èPðâçÿðSa¬‹ü¶"„~ï(¨SrNíÒÄfÜî™ÅG€Ô-Ä89ìhÄP¬ÕË€Ôõ†vÑv/˜@Ĭ¥ [Ø\òø3ìþSø†&HK’¨Ø†*Bž—@:Ú—Q0þ‡¥EØå"ˆ^¢‡ƒÓSÐÊqÞ të¼ðEZñòÒ€ô”¡n@ZŠáè+DˆzA|h„‘çŽ ôUY=ë«´š4oÐÄï`À†ßàË,‘—G3üEº Óˆ‰éˆÍ[ð zhú…¯½GêEY®9b[ø4T¯8„öðÀ‘ÇÈ€˜m…E$#j¤2¢‰C¯Œ0>#Ô@ª%`+ÿ·AxÑ1 ‰ú@k$`%ÌåðÑ#äË8ÿói+ÓèJ{¾]÷r…¨Ï½ü v¤G»<æ‡ÿ_^;stQ#±p€-Ñ;Œ0w1 …9ý?ÒvÆÀBÿ×ÞÙeÃE»gqMëcj—ƒºð»F‘ÂÁ†t-mŸžó°s!…5Ä-`Ç1BîVd„vV@A„ÿ{$ÁFXã9ðøÐ ü*@P‘»‡8Œ 0yèÄ…e°Ëñµð C9ÿ!÷½Â® þ6ÈùL°ä¿ñ:ò=ã{ú…ކ’Ô!Ã\`ÇCæÌa×þg„Ì“@̇,2€'²@o¥åÞâŽãGf€V…a¦Ãâq;2,£ˆ*X:…Ä5ø¢øµ¢pÏ"¹Ýጠ”xd€Š>¬öG.ä°G.’Š8t ,ãÿGÕBpaeßo uÆ0¼Xh´ èÂH1*Ça™º~Ù6ô¼/F ›ÉQpC®ÇeBì †ÝIÍÀpH]?¶¨ñ7ÑŽ„T};Ia×´B,…Þz-ía¢ˆ¢¤ÄÜ%µûÿžÙ¥÷Ðj~ûŸIV3A+®ÿÐâj"ìNÖÿï€üÃć,¸e ±2$Ä)j™ ÆÁ [x™º†ú€'²j‡µð™ Ë« E;ŠnÈUªr˜Z%£7&ðoªƒ Çü‡"ÁªZXÁc3@ëúÿ0—ÀëRFœ ÈJ"D¥ -]`u4,@¶2AMb€ÕiÈÕ4E™£·Â´új/—tœ­4˜/þs Vb„œËrˇÿ áP _0À–ØBÝ‹fXámÃÁ†ælÀÛ ¡\àƒ#ýM4y#_,ý’ÁhtÞù•½÷ #J^™ aqD+f'Ä-Ð w4¢˜…¥s¨û¡ û?¼1Úùz娢¦¤º Ú®ú÷Ñ "ãC‹·°›¸`¥>ü®m3—Ô†=³KP }HA>` Úƒ´ÆaZÿÃ9 ùŽKÛ§åý"ÎÅŒ°1{xÝÇ€ì.hÈý‡99£3B­%¾jg„Í‹ÀúH^€+:…a,´n€vA`aˆ@†q ‘­Ä&3À’ØDh¯ÌfD\ 1kÏ®„VŠŒpwAkD‡‘ÀpOþÇYPz*,ž)&<„‡ì‘ÿð9%DhCãZöÿCÔ{ðü#ºe4\ |\lä–?ZKÞèd€gN¢Û}¤ƒó+z¾©s†¥B@k¥€–É0Âg°r º}ÚÆBjT!õbPF…É{Ç5}"×]¼Z¯ü‡Yü‡7O!N€6ø`-Kˆ”iê’Öý~ϬÒ÷HFËÿ‡Œ£ÃŠ'$§3¼g=ÄÀpsûô¼¯¤¹ø?lh ÞO€¶ç‘‹~”b)ë3B—ª’Ñÿ!³ï°ž¤èa‚µøá/¬)ö*¡-Q¼cà°¹(Ö¤†µÈ!þf„ú°ž!ÐHσ Vb/ð!×2B»8¯l‚˜k,cô þab BK¨¸ý¸Ðp  %ðáM Å?€ÎºßSnö‚#þC÷ @Ý 59ôa‰¥qÄ€=b@ Åÿ1_â’ƒ´à #x³šà¦JÁùÝï€Ô;£ÈÒ@ëAG S¯8¼Ö¶‡¡_Ü.5~ÞYï€øåÉÅÍÄÝàÿÿš{!€lPZÖ¾ªý½cFÁ+ŠÜËÈðhèy¤ÁXïˆ>ubdÞ‘c€÷d°¯YÇ †ÿŸ6œF*a7ÐÆ´¤‡¼ð11XƒÔ x*eÆk@eOàÝ>x'áJø;¼²g@ ºÀš¹LO°þÜ”a„7‡¡E<,œ`Îe„WÇPÅt$¡°ÂŠÚɵÚ5+ ͺ@[9 §´óÔ ü®r³ ¸Ìø’!³oÿáE=@‡ëàþ{¤âšÏFì@‘uo÷( >0‰*ç&FÐx&ïX®—%Œ Ý‹ÀÞãçSKZ)/àGÁ( (j;æL»æÈ£”dès!ͺËM7b3«¢ûœPm"r÷Ÿ Þ/e€MÐ@¬Aïí#·è9-EºóN#ÐPláKpfY'h7,SÖ£``aï ,Zõ KNá]h?Z@C‡¾á]5ݲ®3ÿºÊL6c3º! 1ˆ^ïÀ™‚LùB»2Ƚc4,:r[ø4×á‚Q0 1(l;j ,‰AÇsC×ïÿ‡ì{øÝäÝˆÈøq¨d]=HZ¯¼ëŒc!“Ï H{B GS£ì­a„Q¤ºöþ? î†+ ÑŒ‚Q@5,ìùe«%#|3b“täŒ)І5ÆÿH;pQŽFÀ<¾ÒN‡o¢D*¼á;#|ƒÆ™ø¨›¡sM#Ðh? FÁ( &0O‹CŽo€]tÈdVðBïGÀ(œY­|]SáG)#ìß# ï9À|ûßýŒÚÚo)Òý@Ÿ | €F üQ0 FÕ°ŒUb@:Š‚éˆ Äý°–?âP;ø×ð#$d1 GŒ¹"vm(d¸ù2t˜™XŽRa¸O‡`´ €F'mGÁ(T­GØy gÝ@7ÃWùB7s£l/„¯@ý¶…̪‚{èW]þ‡ ÝuÀÝl…¼Šô?|÷æ2Rÿõ}>t@ø£`ŒêFØf»ÿˆÕîðeñŒÈœÿð…óð£p ÇA‹lŒ܇ï&`€E“CT#(kí‘¶Û@À%jzy¨€-ðGÁ(TÐ3yþÁO8‚´é¡Å9ü ¤P Ðcø™à»äà§&`Ü4b€ï:†«àv"¯ÃGY“ÿ¸¥H—äãG† ÑŒ‚Q@ð1n™žù?´iÜ*;=±{<ÆyÜb•B)üàR´ƒ°ƒ»ŽÐÀÛC Ðh? FÁ( x½ qôØ%øÉŒÈ[ba­xÐÚè¸ûØñv ¨á z Ð?`ÚÁ@EnÌcÙiûÿZK‘ú±,#Ðè*Q0 FUÀ„j›_À‚tføHøMaŒÐûœáà0@oì_὎Οފ>ôÂÆ€|CÖØæ*ˆ™ÿ‘×ÞÃWúÀð Ø~:Å 4Zà‚Q0 ¨þ3>e@¹) roñøê È÷Ï¢^. AªÑ—OJB–b2@6o1¢ßó ½Qí?|Í=ìÞjÐ)µ›[ŠtÒ// ÑŒ‚Q@5l™ßþ¿r|#ìÚDøšyX ÒZ‡ÜÕËÞy‹8‘‘ýp3uÄ1Òðݶÿ¡w3Âv×2"] ,ìrk€…=‘·¿ @£þ(£€j`B•õs`áûºØùð&,Fø l·,ürqpkrçí¥ÎRcø…8ÝçÔ€úX w/@6UÁÔÃ7WÁ þÿHÃ8 ë…ý†Q4Zà‚Q0 ¨  Þïÿ‘‡\ ýø!f»”açÛü‡ ó€†òAsga•weªµ@ž éü‡ ýg„W*ТTi€ÎÕ_5ZØc€=Œ‚Q@uPØvLX˜Û q^øŽ(ÈŽ,Äñøhgã©÷@Æá®rÓw0s*ºÎÕ 1Àç l¯Ÿ†¸+†ñÿ¦«­Eº˜wâŽ0 ÑŒ‚Q@PÔ~ Ø:gÐÆêÀB™VVƒRÂï5—Þ_€r÷ºËMá7^•uŸeʘ1þgP/ñD\ªÌ)îÁoø6ñ°µXÿ ]=8@ø£`Œš‚¢öãlÀ¢YÈ–öÜЋt |ÐÕ†/»+Ì_¢ë)ë:Ã,Ïy`Ë둚õ¿ÚK ß¡«Ä€-ðGÁ(£`„€´£`Œ‚h´À£`Œ‚h´À£`Œ‚h´À£`Œ‚h´À£`Œ‚h´À£`Œ‚h´À£`Œ‚h´À£`Œ‚pwm·Ä Øë&u¤‡H©ñºbÖ10 ‘"å7'ù¼Àðð~ígþ¬xõù|9»uÐå~Ç>}¾ßÝ~$ùéRØÛ¥Â±Å]Ê'åc<…ëÝNÊ7ÛOœÓ0ÝTÑù 5MÖÎ߱qÜk´¸$ŸëÈ¢mË ¹òš=o;m ›=3OdÎ!§ú ú,È5cN\œã,ǹP·ãÐc.çÂ,ë.ÏϽvÎì•ñ. ÇófŒô*Àƒ RÉQã9ß ˆS„ÂIuê(p!¢J¶¡öRÆ«Ÿô~¿ÕG9`làxÛ_²öùˆjg¡üÓ™Ñm~li‘Êôów>k¬¸xª£‡–øy–YkÌÇZ½z®6€2ï– 6 CÍüYåÚ±öß#öd?ðà^fLŸe®œ8\®ÄFÞ`Ẇ³Ä[öÕØÝyê_‰díåA ÿ…}Ûì÷7ùo¿/Ø»‚€A¦ÿ´Ûa…%©xÙe‚Èl›¶i…ô‹?üçɱ#;\y4¸»> ¯®Ye™Â©ÜPo’lÁ·òÇy%(c»E3É—Î'ã!îçäâO£ãp‘n—Ç6*VWKÔSÜr\¨ëêŸú¾ãùô¬8¼d§buÜ«¨=¬¿êß9Þ=‚~'ÿ•÷¸ · v€`ÿÿÓN’¥ißHÄ…‹Ó*Ê+çï‡6Æmv¨±îr^25øÄ±38Âvu墜Næ×94–Æ;,§¯jå4"¼d0éÁ½¡ižÖ­ù´®“Þá·Š»C'})FýÄQ?CjÊ[ãºGε铖r¿,SòË €„ÿÿµWBÚ¡rðâ› U4e|øi íÔœFÓ}s¹n‡7ÕMH_éª&…‹ë¯#²é#Us}VõÍ+Ьú´_´äW÷Ñuç5ÿ ݼÔÔú’¡Øý¶0Ö½Óþ}üGnÌÿÿµkCਓ‰]µŠ©öUKgFku¸ynŒÚ$ôåOÎÕá¥\%#u¾DŠî\í±'œIë%ÂJ‚pëX'†³w9Ž´7õu÷oswk¤¨xÝš‰Œ[½è÷Õê¥û%| {GÖ‰DUƒjuk8¾#9V‚úÿ«;µ9†@uèG3Ór ½úÒY:Õ1û”П[s ÉâPdœÍD ÓÝNK(ÎÚ¡NR÷Ö©0‚Ã&óEÒU“CÛ)‰U¿]]±’úݦ5Žnm žOZ»¨WÓZº·Þ©›h¾þ)€bHY [«åJL¡L(Ñ[ñàêv£«!”q™‹«õ‡«åƒÞ3@6‹P!F¨òDWOí./¡4±W8!ÛM_<áK;Ĥ\[!ãã‹/|-yrÜ€-ì±¥%R¾Ê››ð¹ŸpžÀ¥™F¯Øq¹‹Úi{È€ÜšÛ Cÿÿ¯{•áæ¡‚ ^¢©Û¢Wÿð«ÃQæ—‚(90q$'£m“ÔOû¹dE’‘Ø»…Ĥ:{ðÕºÓ½:¦NXawªbšãI‚ÜoZ›?!ÙâX¶®ˆM"¤í€ÞõŸÝe À}¹£Â0Tïi'¡”$MtÄ¿‰y/ Ÿ]n…`ޱ"››žTÝÁõݦDtŠîÝì¤'çãB}˜p• •¡#óÌÔÃÖè€H“·Á#©ÂBî_oµ6eì¨T4Ç>@¥E´Ÿ9ð\q‡”:„ÆÉÑÙ÷e @Žä‚ õÿOwjc;tÉSkÖJÁ—=|&¿˜Õ‡€ŒÚÉa…ÆØÅT±\Ë$ÁÁDyÃ<_¥ˆÜžÝÇ&2\ÞcRØ[O>x’Ô«oZ ]rÇu윮óq¦ â±qªÖ0ÆIYb¾bªyEJœúüšáoÈ1ƒ †þÿ_»JÓ·u¸$fÖvóê¿ö$3I²Ïì)a©}“Ò7µEç» u ®**s"ÊD>7@Ú„ÔùGíÕ;hOâì|G™â$ŽÈ÷®:qkG´ÖïöÓ½*¨HßµŠŒO‰Ø½³úQ÷êø»¶`ÇÊqA˜þÿÓN&¤iK™\dóBD)ÅWø €¹Ç3aHn¿IɘŒc%·²! "ÇÆŸ)= Í \]à+€îª36u×¶bÖ.ALî‘% ¦C+ñ}Êvß‹ûØjb‹K$ ¨§ºpÍä¾XŒÕ±ÛÿY=È€œ3ÖB¨ÿÿÕ®†ðàÚÅAÆ+¹+Â-½ùó´–t§®kª ˜œ?ñ8÷Ó¹N)Å+'=?í$(ªa3?J¶nÏZ^Hºž’¨ãئˆ”$µöSc!¸KhrQRÿ\_'“Ü_|áÓŒ•Þ×ôª¥Ï­#-][r­` ýÿ_?:<™ÎíÒ¡ÝŠ’ 37ºõß¾ „„ˆ‰ÂÏëPshu޶º0ŽÜV}(~ Ó¹uW2`œ¿=q‹j¯›Œmâ4Ýø ±6%÷ø¤Èî­: 1É{ÒƒïÇ@=†Ø01-4bZØ2/)ÝWr3 L/:ŸPKT@Nw™Ð©ŸŸB…)µÂ&†¯Uˆ^yâj\`s¾Š WEGŠß LR[ìøäµæñ\~ÇØMèzÐÜP^*60"[÷ €ûrIèýO]ÛA}F4«Ð"ó“΋Ÿ$™KÝ7)$ÊtÂÉîÊÐ5(2Õ;õM¤Á¹b;AU씲Çó]C&÷«>ÆpyÇÈÔ·“¼uˆqËôÔq]1¼îSu6vë˜Ne¯ÊN†µïÖ`õ ¶äœ1 ÿÿk'AÂ%Á.: ÚVl‰ƒ/ËL2ðfŽ6 •”·Iw êæjümÓäobH tÚó†Ú¸´=QLc/]d •Ñ6ðU)ùKj“€ãÌ£[íUª¡VÓ‰l¸u4»ïêgªÚÔ_«:_“‹lB¾jKrÌ€ùÿ«ÓZ# l·RRû ‡Áξt©±‹R]my±›Ê×*»ˆsrñL?E"÷?}ÒèKlôs´‘E*&uqC“ËÙ4bÞLi CCÜNÜ“ºw°åo…{ÆSd«r_ŸöiŠøúöœH¤õ,é_¸9ƒ€a¶ÿÿtO°8³-=ê-Âj0A'—|ñ—ÎnÙ´–o­Ÿ’Q=+SoeþÜó†Jñiÿ¤±g¤g„Ùè´ æ–{ŠkMŒêx^×=‡ã‡¨Ú^ 4ÈSoµ¡œt6¹nù3.ÑÔ¨óޤ.ý ¤™â™5X| ¿µKòË`„ÿÿu×7C—2F‘@Á1Ç—†Ÿ $} cK#o褙ö›€LÈóžQŸQa;ðÈ’A܈¿í mÖ'ª1QÜ4h2sªÅò§þ$ð œôþ3ÎÚ[À8ßc†Œõ—†àfÊvfšMÃóÖ|[Ü6¥ßÅ#9掃ÐûßÚµix€“ƒlm´?Á×_:TL­¼S Õ2Êd¿Á.\*b‰sœX¾ƒRt·~ïi5/Õ<É-ÓMjÍå ©°iß5‡ô8»$ÅÕæÑ¶¥|îÛØš G¡QjŽò')!£Â÷Žb¡“=èdÏ(£`Œ €²…? FÁ(£€Ž €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! €F üQ0 FÁ(! ùV0ÂØÿìÁ,Ë$i’âa—íâ¬X ê±_¯†½.·¹æ™Ã.bˆã>ŒÍði»k1ËËrâú³ïNE«Âo¶ç©´F'o·—˜ÃGµ~ƒVgÔÂâOx”^W÷åôŒªduuu2]>†±>«˜ÏÙÙª3-Óy›Œ›ib<¾6ìgß-wgŒ@Aÿÿj¹BËÎ&6°0ÆMP´s|ùÅá×”RÇWðß>ý'ê;S@”«Aû„‡ |ZSzÒNœš)Ž@u•ECuÖi é .ñWÍŽ ã.TÒtþ).#íQÇÌQ[›°‘(.á*j ±‚μ„¾ µ¤³ê8B‰‰¤wB‡ápÖŸýb&~i[òÎ €„¡÷¿µ-“IÂs‹mLå þù‰y ¬¬ê}±EÐ’e#@7wº[S«ôx¶¢˜|r¤}Û¿§õŽ™ûí,-*C;ÙÑsh|hÁnkM–õŒÍ—Vȧ•i9¤ºdúÛ|™ ÷Q>qãgqàæŒq Azÿ[ÿÕ4¥¯ãð ¡eá5Ã'Fn,F¢äÓâ,òÙDÃjØ€‡»¯BS #¦3õ­¶ ôS3N ¡S[bðÉ·#,NwŠC}®y¤ÆGSÝÔÜô?8‘nbþ;’Þqš¬ Ų'qþF>È9c€b†ÞÿÖ•g‚K‡ïV•Z“¸ôÅø›ªKM¦†ÎAt1`´wÖTSkÔ.Gz T{£*/$|QI­ÿFäi;Q_×W€f»twv“ìüunbé»ù"bÛ„B³ͼÃÕž„^KJø¿´Or­e„Õÿÿt§@Öt³K‡¼b5Êע׿tÞ;tœ]> \E»;A¥p1<ÝávsœÉqdÁä$µ8Gu—ÑV·Ò³D­ºçŽtŠUÕ *_`kÝ<%T :Ú¸Ì Y +.Œ ~åÛÛõnÑ@Ìq¬öͰ3|ßÊ€»+FAÿÿu«Ç ‚Ý5äœ0ضôú”d`µq†âf¸·"žˆB’.”x£QN‰H±$Tù’$çžc[˜ÂM×·”¡2®éÕ>çé¡ÃpKη›ë&3ƒ@^äRwÕ™½2·n“Ûðu ïÜqAzÿ[»â{E™ Aù´|õ‰yšÊö¦ìà¦A)Ið)—$O L†÷{ØÀ–±ðSàëqÉOàeïIÊðv!§ó¤vÕgÊÓêD9t£…¹«¡I­ëN [Š91"4©Ç¦³hdò;[[.)€ ½ÿ­[C̯‚6¹ *Tßøøj@]“™<Ùš ÏmZx6[ȩᦙÀœ °ŒÍâ5ì@¡UÎñ¶Æ 0­p(ß\ 8]ÿÛ»Õçü§Ä’å,‰r“k³µ·±wkó… È/ƒa†ýÿ×\«ÊaH\ÈmЉie^ò5ðí€ÒsƒŠ¹DAƒœ4­Ç\ÏœKñ´4½# MS»KTOÉôÝÙKi={ïÚÄbµ©¯)¡4›ýsÙìÿ˜Æ-”mv}rÖ6Þ¦âÔ˜<íÓ/t @~¤Â ÿÿº«ˆ:A‡vªÜ(}áðo`lcuÂHDl’Š’~š›BÍPwç”Ýžxnœ sÛÓ;'‘c<ÆPâÜš…ÛŠ“*'˜)¹¨Ýgú£ö“رp&.óÜÄcçØ1¥aÏU2nÿ{›ù_Ô€{+H„Aÿÿu§`ˆ:½tÈKV´¶å‚^~¼š-" ~Ç¿ýè8î¡Q¸ Ji·É„¤Û§ v6n^HJ#—õß¹›½)…˜Ø+¹p6ŠvM*†is'¶êÆÙ¯MPîÑG’jIE¾SÏiì¨uYâŸ|çӗ8oî8à ½ÿ©Û©Re=°d‰—Hù¢±ròãÕ×R¹–ó, -»d¤5´Göu¶y*Rª°U#SELgw$Sу1EÞ³U.ÿš {s#“ºÝøÕîjR¤}t¾åÜSÌß"!d¿‘ ü]ùÊâ(×]…WîÍ †¡÷¿µ“ Á×$ù`Áj#hÓtðWNíyRdm›éph­Ž”À“™ºâ6‰MÖ"M×ö»Byž%UòÓYbŸ”ZÔ¶ÏÝ)Ýë-Ž#sŤ¸)!ëžÔˆP]ñÕšÎJqO µ^S`ž´%€jãz†"&S R¡î).µØZkø* tsI-¼‰ú@£$ÃÁÌBojÅ“Rx’ÒÛÂð…1²Ð+\qF(Ýáj(à’#§!¦"D–ÃUáJ7¤Æ©€˜|I(âJØÌ!µÇ¬ŸF zo¼B¦alB5=¾V5.>63ˆmáÒœèÐ |]ktw[°j½ÁôRƒl.uÈþ!'ƒàËŒØh\ò0@¨‰.¯EGL/ gx›81ñˆl>® …X?cãS!QC ±½p‰©E¤–¢ •¶‰WÉK« ÒR@è­«@›¤@Bq—‚S+¶ã8vÛ3ã™sÎÞk}—>œ3Á1¾Ä^ª|ÒÖž9ëöÿ¯ïûÖúïµàe{Ù^¶—ítvþy³—_æá¥Tz߇ß} „„¯ŸrçãÞ½ížc§ksëïÞð§M“?pï¿<üp+ÐÿE>ÑâÙ*ܾõÖ§ºúúÜêî W]³ví†Ëfgº½ôvwßûÖÛ>yºv!„›¿·ã'+³_ýŸdéL…·o½m]aûÄD•Ö­ŸÎóG»€¹‹7®îL¯ª«ù#ͯ¾êµ¿Òìü¯>tb»÷þÞW-,.ßñØã{>üä—Eà,ð§&§+Ö¬›hæ â /—–¤Ú³{^Ž>ß„Õçõzàñþ;Þû‰“ÞñàÃ?êÿüû/ ;p·o}ïƒU¦.¹tµ÷—KGŇ«f»Ë6¯)oš]ºäÒÙáE¯Z¼ä²91|î}~÷ö•¶ó ËW--7CàÏÏ4øÎíŸ ;·ö%åáéì”oßzÛ!òí g|a¾•é™NgnMoñàþåé˜,çVºK‹U!†ˆ@0“G¾|ç×¶¼nËæÚ±k5pÍJŸo»éºg&;Wˆ5B8tpaßoùû;[6:à×½ùOü\ œ2¹R wÍ®ér|¡•óΟ¨=Ó÷ÉéZ–—›ÜEBˆâ®|[ŒñaÕ²ÆÝþ,Æê­¿ÿ¡w~÷±û¿xà“½ù¶ VÕmäB)†F§h¡¬šá›ÿñcŽÝ·ó±ù¦üàÏüõÎíŸ}ê\IüŒþàn}G§Sef¶c"º´vÝÔªg÷ï/-þ3Æj"„ø`áówo»gprÛÛ>øŽAØúõ»¿qoÛäwÝò;7¬ª¹¥ŠO ̄ᰠ& ¬AÄXªA۰ضì8pìSî9pßÏMàßâªÙNwnmïØáƒƒja~¨n,‡v„?s÷¶{v}ôú7¼ñò¹ÙO„ÞÛêP ÷€v4!tñõ¯˜™ÜÒéTÔUMŒO¤Éh[(ê ‹0 š:²Ð4ôuÈ¢(­”íí;ú‘'Ÿyn÷9Øú©Û?SÕéc©bùèáጙõ!|'„øé/ýÍßÿø¦Í›7½çÒ+ÿ©Wu_Õ«œN¬H)‚£•‰DÄ^'ªj´FĪBÄ,h.è°%49³ Ãä ­0o…¥fH_ ô¹CóÍû¿ùøSÿv&/Ên¯zÏÂüàhÉ–ÜùtJÕ?ܽížç^¿qãÆÛ6]ñÝ^·»~ºÓ£î&º5³¤‰)†‹G©¨ˆÄ1¢¢!@©Š2Ä ¦ÄºÆÛ–z¢f² ¨rª©\饊6šìœ?7¹ý=¯¿òÃ_ùÞ“wžÕï¿ãÖ·§Š/”¬ùå;¿úw'WüÛ7ßüìyÓÓë'¦ºÌ^°ž¹›˜½æjò±c …ã»wÓz–€CDqbO1£H¡ä!Þ´ÈÀÐa f´î´æ›–c•±P26,dÁh¨RäЀ«¶ïصëŒ0Óh™O~ùίÞ{r¥/¾õ¦»VOM¬ŸìVlØòæ^}½Ù5ä…#„ey_\¤3Ѹ*1‚D7‰­*J­x§*4+DÐÆ¨ªÈ$‘¦Ä"½,õXä’Ùú^àêSxAJüpÇvýpÇž8¹ÂG®Ý×®Y½mº×eÝÆM¬Þ²…zr\ÉÇŽ1œ?LÞÿ ž êN£Éˆqû© X4L IŽzÁ‹!u$Dw¬¨á!P¢!¦X(3J€””⺫~ýÊÅÇw>ýðÉøÎ*æ®;oõç;Ý f®ØLթѦO{è ±ÛAž?ŒMt˜zåèU„:áÁñz47"ƒ’qsHÁÐNDSÀªˆ‡@Ý8Éœn5A7¢‚¡5eÐÏ<¾3øÐ®¿aª—¶têHš`â ÀÜ_ v:,î~‚ J¯;I±–’‡`†U"”* †af˜#æPpÄ wÇD0¬UÕÁSÀ«š˜"Vkaêð`ó9¸zõìÇT‘º5³—^W/…8–žÝOgn‰l‚?ŽÇÆÈ¦P2â ¥àÑQsÌÇå8ž‰;‘–Aܦ TÑÀ"â‚J9%Æ3êô^]ývÝ« )àÓ”¥%°@Û_¢®júBŒxɘ9w'ˆŽfÔTð(ê„0 ªˆº¡-/lp˜aðèˆAìAi¡#äaE¬N­0NKàm7]·©êE’;¡ªétzØ`@~ï$Zɘ`x°¡D‘Ê^1CQŠÌƱoNÉÝ„@Ápu,‚†@¨z¼%º¡j÷S‹ÖÓ¸6ÍÝÔÑ:ઔ¶EÍkñ¾â®àŠÕ©)¨e¢  š"ÇÜа` ®h ¨ š"ä–íT ÍžñFP¡v,GbrJ>5ÎÓèZÀS TP'4QuÜï÷Gñl†«b*-¨+1€8˜ʨ>L UÇ£",*¹±V1,EŠƒ,ä ˆ*Æà‚U;Ή@é&D„ ©"ËÇÑ™š&}a5\ )²"Jò‚F0U°Œ3 s°h Б‡BÄ+¬isaØ©ãè’§+ îœù Ãþ‹ªJ)-M™:&ÚàXɸ‚ "ÁÁŒày4âãd-£ÝÖTr‘•ðD@µ¢#§È°(Þq†ƒ@ªàþ­Sá<ãçܶw½Å§«ŠéÙULÍÌЛYE*J.™D ‰BŒ#À%Cdb¦`# jŠ™0#ÁqZUT)†h¦¡¯…¥¥}7kCPK ÿüý§VŸ“fÿZaoI¹Š@ÓPB iAŠ€ Ö©Á#Á”Ñ  ÁF‚Î Q£¨¢>JdŽPÌ1I‰áPÉ"XTlXæ‘E"iªûµÓa<ãF¶oyð…F §Ð¶}ƒã ó¾´˜g$ª‘ŒHF­àAQW\‚‘%SPpCU ¡ ªä±bQÚ2¤Í-ÍPXj %D OXÁpm÷®Óa<ë‰ÀÞý[‡¦{ êºK/E꺦rÃB¤[9FEŠ©¢2Ág¤ñÕT(>"ÕZ@<£hsaÐŽÂgyÙhC¡ÑL_)Ž ±ŠLMt¿ùîºùtøÎzbö|Ö[{ùvÌÆ0FÔ•*A"E" 'U(ÁG3.¨ƒE–‘lPSZsD %;Ù¡µB¿1¬rch•Ð&3Ô„%$çàDõ9F‘b§ÂwÆ“9€ï<±gϯ¾ìµ¸^aÅPuç€áØX£dœ¢ &dW²Y5CÇIšK!k _œR2m$*¦F ‘,B«…¶iI) 1=zßýO~ è2ÒÇD^Ðg%pÑk.þþª6¼3¤0-È”¡‘Q¡ ¢BGQr0úº‘-­*c…ZAÛ*mCiZ¡´ó€³‡vÙ;ä`˜dòÎH=é ³æÁÎÇö»øúK¾1³TÞ•ºiÚMG ±â¢d7Ä MiQ-´Ái‡™¶("…Á Ý€Ì’9Z”"­&•Ì À°1({ž[ûž]ؼ¸ è+‚¢Ë+º+lÎHâѽ‹›/»ð‰nˆoR·©Ò m„6R bN«ÎòÀö[Z)ô‡™Ö•A¥%¯¬< " 13´€ 2¸ptPرëЉQ2\1þûyFGõÏ­NŽ]r¦±tw<ùÌÂÞ#‹ÏoZ»ê7S7¤vüQ"RȪ´­ÐäB.™Ö„ÖœR mŒL©æŠV¦F6§˜Ñ´‚hFUYÌÂýí?yü0ÆØgt`|8°B 7.6®ÿ3‹ÍÏ{;ydb v˜“XsØ<´2N8á·ö0ÃqY?óŒfza\ï´!þºÞ9¡züTŒr¥;þ¿ðÓÍÒO9ÖÞèø7ƒŒc‚2~Ÿieü…8]¿‘Ÿ†Ñ‰blEËœ ç|µôÿÆþ\އÂÁ—IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/application.ui000066400000000000000000000110271511343406000247170ustar00rootroot00000000000000 File1 win.file1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/appmenu.ui000066400000000000000000000010541511343406000240600ustar00rootroot00000000000000
About app.about
_Quit app.quit <Primary>q
ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/assistant.rb000066400000000000000000000065041511343406000244170ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Assistant Demonstrates a sample multi-step assistant. Assistants are used to divide an operation into several simpler sequential steps, and to guide the user through these steps. =end class AssistantDemo def initialize(main_window) @assistant = Gtk::Assistant.new @assistant.screen = main_window.screen create_page1 create_page2 create_page3 progress_bar = create_page4 @assistant.signal_connect("cancel", &:destroy) @assistant.signal_connect("close", &:destroy) @assistant.signal_connect "apply" do |widget| GLib::Timeout.add(100) do fraction = progress_bar.fraction + 0.05 if fraction < 1.0 progress_bar.fraction = fraction else widget.destroy GLib::Source::REMOVE end end end @assistant.signal_connect "prepare" do |widget, _page| current_page = widget.current_page n_pages = widget.n_pages widget.title = "Sample assistant (#{current_page + 1} of #{n_pages}" widget.commit if current_page == 3 end end def run if !@assistant.visible? @assistant.show_all else @assistant.destroy end @assistant end private def create_page1 box = Gtk::Box.new(:horizontal, 12) label = Gtk::Label.new("You must fill out this entry to continue") box.pack_start(label, :expand => true, :fill => true, :padding => 0) 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| page_number = @assistant.current_page current_page = @assistant.get_nth_page(page_number) if widget.text @assistant.set_page_complete(current_page, true) else @assistant.set_page_complete(current_page, false) end end box.show_all @assistant.append_page(box) @assistant.set_page_title(box, "Page 1") @assistant.set_page_type(box, :intro) end def create_page2 box = Gtk::Box.new(:horizontal, 12) checkbutton = Gtk::CheckButton.new(<<-LABEL) This is optional data, you may continue even if you do not check this LABEL box.pack_start(checkbutton, :expand => false, :fill => false, :padding => 0) box.show_all @assistant.append_page(box) @assistant.set_page_complete(box, true) @assistant.set_page_title(box, "Page 1") end def create_page3 message = "This is a confirmation page, press 'Apply' to apply changes" label = Gtk::Label.new(message) label.show @assistant.append_page(label) @assistant.set_page_type(label, :confirm) @assistant.set_page_complete(label, true) @assistant.set_page_title(label, "Confirmation") end def create_page4 progress_bar = Gtk::ProgressBar.new progress_bar.halign = :center progress_bar.valign = :center progress_bar.show @assistant.append_page(progress_bar) @assistant.set_page_type(progress_bar, :progress) @assistant.set_page_title(progress_bar, "Applying changes") # This prevents the assistant window from being # closed while we're "busy" applying changes. @assistant.set_page_complete(progress_bar, false) progress_bar end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/background.jpg000066400000000000000000000533131511343406000247020ustar00rootroot00000000000000ÿØÿàJFIFHHÿþCreated with The GIMPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ"ÿÄÿÄ8!1AQ"a2q#B‘R¡3±ÁrÑáðb¢ñ‚C²ÿÄÿÄ1ÿÚ ?ùØT[C ŽGzFÈÜh ÊŽè¤^¶‚¨hÐð|Ó lŒ‹F¤T€{¢æ(Äv×4 ùTQúž|Q •¡KH§Âylém¸Uw$‰¨¦"G¿4©îd€vEL¹ C1ÔÿH¦€‹€2;‘ÞY $É=«¶â3Yø4Àçp€£»V”M•´'UDýkYR#‰¢ŠB@X±ã˜§®X"A™8¦$ërBÁ¨©“ K„ö¥Ð¸dŒˆÖ©Þ1`Nˆ¢ÙpË›ŽMTDL‹î~)‚©oÏŠ%²%ýFQ"™-¢Ã³³ß<šŠÐP Ä\ˆŽ(žÃ@E/¦z––g[}ãST´¨€ùËÀª€ª-¡ˆÉŒ–¥ïpª¸Dìš* ¨„‡$÷¢EÁ‘V¶$~ê7U ›`Ð {ÐU-yZàTê»§ÔkŠ :ÔƒD!7@`5²{~(1`v¿ØÖ²0±™úݤ}«Næ[®åͰP‹b"7"¢Œ¾1—Ð ˆ²rfV ®ÀÁ$O€œîo~ÕP¨e½5'€HÝîq§ñTf÷ËÚ †õþ±’ÈXE–g˜ ¨U27è?½‚)÷7ö¦fôWõ]Û‰?ù¬«mos9ùŸÅ ‹hb$ÈïCÙYQÝ‹ÖÐG‰ –-3€]îÉ:ŠsRH;Õ½ìX¨f$€}ôY­Ú¶B[P£æ‘ºr$žGª NïÍ,ŸT4hx>iƒ…¶FE£R*@=Ñsb;kš|‹*(ýO>(„ÊáP¥€ˆ$S„ ‚a<¶t„6‚Ü*»’DÔS £ßšT÷²@;"¦\!˜ê¤S@EÀÈï@ˆG¬’džÕÛq¬ü`s¸@@ÑÝ«J&ÊÚƪ¢~µ¬ƒ)ÄÑE! ,XñÌS‚×, ̉Su¹!`ÔTÉ…%‡B{Rè\2FDkTï°'DQ ‰l¸eÍÇ&ª ¢&EŽw?ŒÁT·çÅÙþ£(L–ÑaÙÙ‚ïžME!G*@u&cŠe·mT,HÉæ€~(EÅ9#Q@ fëlŸµ=ËÊ! …Ȭ¶ò-î#(š2¨!Ió@¶Ý ÂV0 Áý­n` 9ÆÀÉÐ ™ºÑ¢ [—{KHâ¨ýBÎôOŠKކâ[µp+³Ì[`WEë-›ŽY- H’[ïÞªb¡‚ÌDI;&¤Q˜ÀEQäŠ(Äté’º“î9ôàqãɨ C*•WsÄÒª"c7™,DÁ Ì¶Üì@ù¦Æ@rÅLh ¦@] LQ‘X‚÷îdP’É,<ÿȱP ÐøB&æ Z õP& ˜<ÓûÜcÅ1#Sßâ¤?SÙ$ÀÞµTlf4cÍ'Ð…TnH rŦ8ì)D ÔsF%x"GsºðèqàÀì©Â— žcš¦Á5Í*¶³0#tåÄr?Šbà3*¸ÍJÒÿ˜k÷ ð©n€Ú'æŸÐ{BÒÝ%²Þ*œ}ê FGÀâœ6"ñ €Hó½Ö¡,@-ò8¨¦FÈãïN<šŠ2©UpX÷—Kê”&õïv^*¡¬†ôÝ=„F´­se‹{ˆûÒ]éìtß­îeµ-胯üWeç·ÓÚqÎMû@šæ¿~Ût—{‚ ŠÑÔu-«ÑÒ³µÍqmÛàAä×jõXÚÀ&O„5È@W Úy ÂÕÁp*ʾ;šhrI =èC!ÉýÇ9•æg(Çš ÒÞÐ3X:4™Ÿš6P ³cŠÒË h46ÕPº1:Á¦Hd{ ED†nÇÁ¢H˜ù¨¬å‚Ù:óX¸E‘; P®n-Ç “Oƒ‘îÖZxª…úB¨2Õ‘1·#°ÿµ>H’¨ÒÝÏ1HÓýŽê(3b]î0…H¤é:TêɽԶ(L­¿#É¥¼¢ëZéÆÃ¹ÈÏaÍ{im-ZKP›m?¶«.uèºc­€ʯïRK¾‡T-[¶nÜpX3 éký-¶9\xñ ½C¿SnèDÁS³Ú£Nr—Q¦ê(ù~(`K ¸š·UuQv¯Ü)©aseTžIæƒ2)e§ø+éþaº{$•W>à§;U ••Âߎi€+ðPÊý꣰t=´ :{p8öƒULÚÖ²Z*kÕ$MÅyð Nç_qÕÒÊâ&^MF—¿y:Nšå¶½“±¦¼äŘ0P£ˆÇtUBuÎH=šY’wÏzˆÌˆ%‹)•PzÌpX×!\\'jt9æƒ WÀ\«*øîi¡É$€ ÷¡ ‡'÷ä W™œ Ohl/K{@Í`èÒd~h`Ù@2ÌyŽ)ÿK,- ÐÛUBèÄè˜} ‘ì)»‰ c梳–gdëÍbáDHì)B¹¸·‚@M>G»Yh âª-剃<ÖÂæ^ëe{ŒZgñMmË-ÇHUŸ'¼Pfh ÔPÐÄÚõ#Œ´9õg¶ª; Ù'G½H€’ÀÆØŠ¨Ïe]Š»–V½.’_¥¶%Dk…¹ŸT°ó¨ o€bÇúvh:úÛ`² º¯cûMs\`Ph99ù¤ ~á•°@=ØÇö A[%ÛǸ:ž*)½÷>cE© lFÜÉâ™ÉÍH2æ'À4æ§l—£<¹:+^%m9Æ·LätöU@÷üš”QI™ ŒJ)Ðù »Û ƒÁÚr?Š»=ÛÖú{.© ’Þ?[ ô–ÔÞpÀ˜9©-Æ7’ÏMmn:ÉbÜ]·.Û»ÕYÚ!‚wUã¶ ÉËƒÍ <˜åÿÇÅ]ÑÜzçFÚ¤î*€2'B¢²«2cnÒö˜¬RÞ‹9b7£ýâ…²}Ïí÷HŸ™=ósxðsó@m*-ëW[;“æ½1 ú¬à~ªòðp¡Äò *ûΉòhã¼îX悳¸75,÷4‹$‰âx5FЊˆ¶¤“ÃËPg11ø4 ±ˆ1Þ‹LSöª€ˆ.ÀÉ:í ™> Pˤvu9"t4OdÛ|Ä‹iíÙí®õ†,èHçâŠ"˜Ù=Ϫ1K¶Ö2R{οŠXuö2OôäÄž>k)!8‚wÄTPd yb`Ï5°¹—ºÙ^ã™üS[rËqÒggÉïšÈ4[CkÔŽ2ÐçÔvžÚ¨ì+dLõ FKb*£=•v*îYXD ôºI~–Ú@•A®æ}RÃ΢¼V‹éÙ ëëm‚È‚èb½í5Íq€U@} äçæ5û†VÁ÷cÚl—lKàêx¨¦÷Üú@U¦@-±r7'Šg$h?5 ˘ŸÐSš²\zŒòäèx­x•´äsÝ3‘ÓÙUÜòhQDe&vf‚1(H§Cæ‚ïl6SiÈ@8þ("ì÷o[é캤‚KxüUnƒÒ[SyÃ`椷ÞK=5µ¸ë%‹pvÜh»nïUd h„B ÝTsŒZØ+'.40Lòc—ÿwGqëœj“¸¨È Š,énØ·°[©«—æ>ÂªŠŠ¹bÞuAžà¶¡@‰&;P"©ô˜1P@ˆð*‰"I<®¢—Ó,CL~ŸšGéÿÌuInããk¡ÜÕF·ƒ Ž-±ÁªS)wü §êzfé¬ÚµÓZv ?Wæ¤Èöî0¸XÜb¢š}ØhäI¥KVñ¬ÁГ³6> dOšƒlË@#šKu Ëh€?{öHDH #šÀŸE@*K 11A…»s¶ ÄêˆÀËæY  v, V‡m–ÁPó ÉÇäö®fêl(—Û]»*“?o£\[}:é PÌ;ë-€ª¶­°KK¨A Ô?á‡;—®eFŒIÖ€¯ImäRAPǽrÝ«CñI~àéÖÊçý5p«Y³eíàK‚}Ìg½@ v Ó•BÊ$åªwöª!| ¬¤eÇÔ r1ã½ óŽÜS¤¢›…1v³3ª(* ‰ #±=èåÁb'KSIrÎNɱ‚K¸yø T—nÞŒÖfU"u:¬~(¢ ½[HÒ/šRI2I3â²17)’ÚŠÀb§Oo­Œ`L±ç½{€(µi3¸tk J‡+ä;!Ò´áÑqžýÍ*!yÙ€LÕBÉ+…cÇÚŸ#&Êc*& РÀ±¸ÅGQ@ÚBÀ‚û'¸¬Qša¤0ˆ=«I6t&¶d‘ ÆäЍ,énØ·°[©«—æ>ÂªŠŠ¹bÞuAžà¶¡@‰&;TR*ŸIƒ¨’$“Êê)}2Ä1dÇáyù¤~ŸüÇT–î>6±:ÍTkx0¸âÐ`¨õ2—|; ~§¦nšÍ«]5§`Óõp>jLnã …À&*)§ÝˆöŽDšTµošÌ 0+0#cêDù H6Ì´9 ·P̶ˆ÷¿aT„@D€ ’9¬ ôT x°Ó[·;bÜN¨Œ ¾e˜÷ñJbÊ`vÐlU2 œ~Ojæn¦Áb‰qµÛ²©3ñ1Fú5Å·Ó®• ðñ^²Ø «jÛ´º„ÍAÃþs¹zàFThÄh ô–ÞE$ {Ñ -Ú´?—î`®q?ÓQ§ µ›6^Þ¸'ÜÆ{Ôb ÐÙÝ9T, òNZ§qoj¢ÀªÊX»éÖ¹–Ý`·mæå­É×< v!m®+;ÔzŒmÙw$·üÔUX’˜È˜ÜR[{ª iµ¶.9“Z:‹ªnž‘aŒ‰p¦+§¡±q÷¹Ü#KûG‰ªŠdëxº^=EИTñ\îÖÞ×®¯qîð̇šõz{NÁ˜ÀÅxaÿÚ¼ÁuÖze6Ŷ’qÖ¦¢¥é ÇrO›À*Ûq͹“le5Å\ÙÇÕ(UQƒuÜë|QƒÞµÄK\r} óAƒ(8éî°½¾ô3,˜Êg[ª;„¶GÞ‘WäÓ‘Ž8º €=È=ªÖ:¯M$ “ÆÏGPÁî)vÜ(â›@sÜÍŸ¬ºW °SûGšæ$“=·C1ëÔ$÷Ûfi_—ñUŠM²àmާŠV¦DÿÓºgp-¬dDkÒ5Ì' Aíê(=чý±TqéY$Ö·mî÷ÕØ3ê å Ï ÄóU ‰ŠfvÀ"”qðS¯ÜÞ*`›ìBŽÝ?…‡»ÔOy­ZP=¨cŸ&‚ªg3ˆîh¹« æLE ¶ÅŽ­,•»s‘1âkYó æN¾(6*<˜¬ 7±X sOšÚÛ>É“É'“A-’œ ’EIv oæ+ DóLÌbkâ7S 3¦LA“QL°WÚitÏ„äØö¦! >aI˜ƒÚƒ*ÙéÊ›–=ÍT5¨[ ¡?÷ K’“ð(Œ[ÙÃf{ŠP™)9·ÜÏ?jŠ»éÖ¹–Ý`·mæå­É×< v!m®+;ÔzŒmÙw$·üÐU‰)Œ‰Å%°÷º –˜Û[`ã™5£¨º¦ééÈ— bºz_{‘Â4¿´xš¨¦N·‹¥ãÔ] €õOÎímízê÷ï Àhy¯W§´ìŒ W†ý«Ì]g¦Sl[i'jj*^ Üw$ðì)°|­°GÐk™0ÆPc\P…Íœ}Q€…Uðh0']ηÅØ=ë\@TµÇ GÒ42ƒŽžá; ÛïAÃ2ÉŒ¦uº£±HKaTxéqM9àP‹ È܃ڭcªôÒJ )íà¶A ÃÉmîƒ>¶™þõP f ú{Ñ(¸É^ò>ôÃPHÊ>)L´â<ø¨¥À9Õ²XžAYíÛE_VåÂIúTóT̘ÅŽbiQQ=Øï·z¨æ|,î¨ò2P¤Š*¨P\dR[ÊöûÑy$Nñ⢂(Y$“q»v•ˆE-?Þ¶6Ën\8šÆÒ}^³¦wºoômÉc“ ŒÑ´ŠÜ{y1<·ŠM;’¤°_Š¡KŽL¬5½P¯qÐâ`ö¥°5_Ô?¸™¤[=KtÉt2æäâ„D ¬¡Eç²H/ÉHïUIpI9æh,úsÚháí€ÐO$ Fd´Œå‚¨å›‘iBÁKez›½C„)l/´’'~)S©|¥Ó^aÌâ?ä×_Afå»n€¬î^'.õåæQqÚ%—\Tî„Ôÿ2nÜ{8ûWu¬¯2B†|Wut"ÊÛS÷w¨©1ITªD F§æ³bÙ'˜S†Ú c1.fƒx&w1@'´–O`)‹Æ‚’#°¢$dý¢ªijOon襋EŒ‚ùÙ¥´F;$’IŸÍ1_vY“<ÍE8d™ÀGoµ#31>Õ¸ãuŽ=þO4¶ðíÞ¡Ô¨{Jè81ç{®„'…Ùþk*CNF š¨ô‚‹¬Î¾Ûc‚Üš£„A$•FÔ÷5À½Uà°ªF‡Š•ë¯pÎXž7ÅHµÓÔõÃf׶ߟÝ\6Ðvã‚Kq>)íà¶A ÃÉmîƒ>¶™þõP f ú{Ñ(¸É^ò>ôÃPHÊ>)L´â<ø¨¥À9Õ²XžAYíÛE_VåÂIúTóT̘ÅŽbiQQ=Øï·z¨æ|,î¨ò2P¤Š*¨P\dR[ÊöûÑy$Nñ⢂(Y$“q»v•ˆE-?Þ¶6Ën\8šÆÒ}^³¦wºoômÉc“ ŒÑ´ŠÜ{y1<·ŠM;’¤°_Š¡KŽL¬5½P¯qÐâ`ö¥°5_Ô?¸™¤[=KtÉt2æäâ„D ¬¡Eç²H/ÉHïUP…Ü÷¥w-¨“P!QCƒºÊ¢²µÌf3Tÿ“@ÊŽë‘!WÿwH#d+]c¡@|Õ\¡ !Gj[èâ‡SÀïA’Ù©'#ãµDÙ~ÜP/€(¼ óÉ¥ôÜúŒH;ÐPÈAŽFÍ`Z vyjpél€ž|Ð’Nê)I¹væ6öcm:Z`B«±&Zy¬€¸t/µì?wæ‹Yic &cUq?¨µ< )mÛ‹¢ã6À «ªå1Qd%N4gL)À–c‘h¥u gžP¸:~³©2xdñF×A{¨Qwª|Wœ$Àÿ½5‹g¨ÿE3éôè ž í^ª#»F•&Y›ÅZGôVí'é]¸4:ì *õØnžÕ’×Ã7s&»’ý•Ì-ÀÄ+›§{Vo]{¿¨÷"cŠƒ z‡ÜtjFÚ¿UÒÛ>à\öÿEtõoníÑsÓE§Z©‚ìÏé®*?UGªÈálb¿õRºª.w :Ë÷W%¾²ôD&‡1Q{—z‹Ì ã÷MHµÑw¨wµn8^Z¹æè lóâ)ñ–$ûˆÔÏ5‚¢œˆ“þÔ âZ|S¯?ÿ4€!-+ÉíªV¤Ä( \Ãĉæ„1Y% wâi•-ú›A€‘³LU]¶ax XÒ-¡ãã½+–r}6UOêj£º äöR Viº¾a*¢JÂݲ×OrP%Å Yై‰5@팪b;H@2\" ö e(PHÏzWp"Ú‰1ÅÕt8; ,ª++\Æc5Où4 ¨î¹÷t‚6BµÖ:4ÍUÊrv¥·þŽ(qU<ô- ’r>;Q„M‘'íÅø‹Àß<š_IÝϨÁ‰½õ ”älÖ §g–§–Ì(‰çÍ $›—ncof6Ó¥¦„*»e§šÈ ‡BøÛ^Ã÷~h¹‘P:f5Qqú‰×ûSÀÁØ–ݸº.3l º®QBTásFtœ f9ŠWP–yàEkƒ§é :“'€&Omtº…z§ÅyÂLûÓX¶zñS>ŸN€™àžÕê¢;´iRe™¼U¤q/EnÒ~•Ûƒ@ƒ¡®ÀÒ¯Q†éíY-qL3q÷2k¹/Ù\ÂÜ A⹺wµfõ×»úqò&8¨9¤3,HÏâ²”ÁRäÑgÌ,4ÁUWP\÷ P@B2b`˜¬¨KF_oÿimŸP³/кüÕ†#góA°USX÷<ÐEs9'lR3’Ø) ?{xÈ€ªmƧE¨6#7XZ.ñÿV«Ç÷@ø€©`'#¿jn€£jiäÅ:&µÈ,Ü/Š’@~àшPÄ-»däO4°öžü4Éh#z—}ÍûAàRÜcé ÜÔVP™$±¬@Ä’GŽiÒÜ ˆXüŸµMšÐ0VGe‰ §Gí¼íŽî€gä+Òu bãÜ00öÍy–ДËÒkpu'cñE܈n³ ˆ=¦‚v‘ͼdmÏ'íM‚Ì–2<Ó\!-„š_NB+¹ ïâª&–’àä/e¬ä'`+’&5°Êf"¢” *TòÝé€[i‚‚;±=éCûHTãs©7qbX[>æË€<8fŲI“&g·j ¸¬GÚŽ0YV  ±üÐ U€´P{¨ª2aæ±¶ 2y ÿ5T[]?‚ÞL LÝì†3Åõ$Åæîrú¨ ã; j95PñÐPX2ìÁÖÿš¢ZœÜ3qÈÐ'ŠPÒ°ÛiÔR/¾{{@Ы@HЀ9¡l*— ³@©¢Tæ€ÈfX ŸÅ!e)‚¤É¢2ϘXþi‚ª® ¹ï@ €„*dÄÁ1YP–Œ0,¾ßþÒÛ>¡f_¡uùª$# FÏæƒ`ª¦ ±îy ŠærN>ؤg%°R~öð)‘U 2ÛN‹PlG n°´2,]ãþ­V!îð)RÀ.NG~Ô ÝG:ÕÓÉŠtLkY¸_$€ýÁ£*¡ˆ[vÉÈ$žh aí=ùi’ÐFõ.û›öƒÀ¥¸ÇÓ @'¹¨¬ 02IcX‰$Ó¥¸@ ±ù?j›5 `¬ŽËANÛyÛÝÏÈW¤êÅǸ`aíšó-¡)—¤ÖàêNÇ⋹!Ýf{Mí#›xÈÛžOÚ› ™,dy¦¸B[9?4¾œ„WrAÞ#ÅT#çýé™ñ´Ÿ[÷ð<ÑI,ØÉ ÌÖ²î&ãk]……@Úÿ¥oÇî56b`lÏzir‚AT¾«" Wm šŠ)eTÞ{ ¢î]·’àP. DöŠÓ ±ßµŒY`ix§ ŠˆkBh‚HHÝÚ¹ aìHù¤BC.91<)À" M*ã™n@ì)Š§Ò¤ªù¥:IàŠ×ÜÁvsð)•àP'F¡bÅΦí˾¢€†Dîº.8±Ô½›„¤hD½T)õŽÉOïHKA”“ÿƽ‰ýL|QÌ·=¢€*i¸0 ÚvMf†¸[‡‘ªÁ™î4ÈÑæƒÈ" óÅEb‘qT,À–,x™Àb!Œx§[aÜ<‘D2'Ý(#›%§3Ìê©eZÝ«aS'DÐÌ™÷4fú–}ǹ?ö %ýÝÉæuqö©ÙS\È‚ÿ4ÞÕö)‰÷j˜ S”ƒö©JäB‘äÓ$ð~ kL=b#@’HàÐ9";…$½m®”7ƒ±w+Ø"µÇ¨ÿ“Ú©aíÞéâÛ<¶ò{UC2~iY³.OÕíô­Ô/­m–݆~þ+”•õ• y˜ p…QqNñž)’Ù¶ÅÜU¿ú0S Wžäö£%܄ɀÑ'QXHùÿzGf|m'Öýü4RK62Bó5¬†E{…I¸Ú×aU[kþ•¿¸ÔÙˆe³=é¥Ê Pú¬ˆ%]´€@j(¥”ESxIì‚‹¹vÞJ@¸|Ú+L6Ç~Ô 1e¥âœ6( ­ ¢ " owh<懰I#æ‘ ¸äÄò@§ˆ,@ñ=è°Yh'™Š¨Ìù4¨ Že¹°¦*ŸJ’«æ”é$€j+_sÙÏÀ¦Tt{@…‹:›·.úŠQºè¸âÇRönn‘¡>õP§Ö;%?½!-ROÿvö'õ1ñG0ÜöЍY¦àÀ/iÙ5šànF«g¸Ó#Gš _ ˆ@'Ïå zk¡ñþôª2V·ù¬6ëò;Љ_“@×a”,kÄš/Ì·Qwö7¸&‹…Zá– FFPAÌÜÇÄÏÍbÁ-åŒjÍ4@æb;šê^¨fŒØ1Vœjjã©lŒ^^æ ~£ÅsõÝEGÓ´÷0òßÕRê:‡½qò:èWÆæ†äïñL¬…€¹2 íX7ëfAã·jı8Àv©ººbààn‚¦ŽÔ…”!ð5×3Œ»Ð¶ªí‘"ð<šRT´— èUmo6cŒìÚµ§Å7ošV`·¸|мdÇf"‰Ç†MÑJ9 ûUb9“³=¨-rÖ¡¼)¬`)0&55—‚<5‹É“@]ÔD˜=kp—äl?© -rZ‚ñD†¸RPpuUMÕ#£ú`ÌlÿÅs¢ÂÄkÅ mô‡²Í7¦ʆk’½¼ÔV@5½HΪ 1€<Ö£Ûž$P"Ú–LGv (¬Iv©Í,”<˜¢ 2+9lˆÚŠ>ÂpÇÇ÷ @WC)"ŽKh©›À¦wÁUÐàIk,¶¤1‘ÙÕs¼Ée[P; šÝK×ì±Kމ;dÑì 5„Ußó7¥ÑL[NAù¯^Ò.L)ˆâ­Gš©i•½ÿ2í$p/­Ë ¶ÙA¸ŠëêUÑEë(ªåÂñ :2.ÿ™kÎìÓvûR«•¬Ýf‡¸ª½ÀïL¨6µï&°’IçŠX8ÂÀ¨0$¹Ê‘W×¹EµÛ·üQvy[iõ¾ ½Q“Ó²-[>3?5Q4´—:ëvÙ&Ú&A|šôÂǦ‚Oí¯«5´y"°B×0[Ä즔Eâµ·gk‡Pª€‹é³a‰1Ë+{ÆÈü °dìÖÉs °×iÿŠŠÊp]ýGTÐyß>h[L¦ãižþ(›~øY'ãT qõ€Û588*ª˜4H>¦K—mq@æI¯3?PI¥º“i¶8Qd¾¢ÄyíDÎS"*+³¸N"`ÒÜÂÚ€$ì®ôÂYÄ’q$qYRì´‹käwª†°ˆnƒx ëNLDOsA*\‘î'‰â)ÔBv™QJ¤™}(åh”B/;$Ñ@Ø–h¶ªl@Ñ$·a@@UB˜<‘²híT@ŸÌÓ@ÜÐP(>Aø “–k-솟«’"¸cÀ(­arFºû¬×B¶ýÌ{&rV:ÜQHRˆnæ(ª2²N‚óÍ5±é£»!Mh@ì’qóA¤ÈÀ’DÍ1}ož` þõƒ¸ê£ˆ€4$RìÞ]N¨­¶d¸n>*_ó‘=ò¥´'“³@J;´gm7Ç53iñkÎÇ“ª¶ÔÂÆûòiDYLŒfO}TSçnÂB! NäÔкÛ÷!bL’;U’wpóK‰iÌPášÀ“¨ÝhŸ·j`c‘àhT´A ìrÑïA>™&Ic j¯‚}GCš@¯#µ¶Ð7sN•æ s²ŽÑ^òbmÛì#gtÀ1…âO4ÅËí‰ûT‹aÊ$UCúVä˜ànРð(9:Æ8ÙñQº.ÿ•oLÃs‘íö °!ÜAr#u€%d¿öÝV×øwOg¥7©’¬µÉÙ®{6îÜ›LîY¦()€.ZN¸ÿß4ºÊ&´À‰™>*a²¶² ‘À梪„ãäO4 +¶Õ@Y?šÎ]ä#Hƒµb˜&!'ûÕF°ˆnƒx ëNLDOsA*\‘î'‰â)ÔBv™QJ¤™}(åh”B/;$Ñ@Ø–h¶ªl@Ñ$·a@@UB˜<‘²híT@ŸÌÓ@ÜÐP(>Aø “–k-솟«’"¸cÀ(­arFºû¬×B¶ýÌ{&rV:ÜQHRˆnæ(ª2²N‚óÍ5±é£»!Mh@ì’qóA¤ÈÀ’DÍ1}ož` þõƒ¸ê£ˆ€4$RìÞ]N¨­¶d¸n>*_ó‘=ò¥´'“³@J;´gm7Ç53iñkÎÇ“ª¶ÔÂÆûòiDYLŒfO}TSçnÂB! NäÔкÛ÷!bL’;U’wpóK‰iÌPúÀPKr@£Š¸ Àñ:¬Êp¶Åf}Ü“MŠªª)àwóA;Œmâ¡ò-À#tm#(w{xp o\ºÒÞŸ´Õ™—fw'@ð*¡S6‚Š[„…ÖÉÐÞ™½úøæ™Y\‘­ÅE(¶UàÃTJ£2ûDòiƒŒ¤Œˆ46Ò ¾{UF ŽˆÌV ®Å‰“æf˜*:I“HM¶1ˆgGu×5l"“‘ïFB¨äî¦0Ŷ8Ñ&ÃGbüPJj&fh† ’vbŒp5Å!*ºÐ1¶êù\ƒÚ“CÑR}G$’tfi‚   d™Ù4„Ûc€ftwQMsVÂ)9ôd*ˆþNêc [c€M2l4v Å4¦¢ffH`É'f)ØÇ\R«©Ýn¯•È0= y4='ÔrI'CÅ+ÜcŽjqµ'zÕ'f6'ø¬>")[;öšËi[eN†¨ "-ëy1bF÷ÁŠÊT¡TŸ3DA&hýè°}¶×CB(µaR5õ–ëÁ™ãÅkŒVÑ`Ô§„~ $À$p?4PY˜ÌƒÇÛÿf˜ÈPƒTÌÇ!ˆäÆ©`" >hYsm4IÑOdžIïX’ ýõ?zP$   Í(ÆÕ²@˜˜?ì+*’Ç™žÔQ2Äi~4V.C\=»D*# @1£X¶™;k"’2mРF̬ï@S}‘–§SNÅ·1æ²Ê Pù"a@€;Áaˆ˜‰¦¸ø.õ޳΢•ÈM‚ *¡‰…bÍÞ?µZÕ¯FÑ%}íÍdìíãɬßTO ÌöšÌÊöÐH*ˆš, !Çj¨À¬¢¶'S·¨LÊâ>ÔÁ‚#Ç“Am»ì±EøïQZiîK*¬O>ß!mL ïDœl(ˆüÐSü:×§Òª²êûÉ®ä·vâŸMr?ÿÍyëuìÿ¤åOž&ŠuC†7±aÀíA×zòtÀ-xŸ©¸Âì÷ådž¸Ñšåî±2-§÷4 MÉøˆ %3yk„VÆÑ}¦DZˆÔIf ƒ9KjGjqÄp¤ž8¦xJ)ÜLÎéAuv¢"~‚Ìyn(õ¼˜±#{àÅe*P„*O™¢ “4~ôX¾Ûk¡¡ „Z°©úËõ`ÌñâµÆ+h°jS‹B?P`8š ¨,ÌfAãíÿ³Ld(AªfcÄrcT°H‹4,¹¶š $Æè§²O$÷¬IþúŸ½(’Ðf”cjÙ ÌLö•IcÌÏj(™b4¿Hš«!®Ý€¢† Ѭ[L‰‡5‘I6„hP#fVw )¾ÈËS©§bÛˆ˜óYeP(|ˆ° @à°ÄLDÓ\|zïYçQJä&ÁPƒD±fïÚ­j×£h’¾öæ²HvvqäÖoª'ŠŠQm D‚9èa#q +*;¢‘zÚñ4Ŧp ½Â9'B椑!w«{رPÌIûè³[µl„¶¡GÍ"!täI<ŽT$ßšY>¨hÐð|Ó lŒ‹F¤T€{¢æ(Äv×4 ùTQúž|Q •¡KH§Âylém¸Uw$‰¨¦"G¿4©îd€vEL¹ C1ÔÿH¦€‹€2;‘ÞY $É=«¶â3Yø4Àçp€£»V”M•´'UDýkYR#‰¢ŠB@X±ã˜§®X"A™8¦$ërBÁ¨©“ K„ö¥Ð¸dŒˆÖ©Þ1`Nˆ¢ÙpË›ŽMTDL‹î~)‚©oÏŠ%²%ýFQ"™-¢Ã³³ß<šŠÐP Ä\ˆŽ(žÃ@E/¦z––g[}ãST´¨€ùËÀª€ª-¡ˆÉŒ–¥ïpª¸Dìš* ¨„‡$÷¢EÁ‘V¶$~ê7U ›`Ð {ÐU-yZàTê»§ÔkŠ :ÔƒD!7@`5²{~(1`v¿ØÖ²0±™úݤ}«Næ[®åͰP‹b"7"¢Œ¾1—Ð ˆ²rfV ®ÀÁ$O€œîo~ÕP¨e½5'€HÝîq§ñTf÷ËÚ †õþ±’ÈXE–g˜ ¨U27è?½‚)÷7ö¦fôWõ]Û‰?ù¬«mos9ùŸÅ ‹hb$ÈïCÙYQÝ‹ÖÐG‰ –-3€]îÉ:ŠsRH;Õ½ìX¨f$€}ôY­Ú¶B[P£æ‘ºr$žGª NïÍ,ŸT4hx>iƒ…¶FE£R*@=Ñsb;kš|‹*(ýO>(„ÊáP¥€ˆ$S„ ‚a<¶t„6‚Ü*»’DÔS £ßšT÷²@;"¦\!˜ê¤S@EÀÈï@ˆG¬’džÕÛq¬ü`s¸@@ÑÝ«J&ÊÚƪ¢~µ¬ƒ)ÄÑE! ,XñÌS‚×, ̉Su¹!`ÔTÉ…%‡B{Rè\2FDkTï°'DQ ‰l¸eÍÇ&ª ¢&EŽw?ŒÁT·çÅÙþ£(L–ÑaÙÙ‚ïžME!G*@u&cŠe·mT,HÉæ€~(EÅ9#Q@ fëlŸµ=ËÊ! …Ȭ¶ò-î#(š2¨!Ió@¶Ý ÂV0 Áý­n` 9ÆÀÉÐ ™ºÑ¢ [—{KHâ¨ýBÎôOŠKކâ[µp+³Ì[`WEë-›ŽY- H’[ïÞªb¡‚ÌDI;&¤Q˜ÀEQäŠ(Äté’º“î9ôàqãɨ C*•WsÄÒª"c7™,DÁ Ì¶Üì@ù¦Æ@rÅLh ¦@] LQ‘X‚÷îdP’É,<ÿȱP ÐøB&æ Z õP& ˜<ÓûÜcÅ1#Sßâ¤?SÙ$ÀÞµTlf4cÍ'Ð…TnH rŦ8ì)D ÔsF%x"GsºðèqàÀì©Â— žcš¦Á5Í*¶³0#tåÄr?Šbà3*¸ÍJÒÿ˜k÷ ð©n€Ú'æŸÐ{BÒÝ%²Þ*œ}ê FGÀâœ6"ñ €Hó½Ö¡,@-ò8¨¦FÈãïN<šŠ2©UpX÷—Kê”&õïv^*¡¬†ôÝ=„F´­se‹{ˆûÒ]éìtß­îeµ-胯üWeç·ÓÚqÎMû@šæ¿~Ût—{‚ ŠÑÔu-«ÑÒ³µÍqmÛàAä×jõXÚÀ&O„5È@W Úy ÂÕÁp*ʾ;šhrI =èC!ÉýÇ9•æg(Çš ÒÞÐ3X:4™Ÿš6P ³cŠÒË h46ÕPº1:Á¦Hd{ ED†nÇÁ¢H˜ù¨¬å‚Ù:óX¸E‘; P®n-Ç “Oƒ‘îÖZxª…úB¨2Õ‘1·#°ÿµ>H’¨ÒÝÏ1HÓýŽê(3b]î0…H¤é:TêɽԶ(L­¿#É¥¼¢ëZéÆÃ¹ÈÏaÍ{im-ZKP›m?¶«.uèºc­€ʯïRK¾‡T-[¶nÜpX3 éký-¶9\xñ ½C¿SnèDÁS³Ú£Nr—Q¦ê(ù~(`K ¸š·UuQv¯Ü)©aseTžIæƒ2)e§ø+éþaº{$•W>à§;U ••Âߎi€+ðPÊý꣰t=´ :{p8öƒULÚÖ²Z*kÕ$MÅyð Nç_qÕÒÊâ&^MF—¿y:Nšå¶½“±¦¼äŘ0P£ˆÇtUBuÎH=šY’wÏzˆÌˆ%‹)•PzÌpX×!\\'jt9æƒ WÀ\«*øîi¡É$€ ÷¡ ‡'÷ä W™œ Ohl/K{@Í`èÒd~h`Ù@2ÌyŽ)ÿK,- ÐÛUBèÄè˜} ‘ì)»‰ c梳–gdëÍbáDHì)B¹¸·‚@M>G»Yh âª-剃<ÖÂæ^ëe{ŒZgñMmË-ÇHUŸ'¼Pfh ÔPÐÄÚõ#Œ´9õg¶ª; Ù'G½H€’ÀÆØŠ¨Ïe]Š»–V½.’_¥¶%Dk…¹ŸT°ó¨ o€bÇúvh:úÛ`² º¯cûMs\`Ph99ù¤ ~á•°@=ØÇö A[%ÛǸ:ž*)½÷>cE© lFÜÉâ™ÉÍH2æ'À4æ§l—£<¹:+^%m9Æ·LätöU@÷üš”QI™ ŒJ)Ðù »Û ƒÁÚr?Š»=ÛÖú{.© ’Þ?[ ô–ÔÞpÀ˜9©-Æ7’ÏMmn:ÉbÜ]·.Û»ÕYÚ!‚wUã¶ ÉËƒÍ <˜åÿÇÅ]ÑÜzçFÚ¤î*€2'B¢²«2cnÒö˜¬RÞ‹9b7£ýâ…²}Ïí÷HŸ™=ósxðsó@m*-ëW[;“æ½1 ú¬à~ªòðp¡Äò *ûΉòhã¼îX悳¸75,÷4‹$‰âx5FЊˆ¶¤“ÃËPg11ø4 ±ˆ1Þ‹LSöª€ˆ.ÀÉ:í ™> Pˤvu9"t4OdÛ|Ä‹iíÙí®õ†,èHçâŠ"˜Ù=Ϫ1K¶Ö2R{οŠXuö2OôäÄž>k)!8‚wÄTPd yb`Ï5°¹—ºÙ^ã™üS[rËqÒggÉïšÈ4[CkÔŽ2ÐçÔvžÚ¨ì+dLõ FKb*£=•v*îYXD ôºI~–Ú@•A®æ}RÃ΢¼V‹éÙ ëëm‚È‚èb½í5Íq€U@} äçæ5û†VÁ÷cÚl—lKàêx¨¦÷Üú@U¦@-±r7'Šg$h?5 ˘ŸÐSš²\zŒòäèx­x•´äsÝ3‘ÓÙUÜòhQDe&vf‚1(H§Cæ‚ïl6SiÈ@8þ("ì÷o[é캤‚KxüUnƒÒ[SyÃ`椷ÞK=5µ¸ë%‹pvÜh»nïUd h„B ÝTsŒZØ+'.40Lòc—ÿwGqëœj“¸¨È Š,énØ·°[©«—æ>ÂªŠŠ¹bÞuAžà¶¡@‰&;P"©ô˜1P@ˆð*‰"I<®¢—Ó,CL~ŸšGéÿÌuInããk¡ÜÕF·ƒ Ž-±ÁªS)wü §êzfé¬ÚµÓZv ?Wæ¤Èöî0¸XÜb¢š}ØhäI¥KVñ¬ÁГ³6> dOšƒlË@#šKu Ëh€?{öHDH #šÀŸE@*K 11A…»s¶ ÄêˆÀËæY  v, V‡m–ÁPó ÉÇäö®fêl(—Û]»*“?o£\[}:é PÌ;ë-€ª¶­°KK¨A Ô?á‡;—®eFŒIÖ€¯ImäRAPǽrÝ«CñI~àéÖÊçý5p«Y³eíàK‚}Ìg½@ v Ó•BÊ$åªwöª!| ¬¤eÇÔ r1ã½ óŽÜS¤¢›…1v³3ª(* ‰ #±=èåÁb'KSIrÎNɱ‚K¸yø T—nÞŒÖfU"u:¬~(¢ ½[HÒ/šRI2I3â²17)’ÚŠÀb§Oo­Œ`L±ç½{€(µi3¸tk J‡+ä;!Ò´áÑqžýÍ*!yÙ€LÕBÉ+…cÇÚŸ#&Êc*& РÀ±¸ÅGQ@ÚBÀ‚û'¸¬Qša¤0ˆ=«I6t&¶d‘ ÆäЍ,énØ·°[©«—æ>ÂªŠŠ¹bÞuAžà¶¡@‰&;TR*ŸIƒ¨’$“Êê)}2Ä1dÇáyù¤~ŸüÇT–î>6±:ÍTkx0¸âÐ`¨õ2—|; ~§¦nšÍ«]5§`Óõp>jLnã …À&*)§ÝˆöŽDšTµošÌ 0+0#cêDù H6Ì´9 ·P̶ˆ÷¿aT„@D€ ’9¬ ôT x°Ó[·;bÜN¨Œ ¾e˜÷ñJbÊ`vÐlU2 œ~Ojæn¦Áb‰qµÛ²©3ñ1Fú5Å·Ó®• ðñ^²Ø «jÛ´º„ÍAÃþs¹zàFThÄh ô–ÞE$ {Ñ -Ú´?—î`®q?ÓQ§ µ›6^Þ¸'ÜÆ{Ôb ÐÙÝ9T, òNZ§qoj¢ÀªÊX»éÖ¹–Ý`·mæå­É×< v!m®+;ÔzŒmÙw$·üÔUX’˜È˜ÜR[{ª iµ¶.9“Z:‹ªnž‘aŒ‰p¦+§¡±q÷¹Ü#KûG‰ªŠdëxº^=EИTñ\îÖÞ×®¯qîð̇šõz{NÁ˜ÀÅxaÿÚ¼ÁuÖze6Ŷ’qÖ¦¢¥é ÇrO›À*Ûq͹“le5Å\ÙÇÕ(UQƒuÜë|QƒÞµÄK\r} óAƒ(8éî°½¾ô3,˜Êg[ª;„¶GÞ‘WäÓ‘Ž8º €=È=ªÖ:¯M$ “ÆÏGPÁî)vÜ(â›@sÜÍŸ¬ºW °SûGšæ$“=·C1ëÔ$÷Ûfi_—ñUŠM²àmާŠV¦DÿÓºgp-¬dDkÒ5Ì' Aíê(=чý±TqéY$Ö·mî÷ÕØ3ê å Ï ÄóU ‰ŠfvÀ"”qðS¯ÜÞ*`›ìBŽÝ?…‡»ÔOy­ZP=¨cŸ&‚ªg3ˆîh¹« æLE ¶ÅŽ­,•»s‘1âkYó æN¾(6*<˜¬ 7±X sOšÚÛ>É“É'“A-’œ ’EIv oæ+ DóLÌbkâ7S 3¦LA“QL°WÚitÏ„äØö¦! >aI˜ƒÚƒ*ÙéÊ›–=ÍT5¨[ ¡?÷ K’“ð(Œ[ÙÃf{ŠP™)9·ÜÏ?jŠ»éÖ¹–Ý`·mæå­É×< v!m®+;ÔzŒmÙw$·üÐU‰)Œ‰Å%°÷º –˜Û[`ã™5£¨º¦ééÈ— bºz_{‘Â4¿´xš¨¦N·‹¥ãÔ] €õOÎímízê÷ï Àhy¯W§´ìŒ W†ý«Ì]g¦Sl[i'jj*^ Üw$ðì)°|­°GÐk™0ÆPc\P…Íœ}Q€…Uðh0']ηÅØ=ë\@TµÇ GÒ42ƒŽžá; ÛïAÃ2ÉŒ¦uº£±HKaTxéqM9àP‹ È܃ڭcªôÒJ )íà¶A ÃÉmîƒ>¶™þõP f ú{Ñ(¸É^ò>ôÃPHÊ>)L´â<ø¨¥À9Õ²XžAYíÛE_VåÂIúTóT̘ÅŽbiQQ=Øï·z¨æ|,î¨ò2P¤Š*¨P\dR[ÊöûÑy$Nñ⢂(Y$“q»v•ˆE-?Þ¶6Ën\8šÆÒ}^³¦wºoômÉc“ ŒÑ´ŠÜ{y1<·ŠM;’¤°_Š¡KŽL¬5½P¯qÐâ`ö¥°5_Ô?¸™¤[=KtÉt2æäâ„D ¬¡Eç²H/ÉHïUIpI9æh,úsÚháí€ÐO$ Fd´Œå‚¨å›‘iBÁKez›½C„)l/´’'~)S©|¥Ó^aÌâ?ä×_Afå»n€¬î^'.õåæQqÚ%—\Tî„Ôÿ2nÜ{8ûWu¬¯2B†|Wut"ÊÛS÷w¨©1ITªD F§æ³bÙ'˜S†Ú c1.fƒx&w1@'´–O`)‹Æ‚’#°¢$dý¢ªijOon襋EŒ‚ùÙ¥´F;$’IŸÍ1_vY“<ÍE8d™ÀGoµ#31>Õ¸ãuŽ=þO4¶ðíÞ¡Ô¨{Jè81ç{®„'…Ùþk*CNF š¨ô‚‹¬Î¾Ûc‚Üš£„A$•FÔ÷5À½Uà°ªF‡Š•ë¯pÎXž7ÅHµÓÔõÃf׶ߟÝ\6Ðvã‚Kq>)íà¶A ÃÉmîƒ>¶™þõP f ú{Ñ(¸É^ò>ôÃPHÊ>)L´â<ø¨¥À9Õ²XžAYíÛE_VåÂIúTóT̘ÅŽbiQQ=Øï·z¨æ|,î¨ò2P¤Š*¨P\dR[ÊöûÑy$Nñ⢂(Y$“q»v•ˆE-?Þ¶6Ën\8šÆÒ}^³¦wºoômÉc“ ŒÑ´ŠÜ{y1<·ŠM;’¤°_Š¡KŽL¬5½P¯qÐâ`ö¥°5_Ô?¸™¤[=KtÉt2æäâ„D ¬¡Eç²H/ÉHïUP…Ü÷¥w-¨“P!QCƒºÊ¢²µÌf3Tÿ“@ÊŽë‘!WÿwH#d+]c¡@|Õ\¡ !Gj[èâ‡SÀïA’Ù©'#ãµDÙ~ÜP/€(¼ óÉ¥ôÜúŒH;ÐPÈAŽFÍ`Z vyjpél€ž|Ð’Nê)I¹væ6öcm:Z`B«±&Zy¬€¸t/µì?wæ‹Yic &cUq?¨µ< )mÛ‹¢ã6À «ªå1Qd%N4gL)À–c‘h¥u gžP¸:~³©2xdñF×A{¨Qwª|Wœ$Àÿ½5‹g¨ÿE3éôè ž í^ª#»F•&Y›ÅZGôVí'é]¸4:ì *õØnžÕ’×Ã7s&»’ý•Ì-ÀÄ+›§{Vo]{¿¨÷"cŠƒ z‡ÜtjFÚ¿UÒÛ>à\öÿEtõoníÑsÓE§Z©‚ìÏé®*?UGªÈálb¿õRºª.w :Ë÷W%¾²ôD&‡1Q{—z‹Ì ã÷MHµÑw¨wµn8^Z¹æè lóâ)ñ–$ûˆÔÏ5‚¢œˆ“þÔ âZ|S¯?ÿ4€!-+ÉíªV¤Ä( \Ãĉæ„1Y% wâi•-ú›A€‘³LU]¶ax XÒ-¡ãã½+–r}6UOêj£º äöR Viº¾a*¢JÂݲ×OrP%Å Yై‰5@팪b;H@2\" ö e(PHÏzWp"Ú‰1ÅÕt8; ,ª++\Æc5Où4 ¨î¹÷t‚6BµÖ:4ÍUÊrv¥·þŽ(qU<ô- ’r>;Q„M‘'íÅø‹Àß<š_IÝϨÁ‰½õ ”älÖ §g–§–Ì(‰çÍ $›—ncof6Ó¥¦„*»e§šÈ ‡BøÛ^Ã÷~h¹‘P:f5Qqú‰×ûSÀÁØ–ݸº.3l º®QBTásFtœ f9ŠWP–yàEkƒ§é :“'€&Omtº…z§ÅyÂLûÓX¶zñS>ŸN€™àžÕê¢;´iRe™¼U¤q/EnÒ~•Ûƒ@ƒ¡®ÀÒ¯Q†éíY-qL3q÷2k¹/Ù\ÂÜ A⹺wµfõ×»úqò&8¨9¤3,HÏâ²”ÁRäÑgÌ,4ÁUWP\÷ P@B2b`˜¬¨KF_oÿimŸP³/кüÕ†#góA°USX÷<ÐEs9'lR3’Ø) ?{xÈ€ªmƧE¨6#7XZ.ñÿV«Ç÷@ø€©`'#¿jn€£jiäÅ:&µÈ,Ü/Š’@~àшPÄ-»däO4°öžü4Éh#z—}ÍûAàRÜcé ÜÔVP™$±¬@Ä’GŽiÒÜ ˆXüŸµMšÐ0VGe‰ §Gí¼íŽî€gä+Òu bãÜ00öÍy–ДËÒkpu'cñE܈n³ ˆ=¦‚v‘ͼdmÏ'íM‚Ì–2<Ó\!-„š_NB+¹ ïâª&–’àä/e¬ä'`+’&5°Êf"¢” *TòÝé€[i‚‚;±=éCûHTãs©7qbX[>æË€<8fŲI“&g·j ¸¬GÚŽ0YV  ±üÐ U€´P{¨ª2aæ±¶ 2y ÿ5T[]?‚ÞL LÝì†3Åõ$Åæîrú¨ ã; j95PñÐPX2ìÁÖÿš¢ZœÜ3qÈÐ'ŠPÒ°ÛiÔR/¾{{@Ы@HЀ9¡l*— ³@©¢Tæ€ÈfX ŸÅ!e)‚¤É¢2ϘXþi‚ª® ¹ï@ €„*dÄÁ1YP–Œ0,¾ßþÒÛ>¡f_¡uùª$# FÏæƒ`ª¦ ±îy ŠærN>ؤg%°R~öð)‘U 2ÛN‹PlG n°´2,]ãþ­V!îð)RÀ.NG~Ô ÝG:ÕÓÉŠtLkY¸_$€ýÁ£*¡ˆ[vÉÈ$žh aí=ùi’ÐFõ.û›öƒÀ¥¸ÇÓ @'¹¨¬ 02IcX‰$Ó¥¸@ ±ù?j›5 `¬ŽËANÛyÛÝÏÈW¤êÅǸ`aíšó-¡)—¤ÖàêNÇ⋹!Ýf{Mí#›xÈÛžOÚ› ™,dy¦¸B[9?4¾œ„WrAÞ#ÅTÿÙruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/blendmodes.ui000066400000000000000000000404741511343406000245400ustar00rootroot00000000000000 False False CSS Blend Modes 400 300 True False 12 12 True False Blend mode: 0 0 0 True True True in 150 0 1 True False center True stack 1 0 True False True True False False crossfade True False center center False True 12 12 True False Duck 0 0 True False Background 1 0 True False 0 1 True False 1 1 True False Blended picture 0 2 2 True False center 0 3 2 page0 Ducky True False center center False True 12 12 True False Red 0 0 True False Blue 1 0 True False 0 1 True False 1 1 True False Blended picture 0 2 2 True False center 0 3 2 page1 Blends True False center center True True 6 12 True False 0 1 True False 1 1 True False 0 3 True False center 1 3 True False Cyan 0 0 0 True False Magenta 0 1 0 True False Yellow 0 0 2 True False Blended picture 0 1 2 page2 CMYK 1 1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/blends.png000066400000000000000000000014241511343406000240320ustar00rootroot00000000000000‰PNG  IHDRÈëò/°bKGDÿÿÿ ½§“ pHYs  šœtIMEà$§}TiTXtCommentCreated with GIMPd.exIDATxÚíÕÑ € DÁ=cö_£-œ-ø!„ÈL$ /$,­fÒI›z¯{¯Ÿ ux+ €@@ @ €@@ @ €@@ €@@ €@@ €@@ €@€@@ €@€@@ €@@ €@@ ˜€@@ ‘ÎI甩ñƒ€@@ €@@ €@@ €@@ €@€@àCe‚÷®t[awjøû=Ì €@@ €@@ €@@ €@@ €@@ €@@ €@@  €@@  €@@ ˆ @ €@@ €@@ `cFÄÛsÛIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/brick.png000066400000000000000000000116631511343406000236630ustar00rootroot00000000000000‰PNG  IHDRúT«ú*£sBIT|dˆ pHYsæ °tEXtSoftwarewww.inkscape.org›î<0IDATxœíi´Õ•€¿ ‚Ñ'¨ ‚ˆ‰FWÌà|¿by‘H[PØÐEä3"r·ˆ,–¿óØšÐÄ¢œò3dùð'`fÅ2#‘¶ ¡‹Èà÷ØJw·ñî <)"ë;ªh&ÓГ¹þ¡²|¸TUWT,3i ‚ ]Dv~ ¤m­œç¨¾f@Sÿç(ûÕzõ½\[¡¼H¤­(Ò£ŸŸS>AD†f”ùn]-îu”çmÏ…ðp¬ª.­Pf$ÒVºˆ &AmvR,?x6õ ª¾ã(ßÜSŽ«ê¬ åE"mGh¾®ç}_ÈøüžõoÏ*HV÷7ó”“ÇýÀEÉŠDÚ–PCâyß–ŸßåQ÷=à§Žò‘„Íõ³XŒ Ù?ª@V$ÒÖ„ú«ž÷ JûPUžÎ©{•ªþÕQ^ÅÞÿÛÀª:·Y‘HÛd4ªú:ðBÉ6¯t”-¾—Sÿ/À%ÚØ[Ug—‰tEzÇû=îqíGOÍ(›˜×Ë&{Ý/zèÆ"`/U}¸`ýH¤#é1t "û‰È¤Ä½4‹+<ä¾”U ªË0Ÿ÷7êŠ.SU×ܼ–"£Š…ÀߨêcêF"¨*"²¶o=¢¦ì¿CÓ¼ÅDdðE‡Ü£UõΆE†a1Ý6®îPÏ("r0ÃçÞ„Û€SUõ•€:‘HŸA€ ÙÀ˜”òï¨ê7{U ÜCöÐ Uuy¶•FDnÀâ¼¹Xœ¥ª×7R—H¤Ýì¨çYå |ZU{ •EäÛÀ¿¤Ô™­ª®Þ¾Dd]ììøÈ”âeÀo0#_Ðh]"‘f"";ãRŠþø'à¶îÅæ$ã8¶vÈýªž™ÒXàgÀ‘uEãTuzýƒ‘u€o»ŸÀ¦w÷©ê»ÍÐ!i6"2Ø;P6‰•‘‹öÀg«ê!ɽӀ]X‚ûTÙ`H–c‰ˆœ LÀzÖsUõ'ìp™b˜¶à `«™cTuNcÔD"Epú)¬Œ¹ø0©~MÆT¬c$iw{Üv¦ûjผŠcp-ˆ|X›wtÿ; ;Hó:ðgÌQæEU]ÒH]"‘NFUWˆÈ `€ª.VSÕ{DäqÜá•ÇT©ˆˆŒöN®°Ä‡ÞUDd!+ ÿ!à¦ÿø¦!"±Õp ?ÜbnrÍQÕ…-S²$§ ·6Åž}ð!°Khù2vüxY«t\•PÕËê?Ø ö ×5ªJÑ ‹F³/|ñŽvŠ^Ë1š=ËèYâù'':¼ã©óààoI—ò»°`™µ×kÀ†õ=>E^÷µz ¬­±ŸW=žùmàfàðßõ¥Ýߦ¹WŽÌ%£sd„^ó+ýÖ(ú Çèò_ÞÚÀ™Ø|áý :ïºX·I.À1ØÈ¢ŒÎ/ß6ÉhgŒzwý èýe‡.ƒn¤/C=¾° k0¯´Vxíõ ÐÕ #…yåU­ó. }9°c³ Ø ÚQåsŸ »ÏaJ€¼í=u<¨Oz¢t08ødÎÎÅæ1­4ì´ëû 0ò.ÊÕÓ®¹dÌqº&ú¬ÝhCÇe5Rï¡wü¦ oý=¿‹‹=õ›Ðç =à³¶!ß #ö¹þŠm1Tiè7Ðc!0'çžKmæº76Òб!îÝÏŸ]±ÒfU÷è¬ôÈë‘·q´9‹,”÷ ŸsÈ8$àïþ¢Ç÷ðõyw–ìÑ·ª²‡½B㺯…yÈåo'úW$çpò‡¾‹ ½‚hªêrU¢ª!É'] ~."Uf˜Û#å( ÑõxÖ ªºÛ¯þ}N[§:Ê\:Ô³‰ˆä%ú88@^HÛm‡·¡'_SñÈ[Þf” $YË99åªê?këÃGo‹K®’ 9åWºŒ¼U} ;/íâ8IK÷áÃçLCN"í «ìн¥xºˆô¦`^\Ä2ræi>$çó^p–m§BΑ½«”¼àwϹÍ7ÖØßãOŽò.Ì-:PcK ÎÐÍA„G]+Ñv$¾zpT#iw©êÛÈÉ{ó?¬ª·VÐNU0%éµÊ²°º£|–„ S›ÐNιmÇŒÏC }Ûä(g®—@۫纈l޹Çv"!=‹ËZ¤{ ‹ˆœECŸ <ëq5„YW6Ùü@DVÃ"¯¤1 svÊ¢cç虆."¶ýÐ|¥ªwT,w¨£Ì§7ß ÆàÃSž÷õ ª×‹È>dû7lŽ­#üC¨lÒ®›˜›q\/ˆÕDd°ªÖz‡9 =ùwéÓ8V®%ìNöËk½_µôÉ9úQØêm§ð.–!fZdgÍç jWÅâLÀ“î¤d*Šk}f™ªºæÚ.Þ l××ÐÓØ¿Æ‰(kØ>GUŸÄzdѱ=ºËÐhšåyØAUonü·e£eMC-ŽÞ1رÕ,&'#µ\Ï>(™;!o*Sß®ËȺó¾”z`{ó{$ÿµ­Ö=ÇwMù:ÖÐ]sô1ÍR¢$7'× óªf1Ù rÃDdª¾ßÀö½PÕGDä_ïdÜÒ…%ݸ:@ìâœò¸_®zY,Iñ0ÌíÑÕ!ÞNï¤"ãDä `£ Ý#Áù˜ozÚhv˜ˆ PU×Ë4‹çÉÅ4 —¡×¯T¶Ë€¯©êåMhëMG™`½z+·Øjù.¶S’åŸ îÅÅz\Ïf°ÏÈ«­Ò¦ÏÐ`:é†~Ù/­EØa¤î—ÅëX`Ïzúaz;S{gpT25h ©†ž¸=¶óÞùàHU}¤Ií½„Ûv nC?„tï²›ð_¤óBíhèñÀÓdB6™÷£vl*IhoWG’Ö¦¯¡ß†§¨?Ì´¶;‘ÆÌºµ†×H7ôn=ŠzKÉš£·ko¾¸ øl,¡‹ý\…ªú„ª>Ta +GUç'V$.ï{.’Psl6}æè¨ê"²÷Â]«í©òõh[:ÉПvRÕ³<O#ÏÐO­È¯¼2Tu&ü¢,ç”OzèN i3ÙûÎú~Ó¶ø²VßÓx ”Q‹ËÐ;r‹-ËÐÛ)jÌRìhãöªúh‹tx÷¢ÔXƒvã\L÷¨¥vmÛu°C#"#°óí.¬ûÿdÿV_OÙâ 1ô;UuiÝg«LþæFÚjîÀ†éß+±_[šdøªœÛN—³EÓQÕ€£±—eòÂSMLz]¾Š»#¹OUëçÀ¾ós’Ót¾‹£i~«†¡«ê ò‡läMà$UÝGU_j¡µü[äÉbMàQÙ·Iúx¡ªÏbÑ|ËðS܇P¶~•,âf’¤Ø>/§­+R>óšŸ×áÓ«¯f¦|îÚKïÈ¡»ëÍú ðwÍR¤†Àiªêz«6U#"¿Æ}.(p‹ˆ\ˆEuMÝ7‘¡À×h’¯‚ªNNQV°þk"r3îg?˜*"Ç%a£zH^çùf–²©ž =aùQfgœShD¾OÓiWÕѹ ý*`p†ªÞØävC8ó•ÞÀqO?àÛÀ"ò öi,žÛ&˜qoü39‹Ü’å0’Ç9À>¸}ß÷ŠÈSXlÁ·°ö°uŒ<&&ÓzŠúll]Åu('Ë]Úeè:Ê\L*PçDlk·<ލ–]ØÐ¦‘ZgÃ[%Ó÷Â2À6ò{y2¥MWØ£tß ‚»Úw%p8¡Ïý3G»®¨Ã§;êåÅàOMN‚½¬]IG{åö£ú¸î |¹ªßm¦¯»Z ¿¼ˆUðsà`µÕݶGídÜÙØ¢£PÕYØùõ¢õ§>‡.Ëd;³€{^ì:7ÝQöŒª¦î&$kT®ßcÇÍÓó"Ì\Úàö§ÇiÉuÙHDÆŠÈɵMÀ*p0j¹§Ç}€¤(ö™¿ˆ|¿€LTõ4à?ªS‡°t×®íË"‹q`I0³þFy§ûÖÊ{ÎPÏ7iA‘ëJ ¤üMô‚…Hº˳•&ÿmÌ285o€c±ùwßLJXúÞ^ -©hè^#o4Ù‰}Ó&Ÿîás}„‰\Ó£­wrFçÔý]F½ÌdI½iŽ6Oî´¡»Ïô+ x€_‘“X>C—u°ÄÒ€¶Þöo ±÷þËq^ä»x[!þBÎsWfè‰ÌÃ3äyz"c}ÌX?|æYÀvžm qÈY Ì©VJ½¹íþØÑî…fè’(™IâÞ8‡ü¸i¾(æó¿!•Dd+l륈SʪºkzAˆÈç°•ùá˜!¬‡ÂâäZ”üûp'p¯æqM‚&dm= ½L|õÝŸÞîοT›£†ÈŒ-Rl¹«ÃRN½Ž¹¨¾‚9@ÍÔ$]€ì2Š—kN ÙsªåyÍ ÏdyÉÊËö¼Ö%¬‘‘Øbg•T¶½–kè"rÕ%(xTU³ô»tx ئ`›óU5ø”U$ÒWðMàðCŠÇ«'¨·€ž·eQ#‡Î ‰‰TŽ—¡«ýû6ì.ˈ$ÅS®àŒ>ÜV²~$ÒÑxœªþ–j¶ÛFcŽ!”M\xKÉú‘HGã5Gï¹Ù|–Â\8Ë0ÛÞxóÝ#)–úlu=­&[$Ò‘ ¡Uui´H"€ZF÷&g“}È ¸ïÃ5ÑÈ#«:A=zO%‘“È?Ÿíà À>šáŠ˜´µv’.t^¶­µYÈvN$Ò)b<¨êÕÀù´¿)ðŒˆœ/"½’$ˆÈ1g’Bz“£‘G"{ôžÊ"ç—T¤Ë;˜oò³XÄÔݰãE·ÆæaÞfμh‘Ȫ@)C‘‰Ø>{;íU¯öRÕ{Z­H$Ò÷ –@á 8Â4‹¢‘G"+)Ý£÷9‹-––¨ ™ü8&Ô_;éË”îÑ»QÕ07ÕV…d‹(2>y$òq*3t€äDÚÎÀ7±­­fr p‚öNΉ¬òT6tï%XdKàZ`»†4°’¥ÀÙª:¹ÁíD"Kà zRéœ\8&úp¬ZÀþH$’AC ½§3øƒ€Ó°”¾e·â^ÄbŸÝ -Ìà‰t M1ô5(ò)l;îD,‹/ŠE¥½¸.x$âOÓ ½§a; ·ð©äÚ´æ¿7ÄB½Š… º˜®ª®T9‘H$ƒÿØŒ-¹.B>IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/brick2.png000066400000000000000000000247311511343406000237450ustar00rootroot00000000000000‰PNG  IHDRô¨í²sBIT|dˆ pHYs>>ò"ŒtEXtSoftwarewww.inkscape.org›î< IDATxœíÝyü§SýÿñÇk ÆÖØ ZÈ)â‡(I²d[![¨„,í¢h¡E„ä[²d©¯ìkÔÈRÈV„ÒWvÆ0Æ6Ã<œëÃÛÛg¹®ëœky¿?¯ûíö¾Í0ïëœ×|>Ÿy¿®s®s^Ç$ázŸ™ÖÖ&‹e¯ßžÉ~}¸˜$ifa;çœKÄ<¡÷.3{;ð1`cࣄ¤]Æ“ÀYÀ©’nKžsιyBïAf¶%ðM`õ š¿Ø^Òó´íœs®"žÐ{ˆ™m|X­â®þ l&éÉŠûqÎ9—ˆ'ô`fë?¦šùPî> é©ûtÎ9WÒ˜¦pC3³1fv(ðêMæËû×ܧsι’FõÝÌæ"¬ _ø0oöGþü˜,iV±-üØ î¾;< ¼ÝŸ§;ç\ûÊ„nf {ãFxûýÀÖ’îª<°L6Å~°x]}c?I'4„sιáº)w3;ø7ðEFNæË7˜Ù¦•–1³—ÓŽd°jÓ8çœÙ¨Ièf6ÖÌN~ÌWðòy³Íl‰ô‘½ÎÌÖ."ßF]j:çœs# ÝÌÆ¿vhæ-Àñi"z33[ ˜ÄëÏñÛbá¦pÎ97²Q‘Я´³™½;A;o`fËWP¾Ò[•Úvƒáœsn}ŸÐÍlà» ›Ü*a[5ØM{§¶ïk:çœs#ëû„Ì‘°½-¶aµýû·™ÒMàœsnd}½m-›ÿ{âfgs¥Ø›nfk×c££ªÎÖ’.h:çœsÃë÷ú¾´9½ÚÝÌÆ¦ÚÛœÌno:çœs#ë÷„¾uEí.• ½å´S¥;$=ÐtÎ9çFÖ· ÝÌV&TÔü<1›ÙÜÀ‰b©ÒéMàœs.Ÿ¾Mè„úìUy:òú}€ÅRR¡W3›Â9ç\>?¿5³yy}•÷sÀ’^LÐt•ÓÙ¥5³y€¯%Œ¥*WHz¬é œsÎåÓHBÏö^ØX³+ާÌìDàHIÓ#º©² Ê”ˆk÷IH…Nl:çœsùÕ>ånf›ö6ŸH8²´û¦baàPàj3[0¢«ªúLIÓ"®ß%Y$Õ¹AÒ%Máœs.¿Zº™\¬ãíkWšÙì%»«*¡—~~nfËk$Œ¥*7€sιbjKèfv4ÅK°®FùÕàU%ô˜éö’EQ+$]ÛtÎ9犩%¡›ÙV„óÇËø¦™½£ÄuU%ôû#®m{B>:wιžTyB7³ñÀO#š˜سÄuU)~U™‹Ìl`™Ä±¤v’¤[šÂ9ç\quŒÐw%¾TêÙÊø"þÙçP®,yÝÚI£HïAz£ØsιAÔ‘ÐSL3O ø‰d©exHÒ=%¯]+i$é}VÒsMáœs®œJº™-Bº£AW+øþ*zÙÑ9´{„~Ф+šÂ9ç\yUÐSPYµàû[“ÐÍl`åı¤ò ð妃pÎ9§ê„>¶Š&ô{€è3Ë;ˆ’ â€EiA™ÝA¼D8ïü™¦qÎ9§—ú»³‘n.Y=ø”GÞ éÉ’×¶µÔëž’nm:çœsñªNè $lk`¥‚×\›°ÿ##®]4Yé'錦ƒpÎ9—FÕ ý-‰Û{{Á÷ÿO¢~ï.Œ¸¾m#ô?âÏÍs®¯TÐÿ¸=+òfI7‚‰u„$E\?[‚R¹™ðÜü•¦qÎ9—NÕ ý&Âb²&ÅŽÒÿ œÙÆÔÈëS¹Ø@R[âqÎ9—H¥ =[=ýÏ*ûÈáׄÕÜe%ifd mH ×Iz¶é@œsÎ¥WG¥¸kècHÙhô·%/ øE‚0šNè×óJpÎ9׿ú>¡g/xÍ àã’^HÐÿC4÷èá*`SIÏ7Ô¿sιԑЯ"]2›Qæ"I;R¬ÐÌÞ’þ\¦¿AúøGж šl‘íÉwÎ9×džMèf6ÎÌÞcfï2³B+ÌHúq[¾:•~/éÀwr¾ýXI§”ík×%no$[IŠY?àœs®G šÐÍìƒfv5ðaÛ×=ÀT3;ÂÌæ)ÑÏ"b0ømp‡3r=ö+€¯Dö3˜$£ýœÎ¶•TjFÃ9ç\ïyCB7³¹Ìì7„Ñäú¼qß÷xàkÀf6¡H'’n ~„zWä^p$Í&G¯výñ+ÀQÀ6’ºÿ,…‹i´Ûip°]‚•ùÎ9çzˆ äÈì¨Ó‹Èwn÷Àz’^ÎÝ‘ÙYûe,és×wdz4ð1`E ÄU’îMÕþ}þøzEÍ? ì$隊ÚwÎ9×b& 3KA9»ütIŸÊÝQx+ð¾‚1ØWÒOK^Û f¶(ð`®ÄM_ìqxŒsι70åþMŠ%s€]Í,w=ðlº|G ìö©J^×’žNØäÀç€M<™;çÜèfÀBÀ#„ÓÌŠzx«¤§rwh¶ð«‚ýüYÒ:¯i-3;Ø7¢‰ÀO€Ã%Uý\Þ9ç\$3ûwQù ’ž5³ €±ÀS’n¢ÝUÅðyà„ˆ8–ôƒ"˜ÙéÀ..ÙZÒÅÂj/3C¸©Ùµà¥/¿‘”úàçœs1³Ëç|ûû%ýÅ̦óϺ·!gË&Ñ=ˀˀ#âü/°t‘•áf6/áà–wçxû½ÀŠÙ õ¾bfëÇ«ŒðÖÛ€S€3%=]u\Î9çÒ2³€qÿkàlÂy#?îzû½’^Èú‹„„½£¤³»ÚœH¨óò°ðX`ÙÈ8ßlIØûœ‹¤éföà´ìÚáü¸“9€¤kÍl5à#À{ 78ËjÈßG¸™¹CÒ]ÍEéœs.–¤{:ÿ»£XÛ“’næÒû 5Xv#ÜtÚ ¸‹°Ëé£c%ĺ/:@vê×VföUàû„çÝÎ$Íá(­•ݬ\½œsιn§'šÙ[%=`f ›‘Ͳ!L™Çúˆ™-XæBIGF¨ž<| øT¿ŽÎsιœÎ!äÇÎuW;rø™ÿc ¡¨J E·½½FÒu’&ó KHúnEÛœsιž‘ÍhŸO˜b°;pYvøzéOº”Nè$½$é/[êœsνÁ©ÀrÙY+ï#,¦>µó ciÁÝ9çœsúšðˆ|wÂaeOU¿f,ð—D­™¨çœsÎu4ËÌN þñÙkéaúþ/p Y‚n’4%²ßQËÌÆª(Í<<<§s]_1³…‡™À’¦7’sµ’4äAeÓÄG*·ÅheB7³e É{íì×÷ðúIsu{[öÚ*ûïWÌlp:pq‘3æG 3[Ø„ðý[Œ0c²hö뼃\2++™ø,ð pGÇë.Oíffskoçõ3oæîzï Àã]¯›€ßwnçq®…¦$T‚ÊdàmÝŒµŒ™Í\|("Àm%ªW3›PAgàÄþ^0ø p𤛦)Ùz„µ I|SF®u_„[5/%Ô@¾>U½ƒì¼û{s¼õJIŸHÑgfv.°AÁË«ã&ÓÌæ>l l¼%²I7V_"éo‘í•’Í(Ä>†ÜAÒe)⎙í ü(¢‰)’¢×Q™ÙÑÀ±íTèAI+7Ä $½ö–$yWÉ׎íÕù"LuïBø~1âïЖ×߀5›úz6ô=\8†pcS××ùIÂâ’-Ù"ãŸP ß}øú^Vâë3®â˜ÞI¨t5½âïóƒÀg ëü𝒠öŸ×ë b3A'Õôo¿ìë?uÿÛÍûzô³¤‡ IQ”Së³`3[ÀÌv3³K7"§yã‰6½ê}À fv|6ãзÌl3;„pÁë²0ð)àà>3ÛÏÌòžYãÇföžúi%3›Ë̾üØ‘üçD—õ6àdàæì\êº,™ ‰yTÂÌÆë%h*Åßוô¦çÈ’.~X¢-‘nOû°Ìl 3;›ð¼ìWÀfÀuô]³1„ƒoþaf[ôæ^cf³›Ù>„)Éï¶5iià8àA3;<›B¯Ê8àœlªyTÉ~–ÿJý7ß«2³sÌìí5ô—"ÁM úÂ]›³'hÇzƒ†Zv!Qq¯¤©‘ñ ÉÌÆ˜ÙÖf6™pã°i~{Á[óÍ츦IÅÌ–&œóþSÂB·6Yøá9~•VŽ®¸ÖÈê6œK¨I½TÃálÜmf›WÜOª7Ò1ÓmißzƒMè’^•´ðímU²ˆ+›ŽÝ—°Øè<`*úéû™Ùך"–™­Ü@8ÿ½­¦ž9Wm/3Ûº†~efs¨mÛt,æÎ3³*(¶>¡g» 6IÔœ'ô »uKÒwuc_ÉÑÖï“D”1³EÌ쇄ڵÇöŠ;ø¡™mßte™ÙfÀµ´oTÞíÕ·…ðföÖšúª™Í L"lEk›Ù³Íl×ßYNª·¢™-—¨­në¿«`€'ô¸[Ò©„­_× ó¶ë$ý6E@f6›™íG‘H8Nս΀Ój^Ø“D¶-æBª_•B’ŸçœÎ4³¦j#TÆÌæ®Öm:–aÌœjf{UÐvʵªFé)ÛíÛÓ^ëDÒõ’Ö'e¹¤ãföM'yefë¶kG½+{ÍœÀ¹5­ÆNÂÌ~Nøðl»©„-Ø@¿U9˜ÞHæNHõø#+K¼`ж2k›Yê"YkK$lÏzƒJMñIzQÒÿÅ>c̶-}P¹kǘ¶F©/·}š6Ûßz½µ#¡ÎéöN³¦Þ{~vÊÌV¾Ùt%Œ~‘¨­ÔÉm ¡Š^J©Gý‹W½gÞ ­±d`f˦×`ðzÜnd‹—i³“æ°šf»™D(ógà>ÂA-EM!ÍqÂe½ƒð5ëYÙªéÓI7ƒ×Ëö^@8Üh ²eJ›Ùg´SÅh5õsôÔíÍAï”Úî;œáíýü5ánØÅÙˆš úefŸ¶KÜì+Àu„õK%Ý=B ³¶Ç­GXܹ.°Ð0—üNRž]Uú„™}FRª‘bݾC8)…€³ å@ÿ¦Aêîg³@Ûv䤚â?ÚÌ®ô`DU$ô ÍlnI/Ä6”­š¯bëè@ qW³Zz6sa»Oˤ‘òà’dÌlà' ›œIX,ù½"Œ²gá·g¯Ÿd?ƒ+Ÿ!1w×%MM·wû‰™]'鞦)ÂÌV¾š¨¹Ó$ ;Ó’­á989;+úlÂ)m1æ#=Š™â®"¡ÏEØþwa‚¶ªZ5¿$aöµ ÿ \_qÓ*n¿´ÚzvùéT_ñh´ië~î/‘î8Ý+ìÑÉMáô‡Û Ez¾ ìC(¯»(aTqml‰ÌM( ûþ÷ç°/ñ;f¾ß'½PÒõÙóû3åLclffËIº¯äõUmáÚŠ4 ½ªrÒMn]ûC™Ÿ›~QË3t3{áŒbOæéMh:€nf¶áÀ“—´q#UIS$Fxný9àèÁ¦t´ qÇYÖ*»iO±¸u‡˜eIOFÖ±•þŒ¸$U­øÞ<;윂ªJûJ÷†TžÐÍ죄g¼+TÝ×(ÕÆÕã{’¦xÌ7$’ aIzIÒɒލº¯öϪëõ‚‰ÿ¾!éüØ@$Í"Ü\ÄžE¾[¶ý¬ŒªÛ„š 1¶ ºÏOè ©4¡g5»/ ]YA÷f­Z|’Ù7ASIú~‚vúÁ¯Ìlñ¦ƒÈás‘×O&aql­ÅÖ„)ü²$,¸+£ÊÄ;ÛYåéžÐRYB϶¥ýß’Vµ'› Ëlj†v-a;£ Îhóþ^3[›°Ø0ÆWS?òt'pjd3{½ û^UyV:¡g&7HK7Oè ©$¡g£‰Ëñýˆuhj5éPö¼þà3Ùâ5÷ºm>iïÓ‘×ÿ^ÒMI"y³ïvI”õ~3+º oQª}¶¬™•Ýr¶1ÕžCï ½!Éz¶'ô2š?ïx´8¯éd‹¢ÞÙÌ!’bŸ{ö«Ã²2ºmôáÈë¿"ˆÁHú?à´ÈfŠþýêXé]vÚ¼êÅÉó÷Ò9ý$iBÏ\DüÔ›ËçIm¡¯MÜÏÔ3À‰‰béG³g™Ù|MÒÉÌ–hâIMÏN‰¼¾èj£Ô‰9[Ÿä0­ø(½©GègÒîcûMkFç™u"¯?KÒKI"é_Ë?k:ˆ.±³%‰bx7·€´ }‹%?DÚc†â ½Éº™ml“ª=—Ëïš KlBÿe’(úßNf¶KÓAtˆ}Ìrq’(†‘mc»4¢‰å²ú yÕ‘ÐÊ}ZåêöNžÐ$¡gS€G§hËåö pcÓA Èj¦ÇŒÔî”tkªxFÍ,fš;¥˜ïûc@ÕÓíbfŒpÔh^eÚcß_tÚ½®â^žÐj„þmÒž©ëFö¥–­_•7×E/âšTŒógg7RM‹Iè·Ôøs|säõEf"Ê&´_|ÿúy×T˜Ù*_¬<«àûxBo@tB϶sÄnUrÅ\$©mÓí±§\Ý’$ŠÑeuà{M`fK1üéu#ö´¼”$=<ÑÄÿ+ðÞ²«Ü Ù‹?'ð±œï-3:ŸTâh¶žû¨•âp–µãòyø|ÓA "¶ˆÆhMè÷á÷3»JÒ©*(öp ÚzæŠMwZ´À{ËŒP_’ô/3»ž°x-¯- §Œ¤èóóW §Ø•)=ÜÔ}3K¶N@Ò©ÚªCT"6³])öƒçâœ4Ú&fåìó„ÚÑèÏ„Õ×û•¼Þ€ÓÌlIM”ž?òúº¿ï1 }|ž7™Ù¼”+wýhöëÅû\ÝÔÌÆJze˜˜ÞNx,VÄdàÎ‚× h*¡ïEÜ:ÝZ[q0¥§ÜÍlnàÈ„±¸‘ÝH{÷iYÜíÞ–rV·¯wD\?8µ¡Ò°± ½î"B1ýåJè”Of ½ˆy»p™éö GJ\0!öD8W\Ì}"Ŧ \œ€m³í7m“ЧÆvnf©naæý’®ª¨m$½lf;m•]X¸ ðà˜då›Ð§%‰¢žþªNèHºÇÌî§X±ž-? óçe¦¡/È~6§P|Äl„Ç1eo\ 1 }‡dQ¸‘< l(©Íÿ8b¦ÜŸIÐÿ—ˆ/?:”ß•%tIw›ÙŸG4óC3»¶æê1 ýUI/&‹$Ÿé×Îkf³å˜MŠ¡C¥±Àµ[ öÙþù¢¿n—ôŸì÷Pnáã’xB¯U©)÷¬^{Þ••.ÎÓÀF=PßÝ^½­*í¾j¶=­ÓG)~³}a×{BïeFè'¬`tÕ¸XCRl™Êº=qm™=»ýîp´kYã G­V]ô)f‡BÇÀÆö™g_[ ~žÒåÀî’†úÇÜKbúJf6¦ÅUðšö`àÝ%¯_’pŠWb«ü-ÇÐɬ ËE\[{B—ôO3»bqoIHèE·«½ \6H ¯˜Ù”{”°$õÖ™8KÒI5ö×*E︊”"tC{‰päì&}’Ì!nÊ}`…Tô›ì1Ì' ?7emIñjayÄŽÐWLE=ýåù»¦¡Cñi÷MÌleŠ?½ZÒP«øý9z(:B_¦’(F—Û€$õÛ´PL1gMÇ|MNàÍ«s‡³+ÅOŸjŒ¤;Ìì«ÀñÍT±Mì±ÈëkKèÙ"±˜5@çxOôôA\L(mœ×|À±%bîßÏ#Àj%Úô„^£¢ =¦^÷h÷*pp¨¤MSë#¯_8£ìÅ’Î-ò~3[‹Jè’N0³(¾r¹2’þkfSþ\ô:gf–"î¦æ¯9ÞSÅý:£"kM>R°ÿYÀEÃü¹Ð{@Ñ)÷!ÏÛuÃØ[þõ>Mæ'núuÃTô¹Ýiß1Õ ×¬a¯ü€µ#¯Ïó÷LQÇý ²Uçoz¶ØM’†›ðzî= hBŸYIýk:áĤµj>«vÙ–›#šXÑÌVOO¿’4Ø™0¢j‹˜„¾aÁ_bjhÌ¢¹:Ž^ÔH«|„Þ|„^K€•$›ã¸Å~Q´F·]“DÑç$]Ñtbnä Üá!…d[n7‰hâïÃ,ëTUBŸDµŸ¿#m›õ„Þ<¡§÷(ð I[HŠ](Ökbú'³^7²C‰O¤©ÜLÜŒAÕ'×#®€Ñˆ³YA—2…r^žî ’ž!òâ~F>Ÿ(–¾–=WÝ‘¸CqRÅ2 ¸;¢‰wšYÑÁŠÚ'òú<Ê&¯ÇsÖ`¨jÚ=Ïî²Õâõ›ôúMèm[ŒÓÖ‘´wÍU‘ZEÒó@ì q‡™™W#ÌAÒÀ^MÇ‘ùCäõßIÅ ²*y1Óú®Éñ¾ª¦ÛT•ÐóT©|’rk¨ŒP×Õ hBï·½Ó±^V•»m«_yý¼ÀOS2H:8µé8€“#¯_ÓÌ6KÉ›BH,e]%é_9ÞWiB—t0ÒÔxQ‘cö![ôZ¶æ€O»×¤hBÿ7¡< ƒk•%.ÉWÿ¿nñ:[˜Ù¾)‚%öîm2IwÿŒ÷H3›'E<Ìl`›Èf~–ó}e·h™ùL=J¿hˆCaã[×Z®PBÏVk7úÁÑÓ ÏãÖÏî˜]‡ìÃ!v”p¼'õ|²Õן$ÁÙ¤ØÚ+§¤ÀÌ–"I3:ˆá ®tªzÊÒ'ô"Õ}a\Ë•9æ/fñK¯»x¤Ÿ¸«N#¾Æ7„¤þ…íô=I·5ƹÀS‘mlgf_‰ $éŸ,ÙÔɶ֑ÐÿLܹ ž£ØÚOè-W&¡ÆçèÓ€ÏJÚHÒÿ5LÛe‹ã~‘¨¹cÌì23‹©ÁýÙ4l?±9†ê+Š IÒˤyž¤™[vu´™­@x.ü¾È8^¡ØÏqå =»¹˜T²Ÿn—eß³¼<¡·\™’‹““GÑn—’ùCMÒcŽ>Mš³Î7î4³cãÊ~/²:èß> ¦Ö‘$3ûpåk«Ç:ðHªÌ~ìNk™Ùy2ÊJÈî ü„°¸2ÖéOC¬â`–Á\ ìT²¯NE¦Û¡7ú^5l¸KÒ7kè§I…^À„©õùk*°[ѯ¿Þð³òñ ¾/³ûÝ&ŒÀæ¦ÿEÍÃe;ËöyNοÚ.øuß8û:¥øz+Ñÿ~‰¿ç“]€%€1]}Í ¬L¨œ÷XÂ>(ðwž#âk¾dÁ¯ïx²˜¿ß †ù·3D¿•ìëþ‚ýœ”øç§Š×µM¾ö*ÓÌž%¬žŽ}F>”=%M-ðþ%(·ønùŽe}¤gÍìOÀú%úðG…êsEôÂ}T+ó Ò=Ãi›§]‹ï+² JIDATʶz2OãàþŠûG8s5`y`Fi2ïp0pK+ ³v'ìImvÂ÷zªKæ§Kº¤à5e“ÖS UÿŠŠ]íž§˜L·²ÕâÆ™YUß+×Áúë&SùuÓô…-U;âeƒk¥pLï'©&©æéÿ?@ôjõ²‘t«¤u€kîþ\`EIg[*£™ÙÂÀœ%/Mè—‘-Óâ¸õ„Þb)ú/)ð}ž¡æÊYf¶)akÉ÷€wVÜÝÿ˜Ùš÷Q IÏe#·å qê±ß |PÒz’®ª¹ÿÚd“RVî+MÒo\þSaW¯W–ô I$n?&YE%tIÓ€?å|ûÅÊrÜPÊ—YÈÌÆEöíF½@FÒófö]àÄñTéäTwä#13%sssözïPSÉ)º²·™}ž0-»yöŠ=5«Û4ÂüeÀåJw‚ÞKŸÒük¢¾s“t±™¬•ãí± `¤X^7³÷-€5‰û·ó ¡ÖÅ„u&)ŽóŠQn*ûùDÛeÏÞ“ã})5>LùiûùÈW˜æ¶ˆ>êrWÓ Ʋbøq„cÿA˜:m£™ÀÒ’ÊÞ]æffã3ͪîkÏ‹d’}ÃÌ–$8²4áÀ•î×[²·Î"|¯gVT?4Èë_ÀÍ%Ëmºš˜ÙÂÂÑe'Çu¿ÆJ5?>ÈëF`²Ýh“$¡˜ÙöÀ9IKï,I)Ž‘™ý Ø«Ž¾†°äh«CŸ›©Ó‰®G˜Ù˜lM€s.“rëÈo[¶—Ò_êèÄÌÞ|¦Ž¾†1ꊶd‹ë<™"žÌ{³d =Ûgz`ªö+tš,½êÓíÎ97ŠUz„¡¤³€ã«ì£ ýÍl‹ Ûߠ¶‡3•øCœsÎõ°:Î$þ2íI6sç™YòzçÙ‰K«¤n7§c|»šsÎn•'ô,Ñ|‚òÇî¥68ÓÌRWtû4ÍÕîœsn(­ Kú_`#àñ¦ci‰¿x2wÎ97œÖ%tI"l¹ºéXv=°¡¤gšÄ9ç\»µ2¡Hzœ0R?xµápšð'`cIÓšÄ9ç\ûµîú`ÌìC„"4K6KM®&Jz¡é@œsÎõ†ÖŽÐ;IšL˜‚?¯éXjp °¹'sçœsEôDB4EÒ¶„“ÍF<<¥;L™û+Î9ç é‰)÷nf6'ð5à Â)½în`GI·5ˆsιÞÔ“ }€™-ü„pZ¯: ø’¤›Ä9ç\ïêé„>ÀÌ>B­oØt,<|FÒ…Mâœs®÷õEB`f«_¶¦½ëžŽ~,é馃qÎ9×ú*¡0³w}™½ápNHî¬Âîf*½]œ#é‰ ûrÎ9çFOBïdfKÖÈ^«óF6û 0‰Ä'Iz6²=çœs.·Q™Ð»™Ù`EBr_ XX°ã××tࡎ×ÃÙ¯÷7HšY{ðÎ9çðÿ±~RüU7-`IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/builder.rb000066400000000000000000000100011511343406000240170ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Builder Demonstrates an interface loaded from a XML description. =end class BuilderDemo def initialize(_main_window) if Gtk::Version.or_later?(3, 20) ui_path = "/builder/demo.ui" else ui_path = "/builder/demo-3.18.ui" end @builder = Gtk::Builder.new(:resource => ui_path) @builder.connect_signals {} @window = @builder["window1"] toolbar = @builder["toolbar1"] toolbar.style_context.add_class("primary-toolbar") add_actions add_accelerators end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def add_actions actions = Gio::SimpleActionGroup.new actions.add_action(quit_action) actions.add_action(about_action) actions.add_action(help_action) @window.insert_action_group("win", actions) end def quit_action action = Gio::SimpleAction.new("quit") action.signal_connect "activate" do |_simple_action, _parameter| @window.destroy end action end def about_action action = Gio::SimpleAction.new("about") action.signal_connect "activate" do |_simple_action, _parameter| about_dlg = @builder["aboutdialog1"] about_dlg.run about_dlg.hide end action end def help_action action = Gio::SimpleAction.new("help") action.signal_connect "activate" do |_simple_action, _parameter| puts "Help not available" end action end def add_accelerators accel_group = Gtk::AccelGroup.new @builder["new_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_n, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::VISIBLE) @builder["open_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_o, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::VISIBLE) @builder["save_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_s, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::VISIBLE) @builder["quit_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_q, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::VISIBLE) @builder["copy_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_c, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::VISIBLE) @builder["cut_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_x, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::VISIBLE) @builder["paste_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_v, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::VISIBLE) @builder["help_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_F1, 0, Gtk::AccelFlags::VISIBLE) @builder["about_item"].add_accelerator("activate", accel_group, Gdk::Keyval::KEY_F7, 0, Gtk::AccelFlags::VISIBLE) @window.add_accel_group(accel_group) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/button_box.rb000066400000000000000000000062401511343406000245660ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Button Boxes The Button Box widgets are used to arrange buttons with padding. =end class ButtonBoxDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Button Boxes" main_vbox = Gtk::Box.new(:vertical, 0) @window.add(main_vbox) frame_horz = generate_horizontal_frame main_vbox.pack_start(frame_horz, :expand => true, :fill => true, :padding => 0) frame_vert = generate_vertical_frame main_vbox.pack_start(frame_vert, :expand => true, :fill => true, :padding => 0) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def generate_horizontal_frame frame_horz = Gtk::Frame.new("Horizontal Button Boxes") frame_horz.margin_top = 10 frame_horz.margin_bottom = 10 vbox = Gtk::Box.new(:vertical, 10) frame_horz.add(vbox) bbox = create_bbox(true, "Spread", 40, :spread) vbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(true, "Edge", 40, :edge) vbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(true, "Start", 40, :start) vbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(true, "End", 40, :end) vbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(true, "Center", 40, :center) vbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(true, "Expand", 0, :expand) vbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) frame_horz end def generate_vertical_frame frame_vert = Gtk::Frame.new("Vertical Button Boxes") hbox = Gtk::Box.new(:horizontal, 10) frame_vert.add(hbox) bbox = create_bbox(false, "Spread", 10, :spread) hbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(false, "Edge", 10, :edge) hbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(false, "Start", 10, :start) hbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(false, "End", 10, :end) hbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(false, "Center", 10, :center) hbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) bbox = create_bbox(false, "Expand", 0, :expand) hbox.pack_start(bbox, :expand => true, :fill => true, :padding => 0) frame_vert end def create_bbox(horizontal, title, spacing, layout) frame = Gtk::Frame.new(title) orientation = horizontal ? :horizontal : :vertical bbox = Gtk::ButtonBox.new(orientation) frame.add(bbox) bbox.layout = layout bbox.spacing = spacing %w(OK(_O) Cancel(_C) Help(_H)).each do |name| button = Gtk::Button.new(:label => name, :use_underline => true) bbox.add(button) end frame end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/cell_cursor.png000066400000000000000000000022031511343406000250730ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±`IDATX…í—ÏkGÇ?;–-K­”_„DêJ} ´IŽ ö¡¹åJ C/=´‡bðÜ‹‹!BÁû˜| Ádÿ ¹ã¸'Ç j E*q+D«õ*ŠVÖ¾fÖŽœÕUrÉvwæ;ï»oÞ¼yc–iʼ˱z²Pã‹ÅâÕx<>*"IÁ¶íG©Tê>àõnDtlè-—ËO777ë™LFVVVDDdqqñK ô¼)ã ]ž9t¹ˆÈÒÒÒÏÀÇ@”^Uí‡GkÞÔY,O ºð@§|D‚>Öjµ^Ó6¦B „ˆ¨nŒ¿6¯‚w^ ªvkh¸®[ŒŠJiý¥RéG ¨Ý<‰Ê2búÐ{¹? ÅÔêêê½J¥âŠˆxž'[[[$‰ï€KÀÉ&Ü~3o/Úë "­ÝÝÝ¡r¹üTZÀuÝJ6›½\F€1` ø~zzúÛ¶ÿnÇÏçó?¡óÅá–µ€ˆã8²Ùì×sssMcbhhˆÑÑÑj4½fÜØ‡NŸÿqooïF‡ü‹@(^ˆ¸®{:—Ë©åååf|,Ëbrr2 ¼ä}øôÄb±h~ØžûÔÁÁòª”RˆF@°Ððý89$Ä766nµZ?ÛÛÛ¿_Ÿï¡—!±¾¾~;ÿ&ð :(±Œš&&&n¦R©ËÕj5æy^Ãï(¥¼ýýýg ¿NMMYããã_Äãñ¨eY^¡Pøe``àÑØØØõt:}ÉuÝþüÇŽãd Ôüíwø8o\|üTãn§T*=ÜÙÙ9›Ëå”RŠááafgg¿™™™É¡#<Ö‚ÿ/° ìñBÖÑõ§QÕGp2 '™Lž›ŸŸ'“Éè"¤ÓéÏ'À_f\¿T­ŠGÄ<øåT™£šï8”ñÔK°m;aæ)¢£;x•m‡üκiÍ1¼SXh7»´® ú"Í:ŽÁê ß÷Z¨êø­Ÿ†ï™­ÐA=ðFà'¬3kkkwêoÏÐ5C¨â4Ì`…Îÿ€:i9èÓñ7t†k· f dþ1ïÃŽN@ÿaŒC—Sc´ý÷Ê­Òåå´›ËÄk½žÿb¬÷fÊèÝÊIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/clipboard.rb000066400000000000000000000115631511343406000243460ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Clipboard GtkClipboard is used for clipboard handling. This demo shows how to copy and paste text to and from the clipboard. It also shows how to transfer images via the clipboard or via drag-and-drop, and how to make clipboard contents persist after the application exits. Clipboard persistence requires a clipboard manager to run. =end class ClipboardDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Clipboard" @vbox = Gtk::Box.new(:vertical, 0) @vbox.margin = 8 @window.add(@vbox) text = "\"Copy\" will copy the text\nin the entry to the clipboard" generate_entry(text, "_Copy") do |entry| clipboard = entry.get_clipboard(Gdk::Selection::CLIPBOARD) clipboard.text = entry.text end text = "\"Paste\" will paste the text from the clipboard to the entry" generate_entry(text, "_Paste") do |entry| clipboard = entry.get_clipboard(Gdk::Selection::CLIPBOARD) clipboard.request_text { |_clip, entry_text| entry.text = entry_text || "" } end text = "Images can be transferred via the clipboard, too" label = Gtk::Label.new(text) @vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) @hbox = Gtk::Box.new(:horizontal, 4) @vbox.pack_start(@hbox, :expand => false, :fill => false, :padding => 0) # Create the first image generate_image("dialog-warning") # Create the second image generate_image("process-stop") # Tell the clipboard manager to make the data persistent clipboard = Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD) clipboard.set_can_store([]) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def get_image_pixbuf(image) return image.pixbuf if image.storage_type == :pixbuf if image.storage_type == :icon_name icon_name, size = image.icon_name icon_theme = Gtk::IconTheme.get_for_screen(image.screen) width, _height = Gtk::IconSize.lookup(size) return icon_theme.load_icon(icon_name, width, :generic_fallback) else puts "Image storage type #{image.storage_type.to_i} not handled" end end def generate_entry(text, action_name) label = Gtk::Label.new(text) @vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) hbox = Gtk::Box.new(:horizontal, 4) hbox.margin = 8 @vbox.pack_start(hbox, :expand => false, :fill => false, :padding => 0) # Create the first entry entry = Gtk::Entry.new hbox.pack_start(entry, :expand => true, :fill => true, :padding => 0) # Create the button button = Gtk::Button.new(:label => action_name, :use_underline => true) hbox.pack_start(button, :expand => false, :fill => false, :padding => 0) button.signal_connect "clicked" do yield(entry) if block_given? end end def generate_image(icon_name) # Create the first image image = Gtk::Image.new(:icon_name => icon_name, :size => :button) ebox = Gtk::EventBox.new ebox.add(image) @hbox.add(ebox) # Make ebox a drag source ebox.drag_source_set(Gdk::ModifierType::BUTTON1_MASK, [], :copy) ebox.drag_source_add_image_targets ebox.signal_connect "drag-begin" do |_widget, context| pixbuf = get_image_pixbuf(image) context.set_icon_pixbuf(pixbuf, -2, -2) end ebox.signal_connect "drag-data-get" do |_widget, _context, selection_data| pixbuf = get_image_pixbuf(image) selection_data.pixbuf = pixbuf end # Accept drops on ebox ebox.drag_dest_set(Gtk::DestDefaults::ALL, [], Gdk::DragAction::COPY) ebox.drag_dest_add_image_targets ebox.signal_connect "drag-data-received" do |_w, _c, _x, _y, selection_data| pixbuf = selection_data.pixbuf image.from_pixbuf = pixbuf end # Context menu on ebox ebox.signal_connect "button-press-event" do |_widget, button| manage_button_press_event(image, button) true end end def manage_button_press_event(image, button) return false unless button.button == Gdk::BUTTON_SECONDARY menu = Gtk::Menu.new generate_menu_item(menu, "_Copy") do clipboard = Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD) pixbuf = get_image_pixbuf(image) clipboard.image = pixbuf end generate_menu_item(menu, "_Paste") do clipboard = Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD) pixbuf = clipboard.wait_for_image image.from_pixbuf = pixbuf if pixbuf end menu.popup(nil, nil, 3, button.time) end def generate_menu_item(menu, label) item = Gtk::MenuItem.new(:label => label, :use_underline => true) item.signal_connect "activate" do yield if block_given? end item.show menu.append(item) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/cmy.jpg000066400000000000000000001550211511343406000233520ustar00rootroot00000000000000ÿØÿàJFIF,,ÿþ\File source: http://commons.wikimedia.org/wiki/File:CMYK_separation_%E2%80%93_no_black.jpgÿÛC   %# , #&')*)-0-(0%()(ÿÛC   (((((((((((((((((((((((((((((((((((((((((((((((((((ÿÀX ÿÄÿÄF!1A"Qaq2‘¡#B±ÁÑáðR3br‚ñ$CS’¢%DÂTc£ÃÒÿÄÿÄC!1AQaðq‘¡±"ÁÑá2ñ#BRbr‚’¢Òâ3CsÓò$ƒÂÿÚ ?ú8ê„b„á|d%ô‰r#‚ö5õYgE´îè®Í:°›ëßÐ^í}ä÷“˜B2Ç<Úµ•ןMñí]Œ 6Ó·=Bò߬úÎȧ8´÷l»Ý"9nán™Ó®–K+8‘‹«•HÃ-’@)³=1Ÿl5ˆaíª™Äø ˆçÍu°­5új.–0 ΤêÓ¤dpÖëÑÜôé:mÚ6U¼ÿz$¶ç?\VÖZvËåÉuß@Ðx"ùކ|×zÔä¼2’²ºêÐ¥Ia¶åHÆyÏÖ±¿ü†n·°êÓ¯‡·ºóßh:|V÷ %²IlwGR9?‡ÛúÖÜ=Rá\üU±ÒÁn´Yz„]gï ÒÇ,,C :ŽÞùïVb*œ<,U8JmÅf uÂæõ¸nºó¡¤Z¿–7(@!Ï!²0@ã;dVŒ;™‰gôõèy,x±SPšÖnÜ8Ï´ræ[ìßV¹´½¼éjaš,ó C+À9#v'r{qY±Tö6¶‡{ ^úU‡@6½ôï;|Ý'¬tK[î¦"éÛ^YB|qj5¨9`ª¸æ£[ˆ{/–¸ÚþR}ðøÌ%:•Ci¹‚öÀõÛŠ»¬tè.ãn¡Òäц¦ ÷׊…Îaìê…~"ƒ*Ö‰•ƹ±–Þ$yL`·î 0ôÈ¥µóc}'0IYˆ«P£±'SB®êT¶¶–y3¢5,@çàT˜Ò÷J®«Å&»@±ôÞ©eux­8‘lãs¯XdB§ ï±#Vbö«jШÆü¿¸úêVJÚ5ŸóHh;èDo}H˜@<—µ›ý<¥ýæi }H³Ä1€0ÈAnk”>gÿV<¯®»ï9)ÿBIæ<¯ëÈý±´=S­½Ô7³ÇÆšPÆH]¸SÆsõÍt°UYÐM÷÷\/ŠaŠÄŒ¨@hö¾ŸY\Û¯´h£]@ëÀRqùŒñSª*R«ž5‰·ƒÇ­ÕXsC†ì¦Í ã6‘Àõ¢õ]7§ knšäH—%]˜®…„ ÛrN[>PúöΫ[3ÍQhñžßê»T(vtÛ@ß7„F¾3`Ñ;ˆºr"µŒH¶ŸyS4B=c)­§VÀœï±#;Òkª“óŸš,{öÓøMÌ¢Ñ4ÇË"DNš›I󾫵p~ów›X",ª^WŒ¸+¾4‘·cϰö¬­ùópŸÂÚïß ¹‰·/Ïró²XNâI!ÄD;øgWÔzŠÜ*´@q…Ï4\d´HX€dn*ÕJ¡ cš%¨»¹‚Ò#-Ì}IøêÆ1Õ 4*«W§A¹ê Åuþ¬z”«á  :Aäú–ü‡Åu°Ø~Ä_Uä¾#8·Û4u/í:5»[²M$Í;ê`Õ†5`ˆØ€yò÷®Mw‡| F§í×5ê°”8s˜Øs›OZÙw~Õõû{khíGMW²D±Ÿ8A6ÁK ó¾q·#Ö±àðŽ{‹óÃAž2·|Gâ ¤ÑLSÌâá´¯+sdfèΉq. ¸Þ0»”놵¬&Z $ÎÇm&Üw][é.朥 O¼F…|6sáç'mM‚¹ÎÀVzaýŸàpZªº£ Ôyxq:JÉ–ýS¦.£8¿“ ñia¢MÔê^処jÇQ©¶Q½´ÖÇŸSÌE o˜í{.9nyJðË`ö¡:—G2k‰€š&m3[¸,1”Î@>„Œm]sT?úU·ÐìFÞ+Î7iˆÃê5›ƒá;øE—R塚Ý.[i"³8B%rÒù½]Nà‘•ÆùäVvQ ¨ ›ÛO#ë}t[jâKé81s&üǤ åyΡÑçé°<è|;K•ž Ƹ8(\ðAs[©â[T†›‘±±ï…È­v¥í0×n ‹Z$îëGÚ.·Öbpn!êì‚)dY—PF àƒéŒíœ’¨apÅ®ËbÍGZ+>#i§œ*‘ºuã<"|–«Ÿ´··ýý2âH]å‘L<ŽX9ßÊ;sê¶à©Ò«Ú´M¶½•ïø\EÁäKˆƒ¡fþZzÝu>Îõ‰:ïVh峎ò=Le•P…TòèMDl0ÛþEgÅaÆœ‡eà9îy 9-˜ s±µ‹ræ“‹eu:ß^[úÙèVåÒ –ŽéùK’0xl6øÈ;céTP‡ÝÍ·ãÑlÄ¿ L×C†ß[íÆ ñÖ——¼0EÔ.:”Ñ`>fs¹U#p3ŽN}6Õ}6€\X+®ÏsƒPÔ#_šÀo‹Çyž.´ÝnµÓ¡&êV›uåØœ\j$¶3¹¬­Å7óòí×%¾®ØÚ 9à_Ôd#uæ:ŸNêóôØ­Ä!&%ÝPUØyFÚ€ãúo]U¿¤*“2:ž ‡ˆÂƒˆv­ˆ2H: ,-1§Uîæë%…«ÛÙ¤2ÆÅÚHØ‘4ì;Ç×>õÆn3:Bõ.ÅÎRÖÁ<¿ Ð$¡¡‰­ãƒÂeÔ5L;÷ ÷ïß<Ö"Ò &{—@>@-;×Énº=Ë'Üeð#½IY¥LÙ–ýÕàq2;W¥f%€ö‚KbÜù¯WQÍìL‚Iå;úXw+ÒÉíH–è“}ÌJìÀJ„`c8ÆùþõT?ågí:ò*ÖaÍ/ž­ê7I&â w^y®Aê’[Y"%âýç+¤ZYÁÝOé$ž F&€{É-¶—Ó©[08²ÊA¹þmHNúm1eÐûÚ} ë61u £Í­Ã ÒÙÉÐä{ Á=óTög IÆÚuQõâ;–žÙ¸ÜE6ÕµFþÓ:ØéáÀårºUÅí¼w}õá¶V’[Y^YU;–öÁ öÜJÑY”Ü[]’t#éׂŅ©Yv© æ’M¸Ÿ ÷n¹ÞÞ8¯$»’èA Ö¦%R»ðHcƒÏjÕˆ{œZž?EÎÁRe0óPœ¢â",¸s6¡^¦Éï£øq\D¬ŠeÕ¾ œcƒC¸Ísª f¬‘â>ŸeߢkvC€< üü7Ýtz%éiÌýBÒÑoô×+RB—9¶1ÅQ^” ´ÜrûαõÓu£ X—g¬À@i7ÞñÚ6 ÖÁÔ`éÉl:‹¬2Þ3pÅ£b72Ãf¹Ž¢ê¤öw óëŠí7Ê!½©‚éîë‚¶çîRIYÚÞeL™*ÞÀƒÏpAý*,í2$)¿²$^\W©@­<¢A—s#Û3ûø{ŒŒo¸­”ŸaöñöXk0I˜$kø{ÝEz8h>ò·Qµ±ƒ*jb6ßH>þ´ÿQ.[¤0²ÜáÖëeæz÷U^–öë òŒ1œ‚t@3±í¸­øj©tÁqñøÑ†ic'_eâz…Ì÷°ø· ä‰Jäþð>1ÇÅué1´ÎVð^W^¦!™ê¯‡C‚³ýIzTvÅ¥‘ä(Ñã€AøõúRýHmBÇX1ðç?ÚÔîI">«×ý“êŸz¶^Ÿ+YÆ–É©§t/æÝÎqžÛsJåã(dwh&ûz/Gð¬gkO°y(×[ÜúimHµ—©¼£Xtÿ¾]Â,ùc m^31ÉdoC6Ú¹¬5ê¿# ‡¤lzºíÔZ4ûW‰.¼ë3yöÑcèÛõ©ÂꌿŸq£Ëí‚jÜCI O^7T`ÛN»‹¢Ý -ÝWìM—S™¤•åŽ`0³ª\ð1¸ßŒsUQøJ"œ¸¯‚QÄ»3¬xõÁs…×K–Qsp$»`Ac_9'v wVíß9Ͻ_Ú2°DNaRÚ50䇺]ÆçxØûê :ƒ„”1u8,ú|£9üJGáçwÕO²ëÀñåÜ®`ƒ×1ß^„GuÞ&2͈Ã-ÈUe”•Üc£æ±K ‰¾œFÌÎ$ƒÚöê%pz¯Aºµk~¥Ó"kËiÄš¥†þPx$äàìw÷(â˜ù¥På"Àí¯ÍÄ`jR"½™¦änIåÀ“&4Õy¨/îmºšÀƒÿº–ý›)Ø {ç ð ÷ÞêM}<Úۿ˯Ç!¸š”ëiówo¤ëc±ïîtþ¡Õ¯oÃÚJc–L,¾VIŒjbA2«JTi²$ &mËñ±]:5ñ5Ÿ™† Ö" nm~ð. l¸O K=ÄŽóÁ @G¹qÛ ñïñ[¨âÚÖ€>3ךåb~ê®..[Àåù·ràIe%“L²D„ Ò²:›É8Æ+hª*Aø.9¿\×m q0=&7fÎÚ[XUšéÌʼnhð]±>ÿÒ²T¨×˜ ²êРúM/¿ |,uçè¸7·m5ÕÊ(iƒ¨…5±b ç߃Ïc[iÓ h:n¸ØŒCŸUì‘ozÕwþÃô©úµþ¡Ñ0 î@$€¸‡sëð+Ä+¶ƒ"uêë­ð\#ñ53e³fóÇ„ ‡ºú }’8â•ï¥ñœ¤Íœä‚2¦Ø®'êÁ$Ûšõ‡@/3Éxÿ´½[.ªVn«»G2Jrñ.v9;á·ÜƒŒF tð¸†Ô¦h¸‰Ôsþ‚}CqL·B w똵ù'öG«ØOÔVÎèÂñÊÇö˜ü07ò¿ÆÇ‚vÆ3F7Q¬Îݼgîiü7Aõ;'gÂ;¡Òv](:żHDÝ9,Jµ´à«.pXd“Œçb6¬îø›?Ì}–ÖãXÑóSžãhÛ]g]»—„û3“¨C;;~ÈÉ!ÀðÕIcŸRHÙžZ±æ¼¿Ã)æªÚ„é'À&yè½W¹´ê1Z‹ËB48üFfó J¹+Ààœ’; öÃE¤]|§—ßùâºø§ÒÄd@“½ÀÓN7‘°º£¦ÇoÓ®.¥¼P J®×1ÇøšŽFûÀb¥UϪֆo·ttTp짇{ÝTi0å>\•örKq=ì"(ßÁŒÍg £J``l|º€ü$⬧P5¢›¯s¶ûqTV¢ç½ÕÙc@×@gAm&46G]êkÔ­zŠMÉsâ-È™TQá¤z À>çÁÛ½z“˜A¶‘âL¨ã±MÄ2£\%Ò;‹ÆÞ=Únªû)s%Ê'O¹xߦÏrY iŒJ[Ë0éãÈ©c{Vþà5‰ôâ«øeWU…R ´˜¼n`ÛxÒB×oc½tƒ¨[L -á«I©Ö áIáu§`s¹8íU:©É%„N¶´ïÏèµR¢ÖÕÊڀ嘽òè'A Ɔo¢ÚÌ"×cw³Í1‡IÀu ç)ŸB8Ï5Lfþ£‚yxø-Ž F ýÆ9ë2;Ž«½ůH·ÅÄד†xö{sáG"ù´žBŸÂýÎ=±–>¹ù@ïr4ž|W@T§†÷q¨°"ñ¼²¢òÒ9®RnâOBLË,ØgÙÎu êóg88sÍM• [–¥ŒÚ(Ûo/ ”CœJà ÉÖäï½æoâº8Ë ¶ï #cR6ŒH#ÛëYêåp#‚ÛG3H<}WFÚÑ®:EÌmpd230ÝÁ?ˆ{àcéT9ùjM–†RÏI͋Ϛù¿X餦ë§ÏÓÄM¥ 1 7ÆAÆ?êÎ7®í D•ÁÓÄõä¼–3ÓÚS,H=ãnõ毑Öt·@t&á3¬‚w98ÆvÆÕѦAnsºàâZæ¼Q µ×YçÇdÑ®úœíbÊFuHÁ|î@ÆDàzšDS¢3&Þð¤Ó_âÎQ¬y¼Z$ÛeÐ鈣xXøe¥Ò[Y]`)ßm;¶ãÒ¨®ìÄ;[y~Vì.ͦž„f$mᯒú5·Ièê ]ÞÉ!*Úe{¢Ä"€Y#Æ®á:½sf7Â7;ëë…‹½äó.› FÝvƒÁtú‡Ú+NŸ ¤ñÀM«Ê"–Cœ +ä%@-¿m¸ùž– õKšMâGÖú[½j¯ñ t×ò“ðámoµ¾‹³mv“ÙÇsÖïå¢%Ô©ëÅeu2×|VæU`¨#•Âðj¾ÐOsu7N…áŽHˆb^£ê£ ÷9„íÍv0˜F±¢«´=Þ}Wžø‡ÄQçÂóÜ4¿µCìûÀýNínužtð°UŸ†Ø¶#n1ŒšxáM¥±_µ¶O溳ÃÁ~Øá{ß}ôá ÒÉÕ’^ÎöQ+;´&G]88u&çƒß# \3°FÿÁâºnÅ“J¡™‘ö‘Álû/}¶ËgA>>¦‰³æB{৸ªñt‹]˜ÿ<ÕØÍ{r)˜â9÷ý•llúeÅ›©ÚÇ;FFÌH+‘¹o°ú x*•šü´ŒJÄhaêÓÍ] Æœ—ͯ:«t1euÒžp¯¨. Œ‚™xöúÝ«½N€ÄæeXÔwýáy>ú.• ÚÅô+’DòËNíTº¥ûA-ÒÉ[«pC+)Ñ4ùÕœcb9¥FŽ`Ò ™è)b±yù3{àrï"ÐfW?ìÔÖã« ¯á•ìC4¦N0À>r?©«ñmwg–™ù´ôÜw¬?¨Îܾ«I`2cÎñb9q^£ªIcwÕÏOXp%•¡#|c_‰Ϙ‚_¸öÅs©6¥:y*N‡PHáý—r»¨V­žŒj4 9€ã{æú*îímÅêÇâ†HôDéd$(*ø#s¹ç}ÍIvIdÛD>•1P6tó:[Ós¯ªË ´òÜD'HÌvKâDÊ#fsåÀ;ê Xç´4åþëp,¢÷< 6‚Nœ¿‚º?x¸>5ÃÝo+¢Ë0 á¸*,1°Hí¶*Œ­³Ct˜ž¼V¼ï‚òíH“ha‚£ä·®=¨j×ú$9¤ÛïhöZmÝî®fd…aiHcŒ K¾¬o¿ùëU¸4fì&£‰'ní׫–ðßÇ»4\?{Ì•åñ”ß"•Ãt'/9uÄd‹$ à\q[‡.C³0–.§J»U’ÌK,’:³åU]8^~•šµ2C Fžë£ƒ®™™Ä‘6Ô>¾ è=ÆÖn•u;Ë$— )`¯!Èe“Ä»3µq+Ô{j5 @ÖvW­ÃQ¦êNy$»@7;QmÕ.{KŸ ¦¸{y`ðâ]:Š>¯Üòpï·ÍN«ÈsbA¿w5]Ò©-|DFvú+œ.÷§‹_ ï%‰Â<)(;’y7Èß#ñWšôêæ˜ñ+õºÆ0•pá™g”o7µän7ÑWמþç´¾"kµŒ´WM IðQ˜ã#'8;ƒ÷§‡Ù/e„ÜM»ÀêT1½½X£PËâ΂ p'‡-A„tþ«êqÅ,²•XË—`ÌFAmó¹'ØmïEJ³.Ûñæž;pǰ›øñ¹6‹ Yz[‹K4¸D¹&êÔ‚G®äV½å²Û®ÓéRö”‹ZÅ~·pÌ–†žJû®­€¬ÒCäñŠ•i€9Ò4œï銃0îþë·¹•}l{5dÛNçžð ^Ot,Fí¾ò—·és’Jøž`\“ø±ßÐzb®ìÆ^ͦ>ܾë'êœW{3O<ãÐp„îzÍÜÖòÛÎ *r1²{“½ûŠLÃ1®ju~%Yìu'ï×|úq Ÿi£Ç_錓«ã¶8>•{æ,°ÒÊ\3iׯªß¨:83–b·öªÝDòÙ]Kæ™xÍïÊü—±èj-EûSIc}q˜ £ ßo7#8ïùb¹Xœ û^Ò–üt>KÒà>3Dáû*Û çªìÛŽ-Øž£‚J­Òèm‰çÐn¹=G¨•›îö©®áÎá?=Íi¥FFwh°âq™]ÙRãךór‚²2– ƒÈÜŠè"WÍÊa8¤xåñ#bŽ7vÅ ˆ)‡¹®ÌÓv,úƒ_¬®ˆ ‘¦U:ïœü{vµd©DRšŒòã+©CìFZtã¡¿—.kú«k‹cn°O ÊÒ~ žm,¨é>f<œí‚®k˜üÙšb6ûô]öU¦Z)¸LîLãæ=üV™:ÌÝ"Òã¦Å21¼õÊ “”Çc¾xbsÞ±‡Ü*‘ûxnu€¬©Œv§ûï}†„‰¼÷ð$¬VmúÊtç‚b¼XÜ ’àX§«6FFÇzº§Ã(æqË<-u’—Ç1b‘e6‡AÔÞÜ̉ï^®uÇê÷1Ét>…Ù`ŒD<€w-õ8Þ·að¢ƒHdø™Ÿ²ãc¾"qo¨Ž#ÜŸiÙ!×dŽ ågÒ “¾¶FŒàzgÛ~Lwuù@ø©cHh’w&M´ëHÙví¾×©‰þ÷Ò­h£ÀÆ< äjÛž6ã×#þddyñ¿Au)|zZ{ZCÂG”ïè½G›§Þ¾¸Öhì˜9w•6’ã*{}·Ç|5ÛVŒf¶›øj»8Z´+üÍÛÜ‹æ-Ýê¼Ç\ëœGncY¼¡A`=Fç±ßº8|5¥Ú•ÄÇ|B–žƒÂñëÄw¯=sÕîÈP%*äe°+s0ìà¸õ1õÈ4º•Ûd¼ÌÙÁÁ•LP¦4 “Œ¬MܽLêðØôpe'Æ21 »x€¿¶?—Ò±Vú¥[iì»L{0øiò6;ÓzâܼpøË œ`œŒžçŸMñWš]ŸÏ q'{"Cs[†ûñôZ>ûr¶Ò[I$×]20Â?´k€)# í’qÎ*“ ƒÀ‡ž÷VvõZÓLË© ‰7׆±¬.E¥Ô¶n%¶–HfàI•#¿mëSé¶¥œ$.mï£óS$FbËíGR‚&I&yNuÆN‡ÿvÃ8ÆvïœÖZ˜N2qî]ÄS8ÏG]ëÓZñ‹IPÑ?#øóÁØÏÏÁÌæk¼×n—þ§de{‡]%èÛíÇOl3ܱ=¾ ƒý2¨°ö•Øÿ\úòŒ{¯˜GÕÇÔ*"¸fäl$¿é^€áìÎ!xÆãþj²lé>7Ðoã×>;í2´Š%`ßµS‡Üv=½3èkA¥"6à±7ZìÂÆ÷Þýy,ƒsÎZ³)A2敉@˜U–gl³yÜÓ€7¹R]: $†ÛÒ2”HiBž})$ºÑuPÊb›VƒûÀ¾1–1ïžs¾õ•Øx2޾˨Ìx#+ôðáñfæWF‚K‰bk»V†eP'.ü@q}Ígqphpi‘6êËu1Mîs ÚC€½…ýÀã+Z’,Œo0äjŽiIÉI¾¥V|å+Sc²Êçk±#N7Þä ‹Ô.âûÜ+¯‡ *0˶pÃ<œùbµÒ¦ì¤Jäâ±,ZÖèÑGxçü)XÝÉuñ=³\M!_Û½ñóÞ•Ja„8K ‰uf¹…™‰ßÂ6èî¹]B !¹ý£‰Yüá×÷ÿ1ŠÓIáͰˆX14œÇüÆfó×R³nN >•b óLñÀ½™I«jŠ Ó˜WOu-Ìþ-Ì#ã¶ý¶ô¨6›XÜ­­©]õ]ž¡’ª%¥uU$…PMJÀIU˜À]kGÓšã T^u`ïñ“ùf³=}DT3VÇ'<üTöU‘¼ª°IØŸjr¢.­3E¨ƒiÔûTsTƒNYZ¤éwPBÒÍ2®¡•Îã8â«Øã•§U¥ø*ÔÚ^ñaªŒW ÷3i%u,È÷ì?70fÎvPmSÙš-Б×%>¡Vå¹i-\€’:ifÀÇlg#éQ¤ç;÷jñÛLÿJí: Û_ öQµ†_8‹ÃwÙvqý=jOp´è¡J“ää‚m¿~‹eX«8 ö«EĬä`­)Ô.##¨0¡‘[9ÆãÔš¨Ña3 ö⪵¡ Øqû„àu…#g0Ê’}ñõâ‡â@(c…8/lÏÝBHÖK‘.¤¶û®œJaÄ6\sŸ :ø(ºD¨À12¶9ö¦ ‰ä¢C@#uF§¾qƒÏÅH¡”Ìn«ÆôÒE4 P… v¤’aNȤ„×H?´Î’6+¿ÅvRMÒÀäcéMFêØ8ŸT°‰F”±=‰¨8”žÖº\Ù[í¥h`†é-‣cÄ,rÀŒ‚wö#Þ¨{C‰a3+m'º›[Y¬7“qÝõÖÞ¥k G%´R¬ÌuZ7áÒ=øÛš¦•GCC³F›ØM¦žé:G#x¶·\KÛf¶ìÁ òêÙˆìqï[i¿8\šôM'FÛwqñTÇëSTæPÐB« qŠI‹h¬l*¨r$©æºÁ 2¤åF=NæŽIiH1§ #4!<ö¡(Hž(RSWN[FsŒíŸ_šD ”ó"l®·Ó lXkêeã àÔ&ÃU} Ñó8|»ñú²ŽäJ¾+ /Ÿ@$o§Ìxo_z¥Ä² ëÊ}•ôØÊ²2€Eõ6¹Øx÷«íÔÝ_$¨‘B1 Š;…”êØ'#=ª9™æN“{ w«é´Õ¬)Ò,`8BnxŽZ.}Õ¥ËÝJd¶‘e-’¡ã>ÃøUì¨ÀÑËZ‹Ì´ƒÝòú+näaÓÉ/#€L4ŠªÒvÈíïQcGi éåuuW‘F.N§Pˆâ²ðB@œj_(9??çlfYÉ¢¡vÛ>§2aWa,J¯¶ãS‚18>™Ïñþ50k*¹šuºVêóÌä0ñ’}ý~”ÜCG$šQÜÊÜáG˜¶š® ²¥¹“J#JìØäj'õ80I²µŒ}S ¹*»ÕŠ¥`öz² Î1ÜÔfð¤"B°ÀñFL‹œ©È=þ¢£œe#MÍà›Û´Q«Ì€W+ŒƒÁ <8ÀC©9€‚'E[‘m¥Ævn?Jbê1u^3Œ“Ú¥)k`¤Y€ÒÃIä`æTÌÆR–¯Zj0µ%íÊ0h¥*téòñŽqUL:…{qUXdÙo‡©™áhº-ÛÄM˜ÙìF;U.¡”楪ÛOÚ7&&ãˆ×òËþŸ0´škcÑ( â/×€Çp1Û~*ªU›˜5ÒZ±7Šn}2ã©·=Guךr04¶vÉÛJèk„@(É4"RïM4 èIMq«Œ·c4Š/²è´kgq&%@<¥Bäì?Žÿæj‚^Yl ¢êeÓq¶œ¿=°ønQ¤Ç”ŸlñWf i •lW¨h¢,¹Ò@Éô¨º«bU´ðõ*‰`•\ðÉ…%\08;çzmpp ún¦ì®ÕWÛz’­N^Ê ði9¡Êlyi›ÊXù@QÆô÷4ƒSsÉÒÊVæ0Ù‘˜.¡²ö÷8”©åþâ»rÁqxš’pÉŸLë¨3wà ޱ‡2™‚9Gâau_J­q!ÖÖN羞Qª²n‹%³±{HEë414Ç%‡uÜëï±ÅE¸ñgÜÇ¿cþêd—0f ÀÇ ™î·ŠâÜ4²¸) ÀÛ€;ûVÆü Ȩ{G~8u æ­T©ªSgÛ¦ðˆOV€8÷¢H”Äd`nsžôn¥;(†#N7¢¬F¬F 2ö§L¤°-å:‡¨ôÚ«x§MÙO%ÐéÓÆ¯#^Ip„K Ãä’v äñ¹ÀÍQU†Ør[pÕZ 1$Úä^{Áås`q$7.#7_öãnƯæÞë³Sy‹Ál°c(dI⌕# ƒ,;‚jªƒ-È•« /­p7ø¬—ò.O˜°œŒgÛb­¦ØjÏ]ÙœoíéTìEMgBŒÔƒ!OÅ!Ðä˜!_qžûRËe,æÜ”ÕpâHð¸aÎá}?:DÚ “AœÍµÔÕ`m~#29åÊaðj$¸h¬ c§<Ïu¹x¢Þîâºä%|¦3†'ñýê¦àC˜a]J³ +4žíyO^jþ™Ô ­ÙðÅЇF«¹ç`G|ïñ±UÖ£·‰Wá1FS”;.Ñõë{BçÑœRj§ûJ·ý6ëÃÔ-äÀÙ‹`}9¨ö옕gèêÆhS¶éw³H±¤XgÆ‘«ñzqIõé´I)³Uä4 VËÞžý7]´ƒUÛ.X²¤c̱“ÉØñÆõS¬+|ãöõªÕ[ì+K5vöôÄßyÓŸ<Ú·Ý<\Æ?F NÄUý Í•aìÙö†ÝûÏJ#„,?qœdTÉ ˆ1šÒLϤ«é 0º6ÓÚ ±ÕžH3Á)¼&ÔËß‚¬y÷Í Ì7Mîi˜ 0#ò«(?íÎÇ}¨M2¥UY†ÍÁ¢e2ÛJœ xÑä)RÀÇüÔ]¡E8.ºv³½¥ÙGñTŒ™cʘ'qƒÆ9Û¹¬ïh{dx.*Ž£S)žcaݶâ‚g7ësi Œ!!J³ø…; ›™QòäÈó¯‡á2^jö´š~]¦c‡Ýk,÷wbàÌì ní¬èü:†w>ç'}ªÆSÉ]g«ˆí‹œlMí¤ýÏ‚Î` 1‡b3¨éãçúÔóAº§$¶[~*©dW¿”b¤ ÎʼüÔ’G¥J„+fP!W YA v>•¸B›Úen²Ðm’I4êGÒ¬Ü(÷Ç5MIÍi¥¨=}Tn¤Ži®n|r$acÆ¿~vØSc\ÐÞê5žÊ}L×›[_²£[0rÒ39ßšœ|ÅÒIºP©}·ÕœmÉÍ7QkKŒ_ ®pqÎhÍxAi Ͳ­Iß5$•€ àÜIh­ŽÜÏ*-²³»x|Ÿ¥@¿(—+YOµ!´ÅÎËÚô«8ºl!dtIä ¹ˆerz2xÛ&¹ª¦Ú+Õah7 ÐaÇXÒG§•¤«$¸‘Õ¼?FÌBâ"I;sŽ}vãÚ`û©º£ˆ1§wR±¬¯ÊÅ—!‚’<Ùä㟧é½ZZ ²ÎZ.?žp”÷¬Ü 2*SQÂíÝx>ÃëíCi6EJæK¢ñ§ãN§’¥o̦$C.‘–ñ2õ;sŸ¥O²‹C˜ÃEûýùú,ÓH!Ô¬ä’@Ç9 oÛŸ]ö©µ¶T¹ÐEï×—Ô¡†K¹’Þ?Ú°Î!Ƶ`{ý)9Á€¸Ûš“)º³…1~ZG>»—©³µ¶é¨…Á™å ²òù #Ø û×9õTÚÑ>Ú®å*4ðÂ÷&ÊœfJ µûŸiºòjÒîÚUµ»ÃKœ¤Š0³lÿpÏ—¿OQŽÙ§·áyìv«GëïùsËÓã—H¾–Øããô«j–èå Ê’\Á1 OQñ'ÚKTV]ÃÒÊ=1éýjªP×@rÕ‰/¨Â_Ló¹`BÉ Éç\àîF*óÙsÄ´E®«£!kæÆìF3Rh;¡Å° w¨0ýšœpNôƪ\gHCÜ Ðy DÝ0á$ ¡Jçðž>´Dˆ”Á¼Âê–°6åb”*M—1È„¼Nr7>žùÅfй¤<ˆ]ì9a tlA{ƣ˘0°}îDÒr†0\e”Ž*îÌWpƒ®žŠÛS¤4ÊKà–=Ënv•Eù…š§K³uÞ?•¿ÄfŒFc·rY3¥Tm€NÛçlUDÌ•·9-Ê@<´z^l¹ýT “ÉQ€Ê¹' o“Å_FbæV¦®Ö7FÊ$»Ÿši!U²‚F3I8•®ÃªµŒn‘Û[¹cæw±™ì>*ª˜~ÐÉq[pؿӴ†´ÜëÝܵIöŽg k`ÆËÛü5XÁ´qZñ7í £ö‚蜘mÎÁNTð;g; —éĨˆÔ›×Šë—lEl¤ŒeS÷óOô¬âT_S`<”?ÕîÃC’1€ãã5/Ó3B£úÚ“"‚¬õKÀD€1²ó4ûpQý]X‰QNì6¡(œ„Qü©ö Ò=Ð1UA}÷G´èm<ò–½¸·{‡,œ«ùî®6 ÕÊÑò‚Ô¯Mƒq¥‡/qùÜÒO°B|Up;N-ƒZÉ’I‹XZ/,rüç9¥Ú8•.ÅŽl€VK»s¨}Þ9>ï¤àüU¬ùªŸJ.ÀHâªŽÒæL˜à•€ä…©Œ”›Eïý­'ÁOý6÷lÛÈ>˜¨öÔø©þ–¯ø•|}©Iø-‡;qP8ªCW+GÃñ.Ñ…]ÙÞ£”i¢Xa.¨d,œ°À9<ÔN2–2Uøe{ˆÛsj¤~Íu-M¢è3¥õ|m÷¥úÚ[”ϱ2r¶G*ì÷PYDo '2¯õ§úÊDH>…@ü7Ó”¶ýãî»6?go¬¬.±*ÏpºΣD{žþfÀÇ·Íe©Œ§Qàƒaêtiü6½*NiuņÞfк×k(ŽäB¡ec¸åIcŸÔVV$ŽeШ2‡‚|Œ™õ\Ȧ˜-²Šð°ÏíTàk'±;â´·æ*‡@:k÷QsÆØd:`9AÅ–µºâ£( UØí¸ÓŒSlî“Ã,Z}z&’`þ,÷ø§eFDD$Åço¦ÔÀ!D p暊@ûgëBjE”“­P{’ò`äüÑt9È!Gojhºì¥Ö5fl ØœüVCQšOªé³ Z')·û*ki|¤²ÛJKcb ÉïÏûTMJfÅÊc‰mà ûÔÓïGݧÆFÛðO~Ùý)öÔø…Ñâö_ãè…é—Ã8±›¸®ÔûzäÄþ2­=2ûRˆí˜ö;PíéîU‡‰‘•¿Et].†hØüŒÔ]›+Ù­‹ñüJÔ½7ÃNu61¦5*3òr¯lUgEš¯ k¯Rýß™+\} Ý€0SyÆäþxªÎ)åhoÃ(´ÀuÌŸerôèõhÞ@w,Ê@Ï®=µ@Ö:Ê´aY0D«à°‹ñ˜â9ÕO·& ê§IõV³Í`OrÔ¶ñä IãȤ“íŽßYyÙ^Ý]ì‹ "œ@2HË”‘ïýª%Äî¥íñ…T½FÝÿîÒM'qjÆvÇ—“ëR\G펹ªÝŠ`?¾c…ý½W6þv¸²š{@Ÿû@]¼]Ûðä±Çá!G$™¥_M¡® ÷pêü|JõQ…ôãä½õÒg•¬7—NËõYîcšAe« ºÊª<Ùn2ïŒUƃX@ÍéÃÁgÇÔvOÏ>=ð§oì2ÌŸéÀæpÒ\F§uÒ‘œï«ê.u7sîv=êTÙ]Ž-öîhÔDóßšÑЧ¼¾¸»{½fhäkv-6Jé$én3žûõ¨bÊmhf†úz«°O«YïuMAokÀã~v^m¤P!–¸EÉöˆ¼iô+§‘Âóä*äIÔ3ª3ö'Æ> ê@´ÛèGÝAÙÄ»_} (HÊOíÌh§°Ç·Î“½0öûŸª‰ þý;‡¬( ³l¨h݇ÔÛLö‚éIÖߟð²ut€tù°,›`Å )Î{eF;÷«(—gÇ3ùTbšÎÉÖmôµ”¬¬ ê=vÂÒòÞ)Ĉž+¢ølWÀB¥Áä“Í'Õu*.{ DÆÿÜx§KÊø†R¨ÐgS¡ý­ÜAÕpº—Iµ[gxd™eñ:«kP;s¶rv>Õ²–!åÐà<:!s1_¢KIo|€:ÛEΓ¥‹r‚t’PÈ$Í´Êp ÇáeŸsÍh‚ë¶ÝãìV'|=”à<i±˜Ð„ÖÓ¥œ£ÜÜÂùÁI”FséøqŸ­#V¶ Ýªcƒ?)sàmôU¥:]ÖIXjΡŽ*ÄTÒíø~÷}>É·O´Â“,ØÆëÁúRŸÀ&pT,K§ÙW-‡OŒvœî1眜zT…Z¦ÂoÂaZ38Ÿ? )aÓX pÛéäÿ/zfµa¬$Ü&è ë¹_÷ )[Â(ÎñgH ƒ¤±Æ}ps¿¡Ú£oÅ]ú\;þB$Ž{Ióïæ:=±ü67M¶vÕGê_þAáôN”Ü|ÕRÙF–Aåé2ýá•u<ž(œdÆ=JªK >Þ ·a˜Úrê'1‰'4Iëè³Ü[ÚÅáýóiŠ €GaÁô¦×<ÎM5)ÑdvÚÇ.áèmÍÁY}ØƇ3¶Smûo¿¯jÆm3äYÆ©¾†M½8úm+(Šü& ݾ¢p 9ôÎÛsü…[š”þÒ³dÄâ{ÏÛ ®Ü7ặ8Øäà÷íP–Џ6©ÑãÌëä”Âöd’9ìN€Ò~Ò6m€ÈŒ}M 4Ü@ ù¤ñ].m¤ètñ¹ ö·©ÁŠÈ‚1ÿÀÖ£ðú\Ošç­Wˆä¦>×^ƒ‘i`ÈWÿ*_éÔÿÈú}”‡Æëío‘û©¿Û—k+Lû4€CáÌÜ}Æêv_º_ú¾}*¢ÊØÀØÏ®(ÿOoù># õû¤ßkîÈlZZ‚vÉi=‡š˜øs?Èú}’?«hõûªÏÚËÓŵ˜‘‰7ÿò§ú |O§ÙDüf·ø_ºôŸf¤¹ë62Þ\OiøEiÉÀÀ›ŸSž6¬¦³ñM¢fýue×ø{êc)šÏpáÂ:“*é÷éšæQÊH®²‚1°`FݱKµk N¬¤0Õ*:ácgnQ¡l‹›íú‰µ»™Çw†@˜RVF]IÏô¡• ÙƒRG˜™EJ^ΩÓµœDEµû$–÷0}“ê‹!‡EÄ_Ê¥ð •Qƒó±ìv¦^ÇbÒ×QmŒÁUÍá37´:ãe`—=>Ý¡2Hô ây:X1¾GÍ:õKAãÏéä–*RilØEˆò2gy]Ué¦3›²t*¦™%\`«¹ßÖ³Ó#/¾þ pÃâý _.Þ*= H/ç¸} 5ôÒ ¨7›7Ø~_Æž 8–µ»4`mG¼Ä½ÇI›õÉbë²Ü'Wsmf²Z ÞÔ8 YCd•>­ßøUØv´Òùö˜ã¬ØÇÔƒ‘’Û_,êDíÞºl¶êú—ý?;`Ç„úþµœy[H`6Ëáo¢’]*Ï9–ê] €‹)Ð@Ë d wàzöE’6ýD&*ÙÖœf/ø\þ³%³ËkâÏoª1¨/ˆ˜,ïÇuÓòºÆü»–lSª {$‹s7êËMôvRÚÍ}íKl‡nì;ço­B™¨a[Y´žÇ0MþêΓfö½FÞöÖâIŒjRHÂãJËäl3‚3¾*5ª°Óp‰ûÊ–§TUc‰‹A¼íÃudÝ1YTÈÓ¬‰’ Gœ±o€ÃQ£HóS~’drþzÕs:³C/NYž'›Àe‘ ²½°FwÛ´RxpyàOWXëÒ-u0á ˜¿9<;Çu–‰úb kƒ<Â/•P‰Tœäï…ÁpA¨6¹Ì2‰ôû«_…ùÑê8ÿ³Áy™z\mqu-º´Vð¾j ?áF' q«ŽÃÔ×AµÈkZë“å©ãܸÏÁ·;žÛ4xÐO8q*}:Ê9SÄU ›¢£êËz³¶Nû ‡ÍF­RÓe,6€µÀ|Iùh;Ó’ÚÎ+Ö·’Þ0áÁe“mM€7÷ç8 >£™˜dÝBƒ*n`ÐîÜéõüª¤u[ÖX„*"‡Æ£l– §“ŒcœãµH['sø¨=Íh¡Öc~¬²Í:-µÔˆ!•u…]°{bv÷«Ó™ Ûø+;ÞÐǸDðµˆÙ_ ÖZZÚ&bÒ¡q²’8#œcõ¨Ô™ž Ö¾€d]¸xpX‹[ hs e¾èÃ[cþ"¦OÏ#t?1¾þ’³“K(·ö›óø…ºÜ$ñkð! ³c\a¶ÔO:NÛÕ.–˜ŸXú­4Ãj76Q¾Ó¹äWX^LÀçÄ,9RÀ=q¶+/fкB»Ï]ɉ¥.šFr­ 2!Ûqþ½[ŽÑò&o¹õÅ? x–ᢲªŒqåÆ}¨£3]óAcÙ˜·—Ú;ÿ =E®?Ó/Oˆ k yHßI]»~¿ÎŠA½£mºX‡?±}íÊ:þWÏGÜ^A=é¡?7¡¥dBCW¡¢ÈAÏ|¥„P…ëþÏL¿úm-ßîÿµêP•gP4Ã!¡x é\¼KOn\&Í=¸/C€¨S1w·Â÷žÿ¡]›ÛØí¾ÑßÊ¥í –G90¨¡IײòݳŒmYiÒ/ Ñ©¹âgMVú•Å«:_ý¢Œ/QƒÂkPG¿Š4*%-‚ȸÿ´däƒÀ«h´Ó ~C3þ$íÀŸ]6Tb_Ûâ€íe¹/hºbZ=5ßE£ªZC/Jº–á¹ 1,²Ýüi[ ÿPv¨R¨áQ­q"ãR¿/ÜJ·IŽ¢÷°XÜ5ÎÛüœ`wܲý–½T·¹dkMДºŠG äÓ 8çb¬ÅÒ—gÀŽ<Õ ®Ç‹88ÿnÙdú.ä}j(¥ ¯¡î¢yÀ~âÏñ¬g ç ä?î]&ãØÓ?Óówý‹Ñ.+mq}†3‹KE›V¢KwÈ;ãßn"›épx’?Ÿ%ÌÁWªêPÂáâÐíd’f"úAÛA¿nþ«"}ç¨8}N¯ŸÛ*ÆêTI˜óŸûWI˜œK@ãÿõ_?õ ²Ê'·ˆ©Ø´!”‘îD‡‚(ìYý§þ¿ÀOõOîg2=‰Ñrº|ùë%®U‘î–?5edÒ8>]>çê+MVÿH@ÚcÇÖV?®â]bà$Nâ<#¢½ÔZ°lXÉ.ãyüêöà^?º;–Wüb‘Ò™=ê”ûOº€ \êQ¹#ÛÆ?ÌTŽb«oƈ%°·-#­²u Ô3{c¦XÜ!<rG$n­DQ@:)»þЗ­±á~ÿåb–ñäéÒÅpÓ %C"øeÊI°@ ývö5p¦Ûµ¶²œAu"ד&ûÁžR7ðäWþɆÙÜcjÙÚ7Šævnà’ÚÎͤDÙø Ôhݓ̀HÛM…>a·^iço²:Æ5Q’'ŒùԯȠ8--±OAÒ4¶Xç*â‰DpPÃd~,ž6§d—¡é·J"Ùs Áuâ“ÎFœŽä±¤7|톫 ¨H":êñ¶ý\=vŠ-Ñ•Óénø<4æ×¼ö-},<0k–W‰ŒRG𠛜¸'|’s´jd €&âç}¾±°W9ô Ë‹€’bÆÃm ¼‰Ü“*Û{«t¼–[«¹ï×ÅÊ¡;‚?Ô\Ç€Ö†ø}Š“+1µ žòéÿhv•ƒ¨OÓÈm­gñ$Ê™&ºŽl ø6ö9ªúL­lÄ@àú¬µêáÀ9dî\ÿùú®¯ÙM-Ó}ÍçD”wR7,>˜=·¬¸ÉqoÍ5¿Ñt> †Lc—Ô˜ˆå.%z^¥n¶÷,dG ¤J­ƒ}‡—е7ôôFÍÜ|¥¾ò­KË'ðó}f ¯á7O•Ûƒ…æ¢iÔòŸ!÷V Ô8¿ûGèóBeoµ´,’D×Õ¿ ƒu:òtƒê¯§Šããþ$ʸRû¤Z8¯.ëÏ%²ûíQ~©à«ZxQÈÚÕ$ÒÅ{'#|ûLUtð”…<דÔî´VÇ×5²Z3{ÆÃm½|–{¾¬½>Öx­ìîR+Ù ®“Ú’)ɰªv`úó6aÍWç m¬||¯ÐUTÆ -c3vø2l  G5ǹ¹kª#n˜-Vgb É:ŒÈÜ'Ð qµjcJr1Ã/R¹õ*ö5òšyds 7Ôˆ<…Ïê}F)º§Œ&;ÉÎRi~ï,xÁôï€jêT\Úp_”l$§ÕfÄâZú¹›K9ÜÆœ!Ü9J²´O}Ôín/íÚá›:T`•*†ãlûç|Rn S¦æÓ2þŸñCZ³Y°à}ƒçâ´[ߨy§1k: DX‘ÁÈ\±Áç=ª·R©f·ë÷²¶ž&€ωáòø\ =ò§qöˆ ¥ŠÝJÆF”pëlgÛ~{þ´›ƒ°.SÅ%¬ØÚæ:ïõ\KÞ£o®q1 0  $ëmÎçþZ×N‹ f;úè®elM9wf°Ôjxkãà³ÅsâF­÷;Gla˜Z#d¹#â¬u8?¸ù•K1.-Ðán‘–Ô“kÁÉßúƒßûU …­Í&dZ!ék4Z–ó2`†¶äyÎø5W-?¶ÊÊx öÈ}÷ë~GÑAz\Ò…FŒ‘’ØövÍv‹é) Ü2‘1ÕÓ`«»±›§Çã\G(‰ŸIÃðH;6þÔ™UµNV›ªêá߆nz€ÁçǯUŠ.žåã;ÈçPm¹Ücj´ÖµŠÌÌ-î,x›Ï§²Ðae(Z4w^ë¿|T3¡WvnH’:Õ^# à9Ã.y'ŒqéÏÖ«‘*ü®Ë ßn£ÍTË#°ýŒ€)È.€•ø©‚ÕTà÷ÚmÄ\w"Hp¥â·/åeQ¤}AÎÜmšAÛ‡Ò´µ‚öá÷÷QŽ%$™`lîpÌG¦{áL»I´Áýìó>h¯’ÂÎdpö Hv$9Ï®;æ +=¤C¬®v‹ÁxÏÑs‡IU™0Àoóâ´~£e‡ô&*ûk7ŽD‘"RTçxôïëƒü¾j¨‚}U´ðïkƒ€ôŽº"û‚8mQBC.TŒ‚¾ÃcõÆô»b7Oô Ì~ùèøÂÐ^ïÊ&ª¹É1FOcå;q¿sµB°ó*âêÖÌbxM4ï6Ù)ÒwD28`IÈxó¾ÄÜ÷ߌPÒÐl“ÛP€\|ÇwSÁ&…À2!ÓøæÜžàñí·4C©9ÆçM9÷óôà"šLê[mˆòÛç¶sý©æhÒP)Ô~ [n‡VZ züGŸÃV}‹/—'ïUæˆ Wy¥Õ ૊ØðÌÞRFêH#üù©9÷˜Pes[Ë®®­’'³I(Ò‹’]s¶vÎyÆß•D8L¬u7A.u‡쮦ƒgy¤û…”÷ÆûR©M³óµ:Ÿ—úO÷÷«åŠ[œ™]ä ÞA«­D83A ×Su_ÜfxßÝZe»‰ æ\°ãÓÓøT!Ž1X]U‚s»–F‚Y+EŽN¬Ïz·8BÎi9Æ%cÂey$˜Å,­‚ÎäxÜúñü*!Ù@ °Su,ä¹ðNä¯B¬y¡±²…ÿš”™¼¨ehÒ/ÝÖê™ooÓÄKv—Ã\Ÿöõ1J™‚í{•/Äâ-§1¯Ó¯%’RªgGgnÌrAÆÛ“óL4OÊ‘{à‹ž·ëÅ1dÙ¢®øÈÜb–cÅ>Éœ¸GjæÝÑ+3`)ÿ?Zß0N¦f°öd:÷Q†éæ&+Ïœ2°m³ø¾§|œSsnÉQebó’¬qÛÏÇ€ï…JDéxÄhX `³íÀäûêEÀ·š¨1Í«hË;÷uÑV´kH ÆÙÛøTCÝ´«J™ýÀ.±|xrÉ€vRGo_Š£µ€¶Œ9#+ŠåÄ ÍÊË"+G°'8lmŽv'ß$Ö‡ᘅÏ`u7dâG‘Û©žK43è¸Kû&‹ ÈV!¹ô''m¹ôÞ¬seº_øT2¦WØÛ—–ÿÅ×nÎYþ÷*Û7›q"•PxÈý}±Y*5¹ArêÑ©S´"ŸŒØu¡î…R²ZI‚§Ìê£ Ç©'?B•Ba¥]ˆÃ´á×õY#¶$Mjtƒ°ßnü¸üêÂü›¬í¤*êÓ#®å(¢Y LX቎Ø|Rsœn›)Ó O‡áh»°KU."!ÌÇÄÀB{`=ê ª_i¿r¾®´„cÏOª¯îލà(:ÓÅ-§}{Ô»@L8Ÿ%_bà%€7=sKîÓºÆnpP¶;’IÈþôghœ·GeQÑÚÑÝ6]im‡¯Ã][ Ó±¾ª¢“°,±¨‘€Èm'9ã¸ãÞ§-%W–©íϧq·Äúðá‚êPÃmÏÓúÔ3Ú—ÏšóáÏÉJh¢sæ ©ÉãP'è3I®pÒêU)Ó:ؼ•&x×SÕa¹m’w9üéMŠ‘-35ú]W,ðx>Y|E#y¶9þ{Ôƒ2 ú´òdÏ×ÕAä‡Ï£RŸÂÇŒsúÅ0×n çÓ¾[uìV{¸Q°Dc-€8íCýjÆ8®¨­M§Co§.k+Ù.tG*1xß8Û?¨«]ÈYÎNV»~´àº ᙞCM@2ï€79ùííTfkŒn¶Šu)²I9c…íùæ¢Y]T¬BM·'×ÒœF¦Ì •é#†FB‘MD+¥—žAî>E`.$.ÓXâÒl#Þ «Û{+¹$ŽD•_\ˆt”m¶®ÿ5*o¨À*ºÔ¨Öqk…ï$m×õ>ŸdÞpc]*øÒJär{ÿ,šo«Rñº-‰ôáçü­öV°-üW0#¨Ç™C,8Øû {çæ©¨÷9k£I‚ ªÀGœZcíâ‹;vR€M’,¸ò±ãô;P÷ƒ²)S"/è²YÎ×.bBê JÙ,8Óôg$Õ•3E†©-#¿ÛÃÌ®_é—S[`œE×B—gWäsݯcíáßÊ6ÝÚÝX›aÓ‹Ë©™4·œ*‚ í¾0s¸øª˜öTžÒËMZUhe$ê8Ø}†—ö[,:¿Þɘ)ñS:v ;ƒÆFõUL>\Ç_ÂÑCÚ¼ñ‹@ïž"ëZ²…ºdWÌÈñ4lt]Á vÜ~»{ÛB«»B×o+>7Ã@Te²ÁîÐuÉrºS¼iã†m* ?„?Àåvö­5(S¸é×å`Ãã+—¶drÐý´\n¨&‚h%ååS)*ºH:Îß; ×G+AoEÏÄ5ìs^MÍôÏÙtºUÜ–6o$ÈŽexõ'™‰#ùý­g­LT| ÅÖÌ%wP¦\v ‹\Σëàx®·Dº,Ú;‘$‘˜Œiu÷ÆO°úVjìit¶Æ~‹~ µFÓËRH‰ƒÂcóÈx%svöF`¨ËಠÈåAóg#zzÐÚb¤IÖ«]Ô  FX}£NVˆ·¿C5ž…hÊ©@œƒƒœzî>™ªšHå~ëKÝO3ÒÚ-¾¾J7(‹•†U‘#“ ºïóß#øqSÌæÔAä©ÊÊ   Åÿ?M[ÛC²k“`ij:“ßßÿ5e:’Ez¤’|Áëê©77?« #ðQ†‘«VøßõüÇ­O#jÓ¹½Õn«S_å1´Î×õôâ´‰äžßLŠ¡‘œù¼¾L>Ü b«ÊéÕ⫞ÈpÒy[n^ 7†˜F˜:à “€Ï¹÷ÅN`ÙQ“0$ˆßyëp|³–!”ø„‚7Ç‚ ¤ûÔYPO­Êçð&ù¿ö¦ ˆ %­Ìï^z ˆ¤I?deìpûò?N}¾*n^LxwÉ>u൭¥ÄP–B’¿† L†ç‚6õÛõªÍF¸Þ×WŠÙmÌi®ºE¼š×$׆XæŠ ìm-Ë3Ü7ÿ3Pk ´žºÑhuJÅÁílÛÔžýNk«aq/‹N¸ Ù8WNrsŒï¿?Z±È2—…MZ"«³¶‘¿_5ô,W€¾Å˜£@D”ñDf(ÅÌQŠ!Š1DI@@O1@È@JJ7ÎÔ@D£z "QƒD"J7¢%9äÑŒZ "QŠ #1F %,Q9)ïŽM”n;∔`úÑ– (ÁS„奌 "RÆô@Fbž %-ý耉)`úÑ9(Þˆ”oDJ[úÑ耉)Q9(4@D•~)ªå¡$b„#!´(æ²îºéŒLmCÍ'‰'nÁ¡gý@›ÁQÔ­M¼ÛcKqŒ`{P¬£S8XñéB¹¡Å”b„JX¡ÓB%¡9H¨D Š)¡‚´')i¡–(D£íBr¯Å ¹F(D£%(Å”ñBŠ(Å”b„J1B%¡ŒP„b„J1µ”b„J4М£„¥S3ª²Ãâˆæ•N‚G}±šÚ ¢@Õz+l¶°j¸GðùöÕì(\ê¡åæ)¿U³Eb×ùWQ~ÙþF…†¨bç\OïOŠx•Ntêa&¼¶~ùÍ KêU =¡aÒhWÊX¡9F(D£"QŠ(Å”±BŠŒP„b„ÑŠ£Š(Å”±Br¯ÓB®SÓBÓ¶{P„À¡ÓBŸéB,§‚ï¨}ÒiGâ1ˆ 3ùóîÔ'UާO´u„ÅÖÉí–%aã'‹–’3±rG¨¡RÚ…ÇK  ¡S‚0y¡Y2–š4"Q§ò¡ÓB%¡ b„Ö>±y÷*àÈX"ëëôÅ ì=.ÕùvGFéæIØ3^0ÒYØ6ÜŒãnEÄWö®¤J>!Žþ=rG,c99#OÓœr}(YFÖ©[û¯?h,™.î#„ˆòÚË¡m ÉO—-’x·4.…NÔ°›í}O~½Ãr½ µÅ¬ö€”ÐdU c=»9ÈçŠ9ì¨×DéÇ­ýU.»Çœb~hSmÔtКEwíBr€¤œI; P‰P¿K‹~ž÷1Àp0ÌØÞ=ð(N‘cê×dF+¨kb Ê?w?ÄlwÁ¡EÁÔÜZõmBr–(D£&–=¨B1B%4"UlëG$Œ”*ç^à=@Îçæ…`gùú~x,÷½F6‰fÆHÖQ¥ÜoB²•U·c®®(YVk«ë[IsÌ¢f–%¤aì£sB±”jTÑn;y¬"ëÇt|ºHZ1ýÜd§òúЯìò‚5 'Nêú\Ä-gŽÉVgÜ$mÆyÆÿ4á][ #6`Iö^†7Y2¿…%Îp-0W;©^:Ú´–kð$R>¿Âx8Á÷8Ær:š4tTlGº· \ÏoÓ–o‚7˜kÒ… cãæ… U6¾¦X÷ï™æºsÝÉs{nЖËÃ'D˜Õ!†Òs³.ÛmM +i l!Ötí· äU—Kgx1¼ˆT1åCÎ3ØoñB3Qß1+67¡[(ÅN„%Š(Å•šúî |K™):TwcíB¶•'U9X«Dn®!’y5Ú('ÂCøÉÆùÏL Ì;»6–´C¸ñüGªìZXÜ(kv•ÿâ¡'Ævö8þ,U+0üàrîè¯9öŠi§‘£UÂGå@P`6Õ‘óL.ž­`ž=Bétðó£XÚ\£[@ŠÚƒ• äd£à®Ç#µ%–´0öµs>\G5ÚžÅì®U€ —ßS‚N¿éBÄÚ«cL£Ã’ì@Hf؉j‘’6äŒúб¿I,ðªNJ# c²²àg~ùÍ úO%·YúW…Ô^á"”+ÄØõÔ=~3B²¾j,W7­‹ŽvZìlãBIç×VF>Ô-Xl•Ù ÔuäµtKù­®î,£xdˆ8)“ŒŽ߸ú“ÛŠ8š {R;Ù[cÔú}½õòŽ˜ðÝÛEûO rp3õ´(ÕÃÖ{{Ik¹u¢ÛsW)÷›Y•†JƒóŠ s˜r<,Le£$þè`HúP®• Pœ Î„Õ7³¥¥œ÷2~±ŒŸaïB6 ®4]bÞöé^@égê#!]Ã`ìHÎm8[ô›î>†vñú¯Jÿ³²§-ÃËåVEØn¤ø9ÀßjK˜>gÿV ð÷óãeçþÒ[ž¡ÔÍÄW3ÆŽ‹…Ñ•~éÎã?®h]AFžG4Ö«4ÿiH¬Í´±+Þ0)(_FË“ê§éNŒø~Õ$Wùù¬¶îZÖþæmBòâUr§fU9!GqåÛàÐUÏl9Œoí£æ»½&)/bg„aË—@¬*wÀ'Ðöþ”– C›H×"yúgVºé÷ʧï&E#fä«mßcõÊÖç²½&Ö§µ¾ú­ øv]@¬Òư…!õ! “€7À;íÆÇphTêöHmÂÿIÛÔz}Õ­×Lkg|E2Å#aóä,39ǶûñBu©ÔeLãS¨å¼s]þŸj-­`µf“ÌH ±ãs¾H-°©àR\úÕ{Gš‚Ñæxp¶÷Rl‘sk¬&eñcT øN±²=ö9¡&š¤üæñoºÑtd&yónˆ³5HP°#~#}hY‡ÈߘۄÇ^ Q;«aué;•9ÏÇ­%yp–‘BrŒP„b„,÷—vöq.$ ¾Û“ð(VÓ¤ú†ŒëUºŒªPà@B)äŽäüà|T€]œ6Q¹+»Ó¢ðJJe2¦,¶ÌcVúßnô– ÎÍ-ˆÔýºæºÝ­GºÛ­’\\´a§Ò¨Ç` ÷íê(Y0˜B÷g/>k2zSÇh‘E¤i â Ü÷¡miËV^IðTÝI•¤V멦M DnÇlŸ“Á)±¦«ËɰÜð^†Úò8`†¤¶ŽOåË|qøAÛìù¡sŸIÎqtCˆ-áãü.Ó\M.‹}"TR >w>_VÆ3šjaíŸ%M´‘^Ú)"U½o+.h}Ôäq¶ù>ƒ4)½®¤ý²ý5õ༠³h‚ÞtíAâ I6$‰Á!·»œþdPºÝ¨wôêèt;·Šß%üfð³áHr¦C¨¹OnFGæ…œQáÒdxy¾º.EÿL{Hšhð-eID à©nØ#9¡m¥ˆSû†Ç^øSëQ&´YŒCO†ò,›:ç“ÜLgëL(áðů‹dÖ#C×¢ç¬\Ýô¯¸Ë4ndtãgP¤1| {zЫf”êö­Ý{-Ý ©ÏÔº‰V.I2K£Hq¥;±mÎÿJ|V”)È1ÀsÜÛM¿•Òê2dYtμ È<6a¶w¤³Q¥]âH·\=—³¼txá‚ú{ù#<¸@½Ê©ØñÞšêÔ¤.sAÒ×ñ+uçN—­XÇ®æ$O¶'¯$‘Æ;šZ,ôë· ó :u}-ºóýJįS–Á XBI—‘d¨Û8ãzk£F´ÒI™O+ÕÉÔ™„ ²E"1&D>€ŒØúüÒ\‘‡AtŽ«´· Ñ£F Ã#TÁNþÇz" |—Ï®º|Ïn¶r¼"ðJZUR0…·Ò¸úg¾”ס§]¡Ý ,[œnSû«[>»€EÒ Ä°‡aŒãæ„vâûNºX­¨­–4ºÌøÔé²3¸<ƒÌR*œE Î’ÛsÓø[ Êõ~¥iô‚+¨ÿàNÊ¥wý×ã9ÀÁ9Í ŽÌ᩹ÔÄ´ê>£_ásìfº€]tÛÉ"€4’A+; œ’}0AÇæšÑU”ß–»6uÞ?¦Å %Ü·-qàÂK«G# F\A8qškEg8–µ‘'«s]ûG¸NžV;„Ë`Æë«|j=ö8Èî3QX*’Dóû}–î—x|_î+Qv(f\ˆ•rNs¾øÀ=¸Å Šô­•„å÷ž¹/EôVqÛ›æ½Él:åž@ÉmÀö4.i¢ê¤öwËæ¬œÚHè|Sª—†Ûýv4(´TÚBÃ;°‘Ԉ瑙¢'SÚ6ÈÆÿJí@xýÔÒñ RT1‘Øý3I"ø9Hºàuή,Õà·ð¤“beÆt@;pºl/ióºÃ‚òwÓMu’fr|R¡öøôãëR]jLm3•¼ö-ŒSÀYÝœ¡m‡fçJ`×–;EÞè@O³‘­Ò8S-+F_|–Î}FãlgˆX1t2ÐI'iŽKÑÜ—gd.n"G’PX0bL¥·Ô¿;Ž).k;z¯ÈÓaézºÍÒ#†öæGhdPAIÔWßÊ0> ÌCI O^+_Pû/i}#<†E“ T œúÏŒsBªÄjR4à°‹Yì%q<úîñ•[<œžsB¿´e` E¸u¨þ>öÚe œã,@À;þ FêwÁóB—d-rçø]Ÿâ4Žò# ³Œä®àž2=(X³1ÐÐ<8.UÿIžúÂ3s.¹aa©™ˆôÎ$äÁßàZébšé¥PÁØòëEÃŽî{{ÑLYœ¯ÈTð ä€qžxïÝ­Æ“ÌÚÛ¿Éul®zåâ½´…%l+´x*àÄÇ<ó€HRY*S£Iñn{Në®}ÿB’i¤in"WÜhŽßB‘Û#øíNVŠXÖ´nfW{Y,šPè¤( ²xaµjl IÆvß-ͪ*Ä à:ï]{+I-âF{© ÚµÙ€Ûî?•±Ôª`6Ë…{9šîu@d1,@ßß<ð)®…6e`&Û•Ôû+c?SºÏ„¥cVó³œ@?"²c«2ƒ5Õ{è¥7{¹ ‡Hˆ=°r26ý).0ÅÉ 6Üלë½.[käêÃ?„XÇ*3h×}'×'±Æjk¥…ĵì4\Dê9ñån®£öw©ÚÉx-ç1˜¤;É ð¾ÍÇ·¾ÜQ XÌ=@ÌíÔp¿¢ßUXÔ‡éé ,tµ¼‡I\à‘¹ g;sÅ%™ØbMŸáxÞ Ë{ÌHðšFÆp¦02Ç<îÇ"»X·–°´ogOEÝ¿¸·»Kdº™VñP@ìNã ¸cÇa½%‚•7Ó.,/‡Wò⪰H,%¸{°?f‹#Ü"iν^omøj§Tº°hföŽèè¨]ÛÉ,Òܧ„ৈˆHlV0¦ 84)S¨ ĘóÓí:„º¥÷ß­ïREM©gY0 )©¤œqëñõ¡(öNiG‰2«û?p󅵑‘즸,by )l~"Føçn6 ©bØýAû€Ö$Çò´AmܲÇ}o ˆŸ Y‰ap2N°8ÛžM ·Tql–:ðŸS‹[?ƒ›[˜Ð™¥1ébœå±ýé*€ÍýFÿ+±Öý.ñêMLµEû4qæÒ{ÀúíBÄXúî°]îF“ÏuUżsO–!¥UŒ™Y0\j-ƒó¾r3Å LykKjZö¥¡tm5Æð9Ò65+lß?¥ =Hp!n´·ñl¦‰¢ŒÊd.ÌFuçlüí¥ ŠÊðàm Æõ>˜Ydk‹,„dªÃþ`xýÞô.Í DüÓÄõä¸7‘¸™ @B'îr{ž3ÚšèSp‚ã©ðU=íÃDIdPW%°ˆ5g$±«;{ÓÑLä¤ÜßÉè-]94+FÍáæM:µÔ àLsùw¤U5ŒÜ^ÝëÛÛÙt¥ gÈ8s;3i§l/<.3Ipß[hôñçÞVëÞ¹ ¤6Ó,DÛ #ê@GéïñÚ…E<ª4›Å¾·ÒË¥mt“Ú¤ñË£Ù,ÇçBÊúe, ŽõäúÿYšâyl£dÓ¨VÔ}TgðrGàкøL#XÑTÞ{¼í>úê—HxýÊÜG(•þßÃ#ʸ>o6Ú¹?Å â»6–‘_µ¶]§êI ¦ÚæA#3˜Ë:àç ®ÿÃ×aará‚7èñZzÜRD!BŸ ¾£ýåÏ's±þ”*ñTœÓ˜ùñà }zÚÊ{mWÖñÍ %†ë¶ø#qý… 8Z•Zè¦ax{ëïôŲ¹é†uWÔ3’Ѱ n;kÛ?ÂîÒ£Û—2´XŽÿ¼.tßh¯&Vñ|7f!¿GýTáin›OËׂËÔ:įq‰0* …@˜*O=¹ôçß½¬¥…hii —2ªÆÎÌÂA©±#HØg?„dí°ÇÍJ6’@ÛŸ?EÒ:„6 ÔdŠKxbeÒJï“Ãà{ñÅ þª‹ªv É=GãUí:l×]4âÿíÞP’ ×ÄÏ2. 0}³ùóQ\Z̧^\ý@¶–ä`èºsZM^ÖTø3 œ¶t óŽb…•µZ긟_§מž±ÌcbÈØç³~|úƒBÆ×´:H•ó~»mpÌ·I škÀ%ÈÛsÏÁ4Âô¸ZŒ$Ùo·.”¹ò¶<È÷°¤¨xõê¹XGo4²1Q ‰‰Ô[öÏ8çåkubðIÛÙa¿“ÿ×9 ¸ ’H|wúš{+é7ú2;ºæºÖÁ'ymnåŠø¬e'þ^>9¤²>ZØ4ÛÐøûèŸP¼h^á]Ï!S¥01Žyϰh„Q¤^†«D–Ô{¸K@þ+˜ÆäŒ“à Ž(WbZîÏ+ :"ýHï]ΣqiwÔMŧ€Þt!Ò`ŽF5ë@89$ÙÆ=¨X(²¥:y:¤pƒË„j‹ˆ [¥Oè@±ƒr³°#éŽçŸÎ’ç–L\ɶr ˆ •åOc)j5Æ`FÌÇ`Ø\ЬsÚËýÚó€µø“%Ã\’Y‘^a§K0r1Û¶øíB§+lÀÞ6¿ÝNE–Ùâ–“!HÒÃ0ÁQóõ¡DÔ®FëLî.d+Æò`•#¾zndèš`ÈÆ$@ÄjÈ$üŽô.paW©[Þ\ÄEìҺǾBªü»ý~”-ô_M‡ú`_¼¯'Ô£•·´‹Ã€ŒÃ“î}¿zk¯EÃ÷¼É\ ¼ÂÒFN<Ø#×Ò¤öC¡ËwNœ+ZêvwÖä‚ (qÇsÏ©MfHu­ouìº]µ´>âYÞpIp­!È*>ë°;TW½GŠhÓYáÇЪz|öÒ™bfxe‹B/%_Pü žN;ñïBf=°æÄƒ'º7XÇN¹´íNÄŸ#ÇçrF¬®ùǾ(Wvôêf#Ä®ÅG«}ö]·DË*¡hçxˆuåKÛðrFÔÓ¡Ù6^Ë ÄÛ¾>©Ùu[ôIaŒ® 1`r3’yÜ“Œqµ$U M2AëÒÞ«ÐÏ šJ©8™¡¨`‘ëŽô.s_P‰máU!·KĸŽD·¾µQ“·‡éBÎXXDÍ—sªL ©ŽxŒgpÏê(Xh2÷^Cý2(ïduÖîsáš2yÎwø#‰]Ô9Ìq½çì¸rô%ç…ˆ"$Åp×$ŸÒœ­Ã•™ª.l>ç*"G©[bìãÇh”2¿j %jM ¬M$…w7;ä}3ÈߟZFC¤Û’Ûk5É騣»©˜¤Øj2À.Ää €â…CØÎÐͦÖׇ€¾–ɺÍuÕ®z…â˜k¸RÍ(hâ‰ÎÇ€ÁÉ=Í­§†e|À4ßK’=ç’÷Ð^ÛÏgÖ"ƣɟRñÇ?¤¼û©=-ª"xÛð J+•G‰Õ×!ekgcÆÝöàûP¤pîgÌm6TO$3Û2OÁNs³d³n|¤ç'\P¦Ö¹Ž–‘áöçÃê³·A•f•­/JFí«C¦JœÒ…`Æ´€ËŽkÈL—Üøkr² ‘•àÆûüé®ËKÙ-…ÊêΗ]Z6_1uPã>UïßßÒ˜Ñj  :Du꬛©#)0.·‹*²0*ò‘ûØßHÆ99>ÔB‹pä~íöØræ³}á¼uºš$ŸrW_˜?îÇAñB·³{6˜ûrJç¨ÜËÅ0s¯«r09õ'ôBA!ÍÙc´ÒeS! „@ Èü¶4ʺ¤Å–¸n ø˜“÷ŽçnAçjPªu0t²ô#¯ÃLûò<Š­ª? ‚2{dóÚ‘ ™ˆÁ8Ôí)˜ã7]X%ék»H"•®bOnFûùmIesk—Y²yyxw.ÅõÿK’Ýbšâ'ÂeS’‚7ŽqBÅJ…pìÍi—¨ßCmr ,¦254Qç nH#ƒŽÛcÞ…º=¿0‰âzúʺãíl*’Kº„r,°.íßÊÀmýè…|1ùÚkÀxõà¹)Öå¼B%—XåUp«â~h…¬àÛHü¢ÝyÏ¿ê:.­¬aç}‰ÎËýM8Z)P–çy²óê3¸fÖŠq©O”ûoz˜]Fék($X« íŠ Nhˆ]+k߾鳺\Œ8ò•|çôÇÇ¥DˆºÌú=—õ½3Û¬+o„ïM@aÅg ®·Ôê'ûŽÃí_U[ŠÝuIåý¡dË26;öÏz![Wá¸sS3­#k_És:—V“©ÊtÉ(A03¶är~”áj£…mC-<å%êRG¤JͯiQoŒíéÇlQ8pâ Û‡_•Ö‡í3”auai 8 ÑêoläjÛŸÒ”,®øxŸ‘äwÁè.ÏK¹³¹%ãI£·`ÚÌ€€rusÜƒí¿ºXkÓ©NÄ‚mãá×%Åê½GTa?²,Nã¶9ìF}h[¨P.Ô¯?{Ö'_(—òÿ椺ð¬7‹,ÍÔïzÚMz‡Óò§Z0ôæ]»N§§NS1Ä…ÉP6ÖÏ¥F˜wT©ò谥ع[ø‰uÁ`0ÎA÷?ΜEÕæžAž&ßxœ[ÉI-ÍŠøÄ…ÆØ)ã'8rø¡C³f`à!ÇXü…ˆwÕâgY3´ˆpGåƒMjsÄ8.•·[¿†&Y%’B|ÊIƇÿvÛÒ…™ø:N2}¸.å·Ûqሧ·9؉ñ¨-øô´²¬/ø=ó5Þ}+ºÿkm’Â7ÈØøº6ø4–ðÊ›{JðIÕÐÍæ) w$m«8ªP»ç aœBÄ/—Äw‘ØÚ.Îr={zgÐâœ+Í+·¢Ìžr m*ppqMXl­9T:Aî{mïIGSu…^Iäý£Ÿ÷Î*Z+ˆ  DeV"\²±ÊF}O¥%$ÙM$ÆÛzüP¢B·Vø¸¤£ |Wç$,S×lñŒœlß<üÒ…Ôw}–ØŒ-4‘µÌ- ¡THp0ÀzrûÒT¸8CL‰²Ð¬¢Ô£Ê±IHÓÉîþ½(U‘.<—6îå ÄaTh‰v+¶pF{ïúb˜ZiÓ9LêT쮤•dG‡Æ‘È:‰öÇo]©ªS ‚ ˽‰â¸]rx¯!׬~ð'Ë©¦›ƒ›a¨]fF\ûúqÇÒš™ˆ”Ê4q–Ø.4“ëîhD‚aUnø‘œc nh*n…l·ROpÏ3™R}ûméD( a†ˆY¥‘æ–8Ъ®IÎN˜¬kCA%ví½ZAUX;þgòÍ@ê±<|ù¡e©r¸ °Ø g'»ÓVÄN'Æä¦ošà‚ÊAdPvÆ 4"…rš˜¤r*ü*Ä`÷þtBå;I•¢1»Îë&5ôî(!* ÈòY¥µeŸP~çÔü^iʵµ0³•‘›*¬CvÇJjrѪÔay!ÃÉ–GÂ;gù}j*¼ÀiésÅ’d4>to¾ûÑ*×;+MÏ%îI´±HP».¬7ý…ºf˜Íœ%[~ÐÛ Ylø*ì¡\àqÛ÷ ]Fsà}mbuWDhóŒ†Áô΂›Ü Í–wŽWF ³`ñÀÕà$- 4j¨²«°Ccó¢}‹Má]b‰„²°$MÿZZ¨8%W*¤÷b¤BçvÔ„iöÏÖ”šK[™ÁBHàÐÈŽZQ°ÆêO¨§tÁ~§E QÕô^BqŒy¾=¨RiNË9Œ¤d¶ 1 Žû*jy¤ s¾Ô!M 3ßœzБ•b±ÓÈÎ3I"ŠŽ0;àöúš%D‘1 $ŠœåÙ—ãoåB;$Ì¡sê”"HÕ]Gñ¬€³1Æ{ëIEÀºÀÂÙŒ–ñ\xÛèoÄNäq¸'|úüÒT¹ ¸¶el»‚6‰^›–ËèÉÜcÛžÜÒTÓ{‡Ç¿¶6¬Åuc°cæÇb~j@Ê×J¦~õY…ÝX 8Ï>朩æÈXãFX <ŸZjÒ%%9bA<â„Ê5}hÇ*vÅ Dˆ+[HQ|ž\(ÜžFsÞ’¨I$¦7\êŒoŒÁ?‘º€Œê cŸðSO*r98>¼Ñ„ău?—¯Å eU1ó( 6çëèhR] ’˜âdçgÖ…*p¿€áðÑœkêdù„ÿæ‘QpÌ#û¶[¡ð殘ÕÓQÈ ,7ÓæÊpbâñb·GÄ‹S‡ÏÑÎ =Å ;äfgI:Iíxà°ÜÚ\Iw+Km/ŠÍ’ (çnß]©Ê¹•X]o;ÖaÒŒNªW2aT±Û8ÇÞªTÀíd<–_Zª³I¬éÔ€æ'ß¿•8•n\æ!b…d™Ø£.¶9:Ž4ýi›+œCEÕ‹ (0Nvp?NÔHQ.iÝi°Ö6ó *t•'ý7þ4ˆUÔ`%FÁd¹žw «+7'|ägJ “¨CÉ3‡|"æ`0tî;ÿz!@¾ŠËh¤ôÚG-ƒæÉÇ©íAQ{šÑ3Ë)Ò0{qðÓVße ÀZ™‘ÛPB囨┪óÞ†Õ¢…Œ‹…ýì¦tžø=¿½)Qí•’Z˜¢ñ&2&¡±+ŒŽÇÞ‰HTÌa·UI …W ®¤àH1é·j5R .Th9V–|åyÁôé©Ï¢“<‹…}°N2¸ß¾üÐÜ)‰AØŽy#z!,«H¹¹Ùàœ«c¡À"”*û6hàµG|e£¿ãü:‡âŽþ¢”pU9]4õZîm%òKjÑJŠ5j_3Œ;Ž>)©eVæ }½¿+ÏOp² ÄðHÆ3íSt Ô#ˆé’Y‡»oGr‘uÃZ³¹:±Îš˜„â\èÀ#¹f„—U®-)6™íŽÈ4äg¿4Š©×4]Û$pÅd@4éÏlíùÔn³|ù€Ùs¤ŽGF˜8 œ‘±#j’Òʬ‚ÊâT ~\é»þ{ý(•UcL£q 1Y@:Iè68:áRÛ©> {ÙJ ¤µ`C ÝÎÍô „œÀõ6˜±ãJ¨^{||Ñ !©[´0¹×©Tt!ÀÇû‡Ç¥S~g .Ü‘ÏwhîuDOˆ²8Ô¬}CcP>Ûý*:,A̦`¶úGãDæèæÙÉû­°ºuf†&™²ÄrWêï±Å“qAã÷£Sö·„®eÃ<Ï+£F\²²á¶ì1ý3L-M ¸r–26 sóS kb«tQj&1àhþ{Ò:ªœ~l¡Z²˜²±FÅsœ±Í(•Ü×%$p–§a—|\œvø£t.îUUU nÙ4áO(:¨$Ò#J審“½8L´¢èY®›ŒÉ©ä1–<’w àÔJÏPËm¤®‡O™GuÔÏ.ö²m&rNÄ鹯õ¨ªÂ@ Øh±H²%Ì«X˜|ƒ`qˆö¦®i ºë]‹x¹ÅÂ)ÒFƒŽàšEUTeÛÕaê/T¯™@Ál‚3Žvÿ6©}&Ã.*èr¿CÞ„AE ÀrÌ4Âàïý¦aÊf`'_LjÀ\dÜàüÑ e·z_x´Žmiqn¤jL”< ¿?ÊŒ®àŸgPˆ ‘Ü¢:‡MÃø·qFø$²€s·ÐÓÈþì+[+I Ds¦¼N“\Ç.Téhß=²xØüÒ4ÝÁVì`Aka[aÖma˜”™„;„ "±ì9ïŸåA¦î 5p•./ܹ¯Ô-¦ydŽWfbHðay9ß°ýiäw¤P{@y=Öi.ã\¢¥Ë±Ь ƒÁ ãó©`¤MÉa).|(ÁŽÂéÁ:ue·àj'ç,`©Œä®¼óQÕPö ‘à~ò3›õžÖ6+ QŸÄ1û‚pÀzmµ%-É•ç_ ú}Õw×>*ÎÌ®ŒN¼ Ç›×ç}Í0éS˯áf{4’Ùtb¹Š ½sí·Í¬HuÖk»µx—B ß÷F3½Hm:d¬jÄç&^{SV‘ܦä±Q‚üâ…“±,Xý¨L +. cŒÆášEŽê{Ö*4ÞâL캽5Õ¬ÒItê´†laGôØÔN«-`s7EÔ±»ÜÝ™Ÿ^°±i@5c¿;mÍ‚ÒiÞ£­˜ËªYF†œmï·Ò„à+Dg9l“õÁù ¦òŠÃ!ÈØ6ud ¿•ŸmÉeŒLSSj.HÆz’´Œ×ZÕõDÌàÿƒzŠª ©ø ɘ18Ô™É#Ú…Ð>eÐ1ÁjvXâ’C™5Äm·#‚FSEÖ|Ï©Ì 'oçè³KupcÔ’Ê‘œˆÕc,Äý2[ð?*`ki²`‹ï~£’ç,Óiu*ó2ŒË)w$ò8ïñ½N‚ÆÈ"Ýu˽JîåP¼—QÅ$â2†6J‚7n Ûøï¾(`•:dÀa N½_¯Gú‹ÏŸ SYd•§–Ï­<°¬ìuÓ‡[,“LŠ`b\±g€ÉNOz`qW5„ÉraFnì †Ž@¢ƒvÎqëÅÒ$·æÓ»~W[\FŠ"‹\HªÛ®ff©Ç`3·×Ó’U1ùˆŸ÷•ÍûEmÌs«‚CLÅHäaŸ{Ô˜âÓe§ QÌ ŽØ'eÖ.£húWY—2ê²6—oÂÇýÃùü‰n`?;<‘S Lƒ_-¸áÌrö^›§F|"ñ+Á9c=±T̬ëÕEh´+¬nm,=8þD5Ö*ˆÃ,HÃ,¹ÒFq¥ n‚ë,w’Bæ4BÉŧÿoëR êmp’tPuZÆÅ”œþ|Ð5M§æ! @V[Âa¾åÍ<µM¦ðd#ŒÆpä}h‰@nauÔ-d`Óhùô:j1¾0oMý¾µ¬±W4½GrÁ%ܱFšBÉ Æ‘ ó)Üg·½0H8™°VÙ´Sk¨À”‚IaŒ¶s°?J ´P¨Û0Ùo23 VXç,¤à(þ¹Ú’£(D®oZTÝ–8T‚2Ç8îÃjmZpäé'Ïè°AxòL›mR*÷*ñn˜ÙN7õüûR•^s²šY¬òæ …uÏû@ïŸíD¤j–ˆr”Éo–;¾9?Ë×4®“Kµ”Zèh„fEx[ – íèGoíACä‹«'|>„A­IbFù$cøPZ-$ª G‰™õÄ<ÃIqè7Sq·ÝÍ\Äêñðôi99<ç'šP¨¦ÒAâ±J‹ÿíÏüFÆ3Æ?–E>õsIþí”$ ô™prE ‡íÑBäYB¦DÆøÀߨÍ2x¦ç6k/3Ô>ØËks=­½§O’“Ã-2»1Ç;†\çŠÕO d•Ô£ð¦Ôh¨ç8›GÛ^õŽO¶×¬¸[.š®ŸÙÂF~wãsõ«?LÞ*ñðŠ@ÎgxŸÂ«ÿWßîE‹ŸÙ±8ì7lãÚŸéÛÅKý.ù1öPo¶OöE¢4þ£~hý3‡Â¨ZgÍQÿ©zˆq"@»mÛÓûÓì¬ÿO¢Dó*‰>Ñu`vº*Ò4ªíúsïRÁL`0çû}Ô?õTcŸ½#|¬h§óŽÁœ¿C@o©^Û¥5ÇúBÉw<²\É ¸¾ã'Ê ü(V¬oŒÐ4\*á¬0î}}–¨rílºAU;ƒÉóïØ|â«U:ÁÇ­n?ic!ŸÛSÒÓmœ|=‚É}l—°F“€ÈÎg÷†ÿ‘½H;)²º•CIÄ·‡_•wÙ ÉÚkK©dñìŸÃ%‰óDFS?þ”Vmó Ô>!H Œuüw^‚K¤d(““¨òGך¦ž†’­ÐÍ×zl—+i*BV HßIäãô¢ÉK uÖläyc›S6F™ cÒœ­ðiªÇUpÂ@xÛ =(QB°FA¥)´È#»ÙPYK@Š 0·n7þ”ÕnOBØý§¶•IX/µ[Èà (wÿ·õ©þêdpWI«†sN¬‚;·ú¯DÈ@ó6I>£òªW4 GBÅ í¾I¢S/T´Êw2qŠVJ[¤ ‚?†$îØÓŸšhžEÉ$j§ŒŽM$À¨ˆ—%Ž‘À8§)æR@J…a¶v¤‘“u ‹X¥ VB­Î1±¦ m¨æê-3ÀÄ0ö›S±W˶Axèí©±`„äûZD*]Heª;øKr’:œ¥ˆ ï¿;óÅ(U.Ñ…Cïñ£0‰HBrÈr>vÞˆO±'÷÷-º›q¨ö;ÒTÉcÕºH§Ô¿… É„xpèå—Ûµ ft£Ã·c´§ÔmEÑ™üû¼zp$_©þtJ3ºtQûºîf\ã#qD§œ©›hÔÎ@ÆG›ïD¥Ú8ìª0ÂdÏ™ÎFûr=è•,Î…k@u#"s—mÎh’ŸhâíW‰ûpöKh:\RÏl€»Í’¬äì>€εáÈd—.ßäúÄt‡åy±Ñº¤¬|+p9ÂüëGmLjWOõt>g«[ìïX-†µ'~C®ý½híéñQü4~ïB¯ì‡Z•F‹Döp¨þ¦ŸYø¦º»Ñi´û Õ¤–œÁonò¤m(1]L!Fçž=©S6UTøÎ$Á1ê§'ØN¬% †D„s(Pûàlw÷¤1LI¿ÃÀ™m¢¤ýŠêQL±ÎÖŠÌþ gãÏ`=iþ¥§E?õz.Ùò^ƒ£ý’¿é6÷xŽ/àv G!sرǶØõEZÁäFˈø,C›”˜µ?€ºRE4IS)Ô²1Âyü¬Xçož*­tYƒšâ\ÞÚBÈ’Xá3¸'þlöÎôáZ[3Ÿ²”׿0Ó"ª#;rÙøÑ&Óuȯ\J…µC²‘æïqùÑK+‰Ž¶U}§îú‘$ñ#a,r˜Ü*°Ç ŒzóµN•œ§‚p§^æÆÄHö^‹¤_CÔúe½ÒrH ÉD1FáQ¸ß×µRö–\ìEP¨Xt¸ÚúpZ$)§, !ãŸäv¨ªÄècÒqê?½ ‰P•bÒ-Øy… ´¹TZ8ÓIÖ¡Ní¨äzjP\eEÌRï•oLlCBc3T$uL`s¸';Ф:($¿ô1;í!8§ –õ fxή9óQ d)·;ó³·¢è‡jŒCœªeÔÐ›ŠŽbî}ÔÐ×q,.´êð&bqáàý*°šÔô‘椶êÙ[i£Œ`ýIÍ Ôˆ‚åôëì°6“ã#Œî þT'úŠ_ä:]ø8ûŒ˜õ$~´å©¥þjÇé—j2"Àõb’ˆÄS;ªÄMÁ•57#œL³B–`í“0—â6f;ÓŸãB3Æé/NwÏþäF£†‰àóŒ’Où½9A®öÏz¤ô¨üLÉ™nys©s“Í7ë*êµi‡fÞ,~†s¢^]Ý¥Ë_ 2¤ò[â;é ÙÐ0¼g=Æ©5† M*tËE=@5ß]c¿ÁtŸýÆÛ³°ÏÓ½Agž'À*. ™#>"¿c(qM$S¤ÉÊmÞ#ÕWâÍ"ApŠßíµW {àPTò´éd}U!í÷ÔÓ ­Õ~©ÝJ´G"V.­q¹cëÓʃ¾ÿ_ΤÒe_AÇ;Dõçu{Ø'TûIÒmn­¡º×io­€ÒÅ| †\7^Ô´a@V8|=JŒqoÌîÜv6ôXnÞ[KÍ­åür\¥Î'WU^pÀjÿ›ƒÆÔÄ8Üe}0Ú!íi­y[NJ6ýqí™Q¶ûÄd-er# ¿ ‹Îq¶®ôv`þÔß„žÉÐÚêÑvízÇÙ©@[›ëû5`Ç{‡¸í¨)_Ö i¿k÷,/Âã[v1®Zg܃è»v¶½&â35¥É3’ñH­¿¾8¨+ J˜†¯laZlú~•>$å{yÀý)Jk[H ©mzZifû¸“$äãµTÛR¹°$’Ó¥6­\°~6ÿ;Ñ%­q© ›h:[\Ok y'‰ÝÇ›Qœ¹Û89ç³ {HÌJ›ß\4T<Àúý Ô½;§“ä±™³èÇ'õ¨ÉUõ†¯ 2¬_fb¸~–[¨¼ê2ëEÀd° 1Î;»Õ€Kãe±§6$°Tù:A°ánµP·†Ù-`F]7!:Dm6SŸ] gß4‰½‚“ÜòãÙ O>óê½$Ÿx:ÂÏn˜ÊùO½}{Ukš2ZAò 3Cv#_[‰±–vß¾Ûsý)ÙXNg!jÇ#ì·Ñ1_+i,pÝûRP.VE“«ÅÔ#°šk>©g…$˜–¶gÔIUóãsŠ›"`‰WáÝIÕ_L™¨ÜØù/>×ý¢Æ]úQnÍfÙÜ ¿ hì©óëÅwÒðzïù‡Ý1ö׫&I¡ñ€L3çO°g?D¤aÎïój„Ÿoú‘ØÅÐÉ$ã?þTÿLÞ~ŠCà”Fïÿ§ì“}¾êD÷^–à)œ ûà5§o?D‚Qÿ'ÓöQ?nz»†Å§L¿{¸'õ&Ó³Ÿ˜Oý?¹Þmû(?Ûn²ôÈ×:ˆð'ûý(ìÏÌ)„a¶Ì|Z½oÙ;›Î»aqywy ¬NaeˆÜ  ·9ôé¨ÐÃ.F><%AM7½ïÇ®\Ö)ºuÕÛ³ÜÞÈÑ8•ÉÒ {aãµ,ÀY\ÚôéˆcuhŸ§ª…ÏN†ßª;ÙR–±ß4¹Ò¤¬¥4i8Øã·µ0e²;½™]Ï¥ÚS$¶;Û3!3–¿dz´llÄwæ]ms•t+• 5wÉÛÄ1Ú¤/銘ºn¼´Æ†.Dͽy]j²²­íå 5ŒbXP&ðX1Æ Ü}ê²Jª¥W9§‰:8ï­„m­qÙZÄ"•:œzÒ%–YaÛpNç½#'eS«Tt´ÓÔ̓¾ËGJ’ÒÚÞî[×~ñy<çÀPÊu99Ç`3È8Ú“®lª®Ús[L 5¢ü‡Õr>ѵòuy_¥ÙÉ/O),ÆÑd8,·ÒwÝ»ûö«–.¶`Å#H ·^ÙˆØÆã’ÐÒ@df`PϦ<¾ž¢£}Õa®ˆüýU«§\ï3\´ ~Ì,JÚ €\9 ’0AãzöJ&`Äïr&t‹Ç­Öª“h–~›³Ç˜†¸ÔL˜.çÉþÜúcè*MÖ ¾l†U ëc¥·â¯º‹§Iñ¤,´ete†¬8æ‘u[Y®› uö’º];¦n§gÔm帙¡‰RXØcBËg·ø¨¹Ö…šµ|ôEà 'B73kÂÏqÓàh”2Þ« mV9,0I"韒i‚¬ewhôÛþ%ÏûºÝÙG2cbb1É(ØNÃÃS¶ÉÎØ,Û…£¶yc‹luÓÿ#ÕÖk«+t¶¹q+Ç" («¡:²ÀìØ ¾ŠÆUysDHò:[Šâ[ô›w½šxX¡†eMh > Æ[9>c¶6¦®/1ov%áŽ2Hï˜×kkô^ÿ¡ôøV KM4hZ8’ä—r8,ä`#;p£mÉ5•ΕçñUœNÀ›˜°î½Ot)Ë7Lƒ¬Ia%¼JÉ sdÃ!!™ˆQÁçbîqÍH•²³èŠ¡Ú’5 ïÖº,WÝIÕ^ F…+oL–žg`Å6-‚sœ~驆ÚJ¾–öAï“&?v–­;x®DýS¶êÐx†™QuC…Ò$Q'lé<{Ô²I +cpùœÊN‘c¿#¿²èÙu»mE%•»È^r£îäyÈü:yÒF{úÔ\ÍÂÍSù.1òï¹gIð^~[ûhº%œ~ ¹déO ÈÀ0ñ„;œ÷>eàêÖ´—O?ªè6‹ÝYÆOï9fôÐÊôégé‘Ê-AWgeý|Äã8>µSÛ!sqTË*–æÒ7—«YîN¯*xƒ÷IÔúUK’XÏUË^=Å´i«Æ.YI\èÂ[aÛ;R(S`¦ç:²Œö×¶ï}, 44iÀÊêRɧçq¿¸§:&Ú”ž×q>°g¹fë³LŸgº’± ¿s—Ll’º~Ýði°|ÁY…cN!„½¸¯…Å #î cH?ŠWHÏ>¼W»të_¡SË! Fࢡÿýt»Ï^i[sïÿr’OzSJG1R7PŸÑ(-g_ÊE”¦IxªÂ]’c*Žp"?É)ü¼zóRš|})”¸bYÑÁ<–„œÿþ:-×ò”°X{ÿä‘2¦H‰µ µˆÁéáÑc×å?”ïëÿ’ößef'ìÇÝäðµKÕ"`^5C)†:Wb#‘åa·|Õ¿w‚áãØ?SœM˜w™™Òæãê5]αu¿T¹“D–ðÊò37„4ä*Y›!9o|sŽ*–·0XpôËé4L‘ó:²ãõk˜îþÑÄbê¶¢7³ÒÒ7SWH”¶’È«ó§s¾xkD3Mø}ÖÊÍ<1ÍLÈv™øÆ„Ÿ=6Z:•ºÜô[dž%½Eµ›L¶¶†åTÛfbx`ú …&˜pÞ?@«¢òÊÍ9n,]—qý­ÈÛŠŸÙûâÖÓËdð…’HË-żޝˆ€$iß‘Î7¨¹·ƒÕÔqt@pm@l„îço[.‘ê·0Ê®géarve¸]±Æ 4…1ÏÓî³~™Žÿ§þõʶ¹½¸EŽÚN­ ˜§Ù¤Å‰f,Ϭ¨\¶@ NË’F^P5 [éÒa—†™ÿ'€fÚÈ­öòõõEAsö‘d}<îEÀ¢)žgì³½¸I’ÚsÿÜ?þ55žõX}ò)fˆìÍ?OŽ7ÇýbsŒ|íH†íïøH²‘!òq#Ë ÷ 7C õðiHšé  ‹¶ 0t';ã‘ØxÓ¹Y‰aÈÈrÏ‘çdžÜ×] µ‰wŠŒê ù]Goqš„•Œ=îÐO²j–3à!3><±«ÈÙÁÊI4®‚j·[s·ª×$ö–E³2ªò¯™¿CΕ!•2]¯ =Õ«:àÓ- ÈsÁõüKID°ÿ™ëÀ¬=`Ï4V’ªÁ ¼Wq™#ŽÜC – vç~õ!Uø|­.mÉ-7'…ôeÕ¿éæíJJ¡Ê¬Ž\iØga‚Ó¶õY)WìÌŽ]j¹ý.Æ5±»€xó3Iª8ÙsáÆ¿î#m ƒ¾8&Dè´W¬KÚí¹Rx¿µ'Op°Æ—rÚ„ÛÈ9 N1ú÷¥!Vk‹’Ðéï·˜—Ÿ¤Ø7Úãs/XéÐåUfµs·Ãêã^A;JçsØÕ¡Ç$Bè·Ta26›Ž°oÑÃÈ-¯Ò¢±ûWÓ„”O ÌRèÁÓ¶Uwbùß?5Òß%@ĺ®ù­¤^{΋bXI<óYÝYMp"@]I …Töäzrj3¸Tšáà= Üù*Ù¾Ît£å›¢³Eb G;Îç·ÇjyÝÇÙE¸úú¶­Ï6øtV5é6÷ImörïÀdT#IðÞ7]D$MÆÄȼÄ%\qU^Ö—×'¼c]Ìq 4–(Ò2¯ÙŽ¡!Ò¨bƒvÆ©x§œñëÉX+$×ižnú5i»ÿâŠ#…é7re¼yQ“Œì=Fß…"UTþT‘5ñü¬ðñ ÖyWÅ·’=Ì~1uãm¼¸=Îß ÑpV;àu,fw‘o¼­sõfžk‰ç× †¤%mXR,£$î7×Tcaª©¸PÀֶok;Šãõ;¹®þÌMÜÍuwnÒGàx­Œà€HR úì>*m>v[(ÒmN¥r×v¶DÍ#[—´˜øvÿü°Jì `‚wÉ'8q‹}Ú•›M¡­.°Ÿ™·vö"O bѶ¶Q ‰'“¬ž£«Œ¯R1ç|ŒeIÛúPçíà úÎ- ²þÄýBäun’C o$Á•˜õ8®Ü‚ ƒ#ÔŽjÀçÛò¶Q©‰t °ÿ`´xœþž…w¾ÈZ‹¾øPI 3‡X¥–"Û¦ov!ã¾Ù ¦£¤…Ïø…Bü²bÚ€xí‡û^£¨®¼ÇTê}>)ïc^>ïW{JÙÆ5 °[~ ñsXâýWR†³šÓœê¸ˆðÖúxùÍ- º†9Ó#i âCM…Ô°8ÎYs¸óÁƒˆÐú¨—¾™-í-ÍîÅ{ ^Iƒé9pÛê ?àæ¨\vÉN›˪+ÒeÜ9'ðäãóñü7¦¢üCšnË*‡Fñ ÌqÉ"1óØî6±ØmÛÖ‰Sý^]àu×5Uݤ-{ˆ'ðžM,c}Xb?x¯lš5R§TW9ZDÃÚ•Ä‹¢Æ.™ÚÛT’|idg·}@áã¾æ§žÐ·;rÀuùå5Ó°ÒM¹wN ༫œŽj2³flzÑ\Ñ̪ –*ÊvÈö;`ƒß¿>Ô”›Td‰¤`´Ë¡ò¥¢V)¾<§ßœì@ù Y0àßîMûÔç·+Iok’>Ì¡D`‘ëœíÆÙ4(µòaÎ ²pC±i ý¦ä©“9öm²=(C³M»ºº.ºOM¼}ã§ÂÓ2àI¬‡'Œÿ,óŠaÄhPÌUzq‘æ8l¸°ý—·F‚ãÀnU@c’FvPXŒpv÷=ñR5 FËk¾"ó,›u­¼ë>”ð4MqjÉ·HƬnÀco|zæ‘tª*bCÁ›ó&Üstt¸YVkkFY)寖ÿ¨Ø?\@¦)7XAkºÓOi0­"ÿÄ®%p$Î¥µ„¤ƒå;~‘ö;íÅ!—e ¥4iÄú÷ø+nÞˆ\ÎîÉ,!´¶ÚIùŽqŒ|n¬¢ÎÎHÈùý-(xå’TLŒ±ŒFá[,2 $gc°Üzp8¢BkAÊ5Õ/ö`Þ<–>VB±,gA]òFrAÆ3±ìiÈÍI¿´;{ÍçÚÞz­:F©$£ñ_bË•,p$çúâ£*¹6 Ð*­mãHDs˜ÎÎT=ÿÎÔÉ•*%ÙÃn´ÈaYãe‹ÏªDÏÁ9ä_cIVÙ'åðQµ»i"×orŒ£`TûãáA Ô¤‡5h’c7üY%“8´óÖ’¬3/í$'Ф¦¤ÁÏ`}1B2IºÎÃSéd “œÛmÁ4Õ€ÀT´Ç#3ȱ´»d¸þ›R”¤´@ÑCö!s‰Kc:QFÞ§óïNê_6ê™nîRÛ+h [V¼n=G¹¢›i°Ýú÷)øÈ±'xŒNAmÁÆÃ$ïÞ…¤“”Ù?%9Eˆ.ç}›oçB3¸ê«»i–Æ_¸O S£‘Ø„FÇ;*·R¦^;PHߊ••íÄèðuiû® RkÈÏâì2Nø•2ÉT¢ÆêSâ#ÃÃEL‘u)‹¼inÌœ`ì¼ãПëÞ•–u1O^ÊìÄÀjŠÇvSICæ»Y>é)DÔp­¤^ÜzRXXj(¤·¹xâE•¡>BCû`@N2sœçlšž« ç5í"ÆúòêvŽk™PE¿T[ðñDˆ*;+¨ö'Qî6>›Ô²ÙjuiÉl#ˆ§+pÔq²ôý:êQ{$v²)´©UÛbF¡{éU¹u©· /Ú:ð[úšƒ$Ñ:2‘©‚ó“ŽäóùÒTQªl×É q;,'òáCêQƒ·s°;ŽôÖ²XÁûǪºÍc3*0}ZŽîî;mÛ"’…BàÙ eõ€¶ËïæÀ‰Î08¡SJ·imǪ©l䇂He:ÐHI€}q“B—j ‡<E´î¨g ç/åÎ ÜíØýi§Ú0N[ú]o{H„AäÓ¯dÀΣÇnù¤³ŠÕ0w6QE#=†àkølåAc°Ëg¶s·Ò…6Vs„T‘¼þ= ’ßEÔ) á ÆA²N äB™y–Ü­’Ò'H„,±ùK3ißœ`ïë¶ÞÞ´( ®æ¿]z«.z\m®Ä¦K HùÎ1Û¸ù¡E˜’WÀ\ë«7ømm+H®KÞÒ¸ÉÎÇ4Ö–UÎaxªQ£ˆ¤Ñéepº[ñ+qœïóµ  ¥§e½ú]À)§-¬UBóü©,ãËÎË'úd?xUšâ?زH9^TzmNU¿¨vYkl8;®…ŠÍˆ¥”êTí€pTçž),õküÍYolÖ6?xý¬g[FÇ}‡¦F1B¶RáòX¬N¢!‹`ˆ@m¿é«ÁÍûÔ¼G ÝŠœùGsÆÄúmÍ e…\Öò‘”wyNœƒ€ÎýøÅ M¨ÝôPó210 fÇ”ENO¸ÁÚ„ó´zëu6±ÍÀeÖ¬Ré9mÏÓ¦ôJB·Ë;˜”™5Fêr@8Æù?MèCF— lªš˜H#dìG~OÆhQ’lå_‰ÄSCêR'glð?]ýhRÊI•[õ1RS÷\㿦ÄP¤ Ъníãt\ÊU —¸cÓ°¦ )Ó¨AÑenž„Ç¡Ñ!È'œ`ã#'ó©Ê´W7s†¡u͵ÄqøŽeh=j2pø>„ž¦ÜTV>Ñ„À‰•RÈ’"´q¬ Œ–lsþ”B™i …éZÖi-¥Š †€Œ ê;ƒéë‘ùR\ÁQ¡ÁÎuuOT±éÝIåŠæÝ›ÈæIPdl…8ý}3ï– )ЭZ€c¸@Ôxý»‘cÒìBB&q hGÐÊÅr78çqß¹>¦‚IE\EY0b}þŸÂ’ØÆ÷Ð]G ±êH ° Ž ÐÞ¿4’5ˆa¦H<4ëøWA¤‘ÿÖ¢?+°ÎÛP«sGª¦Æi.¤h•fŒF°`Ųs¶=àÉ¡YU‚˜ÌH3Ý×ð¹?k¾Ïßõ—5½¤ënŒáÙ‘ m›ÑNvÆMMŽ 2B×ðüu*5CÞ'oOåWqÔæé×·ó%ÈaYYÔžÐq†'RüïèiÈRfµ˜Ò5·ç€±Pµ…zoDÕ}nÂ8ã)¨ RqEÈ$ömDÓ?1²oq¯Z)ºäøHæz1 WÙ»¿É4Ò%Äpøk4hP€ÄÎ0oï·œ"ʬc;&H=Ozí\9µ°/œ­Õ•c¬êsQX˜Jîí¼˜ë÷7wQÛ}ÒÒ2Ó\JbB¬³.èpFà6Û·µM±ºêaiÓ¦]œ‚lé]ø/3öR~´’A/Z/ ™¤G’Xš]JÀ\8eðF3Å[P3F.ž=˜b p÷°Ðˆä µ^¦Í!¼fŠIú‚£LÈ®°°ð˜–ÜäcÐi; 7¨Å:.UG:˜ÌfââÝHå㳨Yõ˜ÖIÑ’IÌ’Ie “œoŒw#‒UTjѯœ×´mi?ÿ+wKëtÖÉ‘(vU´yH²à‘½"!g¯…ÃÀ:G ¿Ó‚Çö“¥¬½9ºx’)¢x˜”ÊéLEF0ÓãÝ´Þêì$¶¹m[ƒ>{JàôαԾõ ¬Q\ÉuhÏ‹wÓääê#‚Jd ñùH·u¾¶ŽSQÄ’wÜEïÑñßj[©t»«&·–Y®#7ÑDÀ©ñ›*2•OõΊmkëeÚÀŠ5ØðÒGø‹÷\ÿ+Ôt[Ë®‹Ò®$ž+É7+%ºf>¥ü<Fö:OªÌl¹XšLÅU iAâ,uöç}áz/³w=B  ô3Ë€ÈШ+¬¨õÓ¿·n à&ËŒ§EÏÍL€f='ßóº®þö禑¼€C$J¥Ž¥ÕûLŒ`ù}2N{¨*TY_.gj bÞ¼x.ßÕ"ií|¦2ªQc8pps]Áôæ’ËO5‘ûóYÌ\ÄV‚á$D“öe—Í·s‘úŠ™Üì‚ _‚ÉuÓfäÔÍYfhÙ»ãëñÿš%\ÌC\{…D·7ý;¯…¶¶Cm$Hળóæù÷ã;S¬k)V¡/wÌ ‹lS]OnVx±";œ• hÔJŽ;6ý)C˜Æ:ZlcÎ.¨ëI5G¤ñ‚²’@ØOP~ ÌÙHƒËeâ’BÅ&U²ŒÆ(L¸7]”^-7:Ý ‘åÔœŒó§¥ ‡K`M¾™3 ;³áIAddqÆ1Ï·¸ÔŸ#æÝákk È-à3øAŒ8Õœî¤d`n?Ÿj5ÕT+Ó{€u„ë§~ëLÒu3sðÚ™]bØ¡Æ]˜†Àäý6=÷,ªkhe,s¢þƒ«*nàk‰Õ’¥LæÚ) ²k!2¤§¨iâ´š£(i…ºùqùÒŽX„âê#}ÍR%×)¦ŽÝêÑP”øõÁ(ÝH’H·åV¼¹ÆÞ_ʈH`Žúê-!Ã|É”ª£m@;c¤×ÀˆD&}{Pþ; #Ó9ȤL:¡:1œûU†K"e-Ð Ô'ùTX]˜¯Ó­tS.ÝëI¬ÂŒ(ê Üš Tk/2¥¢ÎÍéLÕOªú›ˆë«& ¿*‹Áe“H¶Ãê*%ö ñD)†Ûm |ÕÁöùcÎcŠ€1Ë{S{Ã[—tu~•Ÿ6ÅM¦$žulOÖ¬Ì_çÇî”Fˆ9Ž>µKI êƒøˆ¦ë¸„l8Î8¨µÙd„B;ö?5h}þéB°0P mŸJÒڀ“ŽÄw¡Ý›£b<Ð%-dlßYÍ9uN%H6xÇçW¶¦q!F!&n¡R´X&9ª\dIL%ñT‡^’ï¾?FÓ xP™#ûÖ˜¦Æf#ó×¢ÉQ\1;Ut⣓6S1äòj󇓪ŽeYIÏçY\ÓLÝH],ìjêšžÉߎ}kFW2]ê£3di:C éG({n‰Ø¥U‹&˜,[c½I®{òê‹EÓÓî?*»²$j”¥Ç5 5Fª@ßz¹Œ"ä¤JƒnÛVj‡3à)  75\š„1º§¥Ô¼<ÅÏaSý>PkðÊY’lúÚ¡PHëdÂKC `ÔYÀ8X¦RÈÿh#æŒíËîˆM½):öI 29â€3 ”ôE(!ÎFøâ‰‘®·Byõ©æ›9(à†9>Äý)9Ò{ü—®â”ët'Æhœ²žªCwüªöÑ¿W…Pw;~µCÊ„†ÄMAMYàäoœÖšA^eEÉqŠ‹€ÜB#µEÀÎT‰ڪ0,š‰>õS‰Ù50¹ýkCE#û¯§%ì¤d ªÓˆÑn¡,ªA²3‘ô«›R[šTaW#‘Y+Vs¥½uà¦JFwÎ{b Ò¼Ï\S*E°pN~jãW)Êã=pࣩDÃðÔðÕìë®pÝIÀ<о i !WœEd' ªzê‚æƒYÈÊ‚ÛèuRL‚ˆA8ÆO49å º@(é'U’ÌÑnº•!ª”ãƒëÞ†=ô´Óß®¥¤Ê|A¶Æ¬©I¨µÓ»t²³zÖXH늌ª:›5ΫûÌ«‰gÞ¡0…,zÕ‘"é$x4Ž…4gÞ£<Кq(Hc##+QI„„&ÄÈþ5:Žk-ë~¸ hçó À6>hFÔH6B2sœÒ.p9¥ YÏeމ å¹ ‚óQ¢·nv­ã.ª žI¨–Ïî(Q>ƒŠ©ÇûZ˜Q<Öw0¤¢{Ô²hQ³g>˜õ¢›O‡‰IHïž* sGîL§¿8>ÛT€?º‚O~޴ˉ³¶J=)5ÑtÔÎ>*ò¡Qº‹r 튃ìs6ÉŽjâsÁÍt ¸2!C=ë>P×rM,oµRZ ²” íMÃ.‰j«<îNk3É&êAœõ 8Àd†bÝÉù¤úŽ©¡'ÚP+ƒ ¡ã°®ˆ¨ÒÀi6OŠ„^éÎÃÌ=z€®2‹÷ïüw#,$H+Áø59¥·ÇÏ^ZϬY4÷Ù¶¤pÄŸ”£2®²ëe$ÉÛ¶ôÜëJÚ‘ !,÷5éºhù¥$¡“µBY¨I ©+Œ`ƒž*úu†\® $n¥±ïïVK æ;Òº™eÀçnkCªR ~iTIß&¨{€0Û¦ñy móW~¬ %• ú½:uƒìlPD&N6Æõ'>QªP k3”i¦•D€„¾›Õ~ ¦ Á©µîkKFéD”`0çRÞÁ”ª2ƒubyßôª_QÏý×ôLK>•^x…/ÔWþ ÿpG*’NÙ§MÍ.µ‚ ¦6­H&¢çÅ‘ dÔsáDîj³$Êi ¥¿ª2tÙ ?ƪæšy5,Å¥â¸Å\1$7,u×’ŽU#7¨Í\qƒq)(ÕI*E×”%PM!HU€BITL%PM‘B3L9L’3LD'ž(Ì‘ ƒ‘I¯ƒ!¤~jàì×)h2„v§µÐ•A¢£ÅB!4‹õBF«&SK½"E x¡$“Ž)µÅš ÝHÕ~d¡¦\-¶ô‹í%ŒúÑ(Fôˆ:„%íPÓåM#P"预#zWB‘­TQI¤a4QT"œ”‘QM•E+!!¢P€i‚„S#t””àÕŒtALúŽ*đڋ¡¨ÊF©¥H¡#ÍTã%5MÒE$ÑB¦’U “LoV HÅ(B;íHkÞå§Þ„Hµ¨”(Ôe5aÞ´ºê(4”#æ”qBU”#4¥4ª3(E„·¥% Žh¡õB(B)BšŠNP˜õ©‚EÂÉÚ¥œØ%õ1Ĥ‚j$¦‘5=8QíU!4P:¤ŽôÓEEG­E¡Ÿ±©6)"™’„cÛze¤"RïPÝ ÓBF‘”ÑP"P¥Z ½ÔQOT'Ï4æuBY¨šYæ‘ Ê⣢P&@ãÞ¥ IÑÍHPŠW„(4¨ ¨>™¬ïÅPi‡<9ßÉ0ÓÁ#<_ýEªÏÄ0£Z<ŽàqÿPRoÄðšvÁ<@þ1RÿRÂÿ¸Èî }æ.CþJj?êØMCýÙ>ÍÜ7qgmGáj§|k ‰=ÃøGfå¼NÈçêPÿQk|‡ÕHRúIòÅ·»Vþ sÌ2—›¾À§Øñ)Ãz(FsÃv'Ò§ƒÿÔkW2·bgKéÈJH+Ozî^aT‚hqEFJLŠ’§(E:!µÕ0L¤K¹ÍD¹M©!¥™ R0…a­E*C‚RB*1(HÕnÕ0•A4'ÑÍÐL‰º¨D œOµü —,’°fÛaükƒ‹¬Ê¯Xx_ÑZÑ ¢ÇdÛ™¬£ãå˜Úßmy©ÂˆÉ;Öqœƒ7ëëçÜ¥dËlc'TcI ¢#øßÙ(%D¶yÅVkfýÝyï)‰9Æ6õª^ù€Û&‚G‡>Õ"[ûÚòçn~<¡#ê\éÆqëXë×Î2Óý° q$~äÀUJ7ož>¦°âšqæ}Ê›Vë;¼ç~Ïð5êþñÈ# Œ7>Îú5ž¥/îjÞy¯TàeRŠrwI.õªiŠ›RGz¼!§G4D¡<ÓFsLMQd#4‹¶I*S)£ò¤PžjÌÄØ!0OÃŽ‰%ñÍ"t„#½tÓÏ®ôO¥ gzŽiM#ÅDÜY |ÒŠiüTà’ Ê6îì™™RŠq¿S^'â¿'ê,±¦/7#Sb-¬rZiÒ´î¨7,qa\—|YæÙä}nU‚˜â—ŒûáWqKýB¹œ­GêŒ#<›ñùUgâx‹‚G’y^3Ž0>¨~¾¨»`xd xÒvoj¬ãñÙÞÝx§”$e“?ˆÒ¢qµÎ®De ̱P‰ gzÛï`q$ ¿[Q²Cr3þoU´Ih=_ß`šR~©þ&¡_öøŸw $ã×Ö«¬&çßÛê˜]™!hš69)Æ}+Ùé¬[ëa݇¨d²#ýÓ·‡Õf¬Ø2ÍëÑÕH ¡1Rh„‘AB(B "„sDʽ9"ÈEðB)ŽG”¦4B2(™B Ly‘ Q(A4³!™ä„G’4œ`J6¨´šu=n’®âO ~àmóX¾!‹ýõ÷ÝæÃïà¤Ææp ‹€3_3 kd¶è8ÛÖ‘k[hºç>•FɤI?P™„GcI¤È(C})T7„Âq.§ñÉ«p´…Z¡§MOpºN0¹ÎNNàö®†lľuPäö‘ëüê:åpãõþP£ Æøç?Æ«Ä4þâ5Ÿ”ÂD‡|š­î€5“õL+¬ßºB yOùùWGáÑã˜OíwÊ|tò0T* Í]l×Ðs…‘Í"ùD#"ŒÁÈ£2š;@ˆFª;DBY¥ †© žA©KJ¤Lh„fŒÓûŒÐÁ¡“è+?há NÔ}(íˆÕg< wn!ý©þ ðFTkͼ¢®ŽÝ^ß­K¶$iêˆF¿j‰¬FÈ„Œ˜lš‹ñY>g;#,¬=B_*&ê7$zוøö4âƒiR»EÉÝ_I¹nVB¬NÃôÅyóJ«Œ´zBºB o«qIØ\AwÌ:Ñ‚b îÔÇÃqѨÎklù° g5m?„W$g€ Q¹&é3júˆÛØçšnø=`âѯ¯4»@—ÝØ¿Cý.£NWæžq²˜éß“ž+S>V‹Ht_[è6>F#Љx(ÒpàãÐæ¢(¼°í:±NFª:H‚*±Má­k„÷”HC®G>§zU©æ<}M“D®ÜŽs·Ö«4ÁãPv<~è”ÝILãëéN½'¹’ŠºéA(–%`F¬n3¸5î0Æâè¶ #1yÞÚóYœÜ¦¹=ënb,T¢P–w¥˜ñB2iærŸj3žL`ÓPŠŠ4B)ÉB2if(FO¥Îá Õ0í“OJ—Í!,{TržFôä'¸ÅТ]}r}ª£^˜ÞS‚£¯?…wªÎ ŸØÛ§THvÈ@öªÚµg5C„~}S°ÙWá ðO¹¬Ÿ¤`:OR¥™H çüU¬Ã·X¿púýÒ.RÒ3¾[Ù¶~o¤¥(ÀaùÐÙÛ¯dJ­æNòñ½d­ñ =#z€÷_®ÿ% ÂvU4Ù]H1¤÷çøkžÿˆggiD~Þ>öò‰ÝL2,T%‘‹¾ÓŽ*œV.£ª?/í~x>[&ÖØ(*HÜíÍdf¸–›Ún|&Ó;ýÓ•z±ÁÕ±¯­uéÕy= ‘¹Óm8ðàƒ·ûÉÅ1þ#¼ÂÁ##Iÿ¥¿µ@5Î ÷:ÞE°„Aá‡ÀÍ"ç°Èzý–@çWÕj=¦_ß#½¾Ö„âT$ü-ëùVlAN¾^‰„È/»Ñ²d Éå;¨>»íIØ’Xn$÷ÛŽÉåºZÛ»/ïP5ÞA—_² (ø„ðñþµWê\t{êO/$Ý›K…ÿ´šu«>Gå‹èO…Áó@pªñ&îÑ}TÿJÂ1XÝÜÏùOýªYZƒ4€þ(ûZ‘ø†$ÌÏù_öFAÍ#q'ÿÚ?öµDüR¹±,>>ÈÈ:„xòcðÅù5êX‚#+<ª# êãMŒiMÿäj¯Æ­¿û/û##z„ŒÒú ÿµª.Çb÷Ê?áÙ<­VÄÍ %Øm¶Ûf¶a*TÄ:«´µ¾YÒ,@ãüX¨8¢¥œ—vÀ89ÕΩ†{åõj‹Ž«mÅL°A‰M,såÕ“óŒRv:¹fÁÒcc~(ÌbSL< 0Îr3µM¬ìðÏm€pA6’¾ü#{"eÊZ Lr+@ ÂCÆÀ @‚‘®ó¦éJ4(†Ü ni 3k®\íà%L–׿%¼µ©Ž¦Ð]S7ÌIùb.{ôB‰e\¦A'ìÃð1‘“X±51±4K E;Mï}Tš_T9ÏåŠN¨Üĺ}“„s’Cã¶8Ç9©At—Gˆ¹ãNA$˜’ˆHÛq¿ÍTö9Òê,'K‹ïyG’`ñ(la†ÐS~L®l×1!U‹%Ib@ûzí[… ¬ÌCd³°‹Û®åÒ!E£]8ÃŒzÿâ¨~žX!Â;÷î'˜õü¨¢!`ÏlTÑ¡D¼5Âv×øöL’«`€1 †íƒïXêS¢ÐâAåÆo:øGª•E'*U:,.ÌÀ@·~Ó{ô̦IZ–6ºN=NOþk¿Oö‚r“LŸ'–€YT\‘’4o±Æþ´…A˜³%ÄqÜ÷"9¦/Œ@Èjƽ¥ù"s·xãà–Ɇþ›r*£P6›ž#Qµµ¹ú§„Õ— iñ·¡ôÅ[J¥<Àe×6ÜÖ2«Êøk?3ïŠÃšŸdÐFŒ"u¸o®Ð¥yRÎ@! Îûz»´/hpdÌûž(…Œ¹ýâÞ¼×5Þ,ò|ʶÊQ‰$Œz»ðúޏ"w><’#dâ`X ï“ª¥„¨×<”ÞLõ×°à¬`Å„ˆwã;šÕR›Þ÷ÔD鹟Jˆ"ÂA‹ùÕMx6æ>¡8LÈüý*ÌÎ7xeÿµ$j“°?þÔv¸‚ ä?ìNŸý„ÛýªÚßáðû·ÀsÊÿøj˜eg-ÿ§ÿ¤uü£ ?ùgçHÿþiå¨ßþ?£ÿÆ‹qëÍX„ˆÊ²ã‘Œ~ƒü®‹‹in´¹ºˆˆ#“lG~‡Mâu•9N䑌’kN!×&"gØjLƧë -UÈCJ0ãðó¯ßÔVJï® ^4ÿ1LjËÅHXh› ¡ÂêØî{zš•Fæ¦r·5À¸º}  ¦‡:Šã|r9Ú§F¦lÎfñ¨ÿf;ý<Ô¼ÙËúOô«Hx!Ö÷]§ü¿”¬¢KcXÀýÕÍR÷T|æ672MÆúDØNéˆMLŸï›ëýêtÝˆÞøæßyxAޝòGâÁàÿ•[.¾ýà^Ón¬—w^‰DF§à©8õä{T0Î`{Æ­&8êØ¹iÇÙ7 0QA8ô?Ö‡Šl#8N÷ÌgÁJC° }²hmJ³@<¾o¹D2˨‘ŸsÍhuZb¡p¤=ýäwJŒÕ@?ùqŸüÓýHümñÿ÷F^}y!œ°ɤÊF¥wTÃ(h;5¶ÇÝ0!JHÃänq“ø5¢¾µ¤1'PO¶œ6 Š Ã$ŽààŽÒ¨£A­¤æÉ-ßö‘ ¹nÖ˜ú¦MÔÉ ÖÙþU ¼Tv™@ÚEÿå1nIi²©bŒM“0ªw'õ¬tð˜vâ3º°A “yÿ)ó¤\HˆRè’0¾m˜íV·(V¦)üÖp3òøIÚm7ÒÍ Ê±CC¦~¹®›j8–UdøÈ3{Xyò´¨’5 F$ïǶ­\ì­?mRÌx¨èU$¡ÏÖ©4)Ósƒpæ-ÜAL ‹ó朓ºDoÿ†?é¨9’c±"?ûR‰ç’Ù`NûäîkÄ9ÅÎ.¨&÷ÖOšÕܘ)ÔûœÕ©@,<ïíÂþƒ ¶xÈ$&çÕ³ü«#ñr k.x™÷¤⯷åÎ’7à?u~픃"Äç˜ZýÓÎê·ì­wUÎÜAZÝ[NœÛM柱éà¢=Ë`à–#m©©º®S•Ä‘k†Ó Øm9Ÿ ¥(êê^" üX<ã Uÿ©¡H~è1:µºwh–RP³§”xƒ'þ~?J)üF‘Ê;KŸöôï†Û_~,<ZÇÞó«9#:·ãšÁú€qÓšd¶.]p ‰0~Êqò+µ"» J­ŒÈú×Kµ£N£›˜jnFúÞÜõªÊŸ¬ê‚›²˜ÔI8I-xô”ÞO |±¤î9ò5el_éÙ©¨ÔÚ΂`1ËšA²nRw’9sà…V9ÉR~¼ÕU«WÃÖžÄ48êZâ;ã1ׄ$Àj£,ÌÒg q‚J`â©ÄãÞú öAÇBK1Ü „n›X#U.‹È¦U ©j®·Æ_Z«_‰i¤ZÚzdžɊ` QN˜lœ6ÿÅ]†ø•vc“a ¹æNÉ9‡¯å7¼Á!AÒFÇ<þ•:¿ÊâÚ`å#[^ÝÂßÁHRâªyB唚Á[LJvmÂùZdðÓMü!L65U¬Ç…'þ‘ý+´ÙUÌÓq0”qO Ü’~MN*Õ¹3Þ(°O.8côj}zbCÈîwwˆ ;“¹Üó“TœÎ'1õM’I-“îi¹Î$¸¾OŽIgn~• ÒØ” ‚Ú¢  €lšU B`öíñV4ÍŽÉ#ëDï7B±¥Ö0Ãlò+]\gn2Tåï÷âlh«±YÒKŠ…†©­?vÿs|Wl|ýÇwu*®Ó‚Xóc>Ã÷¨†C²Ï!{íË_TåG9>ÝñTgù‡¬sž¿ µC:so¦jOž¢Þ»”—Jâ q¿¨ˆ`@&³oÄwD÷“¯šlvÊ›Sö²àÜG‡]É„¼ ¶ ('Ô÷ô¨‡;)pñ;‘J(àHFO§j³ ðêfcsé÷ý’sÎʹ#e9å}EcÄá*Svm[ÅL8 ¯­PX4þ~É €­EÌÐ.‰A9¢Ü‘ªDŸZJÇlÔò"ýJ%žß‹CÄuöB[v¤r›„&p8Îjn (HãÒ KbÁ>ÜPnL!{ÐYÁ¦bp¹ÁÁ­ÁÖc3ÅüÌ Pú~•šû×IÛ8Àî+ÜQ`"Ï°ßÆ} –by(°VfR{⩨ÊUêd^ó·[Ç î˜$](ÑIQÈUt(R% ‰Nëtx_šd•b¢‡VUÇ­k§F›j6£{†žÖòÑD“Pˆ1?Ί8qL1ëÑA2«BNØ /"²ÒsÉÉíyëî¤UBu¼sJåcp.s™¦±ãÑñSk†édb®8Ô]ôêuD ç"=;ï)À7 YЫ¨ |ïƒWæ©´Ô<&ƒn=ß”µ6VÄÀàœŒãüúVÌ5V:ë }®< J)I(Hò„ÁýjìN0P£š‘›ÞxÍýÐÖɺ¡åפ¾äöÞ¹•±½¾P5¹á}š˜l(BÇ9cõç5“ UÓ™çîfxëùßDÜ8+.0uóƒ·º›®Í¬i¡¿•ö<áD©²2”ð$ŽsZ*Q©MÌý9ÖF³ÎÜm§á AÕ5˜¶ŒïŸÊ¬¥Ž52f¼Ïu£Ä)ÂŒˆŒ—ñ oYñ4i>˜ªßÜ#}®:ôRÌ*£-« ã®|€ß»CÇØ¦@ÕW.ASœç~1Þ±bs0µÄÌß@7:uÝe6Ý5%}v9«)9ÔïÀÈ~þ<’7VDH\nF3ƒÆ+Vîk ÉL"cÚOµÒr5õ±})Ї™¢Ä[ÀkËN¥(•)4Êr˜ 005~#²Æ¥gŽï^àRÝRð•Ô~éæ 0”ë4ò`ï#ùô"uO1 ©WKéäçšçâ©u;1s?XþB“L‰RŒ´O€GÒ­¡R¦¤4ÿ4&]{yr~•,NlC"ß,žðáù!bª#}#¾ýëžÖç¿]n§0€>)%úþtu% LœRi²ñÆWrA$gÕÃa 92 ‰Žý5µŠt«‰f!†×½tœú!â ïÜŸ.û¨@U¼>#ÒÃ>„V:؈yªoÀˆèëâ¤_ÿÙruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/col_resize_cursor.png000066400000000000000000000027071511343406000263230ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±¤IDATX…í–]hSgÇ'I»&ÙêÚ¤ÒùÁ`³³N¬sSÁu£(TëG›j­¡´SAhÅ€L„îbÞ])l`)»)Œ2‹7Þˆ¥_A´Ø¥R/*£Ó­KÛÓÆÓä䜴Í9ï.òAL?¬ŽÁýÃsqÎû¼Ïÿ÷>ç}óÖ´¦ÿ“„[V‘³þßð–?~ü®aO€7×);ÈYXXøµ§§gç29¯f>22²EÓ´ Bï€%+ϼ177§D£Ñ©ëׯ äýSixxøMÓþÔuÝLŠÛ…š¦EæææD$™¹zõj`_vuæ÷îÝÛFÇFGG.^¼(’ÕÀ†e\š¦E®\¹"îß¿WUu¶­­­p,±™t÷îÝÛ·o˜Øäñxl²,¿h$Û­iMMMÖG½ÞÐÐÐÕÖÖVNâs,š»T1Éï÷oرcGßäääæÚÚZ›išX­ÖÔ¸5¹úìȬBI’Ÿ½±±Ñ244älhhèjooÿd)ˆì6JÅeee½²,¿}ìØ1[,K $‹Žk·ÛcV«ÕÈ&7MÓ’——gB ª*ñxœ³gÏZ:::œ^¯÷'Ã0êš››ý@ 0Ó-K™www¯ß·o_ïÌÌLÉ¡C‡lSSSèºN~~>%%%?~œÄ6X^’$qûöm¡Pˆœœ éìì4ËÊÊ¢'Ï;÷K " õööºöìÙÓ‡·UTTØž>}J< ¨¨ˆ‚‚‚t^$!Š¢055…išØl6òóóéêê2÷îݫݸqãäéÓ§b©ŠVMÓ~´Ûíõåååøý~$IB$Iäææ’››ûRóóóÌÏϧ;&In·›±±1ašæ_[·n-ƒ©99—/_þhzz:8::/..@:$Iz¥È¬áp8Dww·©ªê\KKËW@àL-ÉÕÔÔhoo¿699¹nÿþý–Œ£Gii)gU¸sç4Ünwz§NB Õ•Â0 Óçó¥ç9NÑßßoÌÎÎÆjjj¾>v‘¸SÒg’¿å@iUUU‹,ËÊðð°ár¹ž¾¾.ŸgÄ% 5ë)§Ó)úúú EQbÕÕÕße˜$»¾hS¥!Ž9Ò2==­Ãåre4“¸>vfÄ.àSUU£>Ÿ/½rEQbG]•ùŠçÏŸOœÞIæØ3 lŠF£jkk«0EÑ_Ö<bÛ‰'.„B¡°ªª©Û°ؘQ(VÀ­iZD×u …´ÊÊÊk@ðÁ˘/‚¨««ó…B¡HÀÃò·¡[×õ°¢(‘ƒ~4¾ªù"¯×{!‰<ª€·–p…Ãáßêë뿼$öÆŠæÖ¥^fHq 6222­(J`ppp˜ôäxJ#Ëò`GGÇïÀç\Œ¬Üç&­F*Rg÷Y²°™UˬKæGm%ó5­é?¡¿dÉfYzœ¯IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/colorsel.rb000066400000000000000000000040061511343406000242230ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Color Chooser A GtkColorChooser lets the user choose a color. There are several implementations of the GtkColorChooser interface in GTK+. The GtkColorChooserDialog is a prebuilt dialog containing a GtkColorChooserWidget. =end class ColorselDemo def initialize(main_window) @color = Gdk::RGBA.new(0, 0, 1, 1) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Color Chooser" vbox = Gtk::Box.new(:vertical, 8) vbox.margin = 12 @window.add(vbox) frame = initialize_drawing_area_frame vbox.pack_start(frame, :expand => true, :fill => true, :padding => 0) button = initialize_color_chooser_button vbox.pack_start(button, :expand => false, :fill => false, :padding => 0) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_drawing_area_frame frame = Gtk::Frame.new frame.shadow_type = :in @da = Gtk::DrawingArea.new @da.signal_connect "draw" do |_widget, cr| cr.set_source(@color.to_a) cr.paint end @da.set_size_request(200, 200) frame.add(@da) frame end def initialize_color_chooser_button button = Gtk::Button.new(:mnemonic => "_Change the above color") button.set_halign(:end) button.set_valign(:center) button.signal_connect "clicked" do |_widget| generate_color_chooser_dialog end button end def generate_color_chooser_dialog dialog = Gtk::ColorChooserDialog.new(:title => "Changing Color", :parent => @window) dialog.modal = true dialog.rgba = @color dialog.signal_connect "response" do |widget, response_id| @color = widget.rgba if response_id == Gtk::ResponseType::OK @da.queue_draw # force da to use the new color now widget.destroy end dialog.show_all end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/combobox.rb000066400000000000000000000204771511343406000242230ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Combo Boxes The GtkComboBox widget allows to select one option out of a list. The GtkComboBoxEntry additionally allows the user to enter a value that is not in the list of options. How the options are displayed is controlled by cell renderers. =end Icon = Struct.new(:name, :label) CapitalItem = Struct.new(:group, :name) class ComboboxDemo ICON_NAME_COL = 0 TEXT_COL = 1 def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Combo Boxes" vbox = Gtk::Box.new(:vertical, 2) vbox.margin = 10 @window.add(vbox) # A combobox demonstrating cell renderers, separators and # insensitive rows. frame = Gtk::Frame.new("Items with icons") vbox.pack_start(frame, :expand => false, :fill => false, :padding => 0) box = Gtk::Box.new(:vertical, 0) box.margin = 5 frame.add(box) store = create_icon_store combo = Gtk::ComboBox.new(:model => store) box.add(combo) renderer = Gtk::CellRendererPixbuf.new combo.pack_start(renderer, false) combo.set_attributes(renderer, "icon-name" => ICON_NAME_COL) combo.set_cell_data_func(renderer) do |_layout, cell_renderer, model, iter| set_sensitive(cell_renderer, model, iter) end renderer = Gtk::CellRendererText.new combo.pack_start(renderer, true) combo.set_attributes(renderer, "text" => TEXT_COL) combo.set_cell_data_func(renderer) do |_layout, cell_renderer, model, iter| set_sensitive(cell_renderer, model, iter) end combo.set_row_separator_func do |model, iter| separator?(model, iter) end combo.active = 0 # A combobox demonstrating trees frame = Gtk::Frame.new("Where are we?") vbox.pack_start(frame, :expand => false, :fill => false, :padding => 0) box = Gtk::Box.new(:vertical, 0) box.margin = 5 frame.add(box) store = create_capital_store combo = Gtk::ComboBox.new(:model => store) box.add(combo) renderer = Gtk::CellRendererText.new combo.pack_start(renderer, true) combo.set_attributes(renderer, "text" => 0) combo.set_cell_data_func(renderer) do |_layout, cell_renderer, model, iter| capital_sensitive?(cell_renderer, model, iter) end path = Gtk::TreePath.new([0, 8, -1]) iter = store.get_iter(path) combo.set_active_iter(iter) # A GtkComboBoxEntry with validation frame = Gtk::Frame.new("Editable") vbox.pack_start(frame, :expand => true, :fill => true, :padding => 0) box = Gtk::Box.new(:vertical, 0) box.margin = 5 frame.add(box) combo = Gtk::ComboBoxText.new(:entry => true) fill_combo_entry(combo) box.add(combo) entry = MaskEntry.new entry.mask = "^([0-9]*|One|Two|2\302\275|Three)$" combo.remove_child(combo.child) combo.add_child(entry) # A combobox with string IDs frame = Gtk::Frame.new("String IDs") vbox.pack_start(frame, :expand => false, :fill => false, :padding => 0) box = Gtk::Box.new(:vertical, 0) box.margin = 5 frame.add(box) combo = Gtk::ComboBoxText.new combo.append("never", "Not visible") combo.append("when-active", "Visible") combo.append("always", "Always visible") box.add(combo) entry = Gtk::Entry.new combo.bind_property("active-id", entry, "text", :bidirectional) box.add(entry) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_icon_store icons = [] icons << Icon.new("dialog-warning", "Warning") icons << Icon.new("process-stop", "Stop") icons << Icon.new("document-new", "New") icons << Icon.new("edit-clear", "Clear") icons << Icon.new(nil, nil) icons << Icon.new("document-open", "Open") model = Gtk::ListStore.new(String, String) icons.each do |icon| iter = model.append if icon.name iter[ICON_NAME_COL] = icon.name iter[TEXT_COL] = icon.label else iter[ICON_NAME_COL] = nil iter[TEXT_COL] = "separator" end end model end # A GtkCellLayoutDataFunc that demonstrates how one can control # sensitivity of rows. This particular function does nothing # useful and just makes the second row insensitive. def set_sensitive(cell_renderer, model, iter) path = model.get_path(iter) indices = path.indices cell_renderer.sensitive = indices[0] != 1 end def separator?(model, iter) path = model.get_path(iter) path.indices[0] == 4 end def create_capital_store capitals = [] capitals << CapitalItem.new("A - B", nil) capitals << CapitalItem.new(nil, "Albany") capitals << CapitalItem.new(nil, "Annapolis") capitals << CapitalItem.new(nil, "Atlanta") capitals << CapitalItem.new(nil, "Augusta") capitals << CapitalItem.new(nil, "Austin") capitals << CapitalItem.new(nil, "Baton Rouge") capitals << CapitalItem.new(nil, "Bismarck") capitals << CapitalItem.new(nil, "Boise") capitals << CapitalItem.new(nil, "Boston") capitals << CapitalItem.new("C - D", nil) capitals << CapitalItem.new(nil, "Carson City") capitals << CapitalItem.new(nil, "Charleston") capitals << CapitalItem.new(nil, "Cheyenne") capitals << CapitalItem.new(nil, "Columbia") capitals << CapitalItem.new(nil, "Columbus") capitals << CapitalItem.new(nil, "Concord") capitals << CapitalItem.new(nil, "Denver") capitals << CapitalItem.new(nil, "Des Moines") capitals << CapitalItem.new(nil, "Dover") capitals << CapitalItem.new("E - J", nil) capitals << CapitalItem.new(nil, "Frankfort") capitals << CapitalItem.new(nil, "Harrisburg") capitals << CapitalItem.new(nil, "Hartford") capitals << CapitalItem.new(nil, "Helena") capitals << CapitalItem.new(nil, "Honolulu") capitals << CapitalItem.new(nil, "Indianapolis") capitals << CapitalItem.new(nil, "Jackson") capitals << CapitalItem.new(nil, "Jefferson City") capitals << CapitalItem.new(nil, "Juneau") capitals << CapitalItem.new("K - O", nil) capitals << CapitalItem.new(nil, "Lansing") capitals << CapitalItem.new(nil, "Lincoln") capitals << CapitalItem.new(nil, "Little Rock") capitals << CapitalItem.new(nil, "Madison") capitals << CapitalItem.new(nil, "Montgomery") capitals << CapitalItem.new(nil, "Montpelier") capitals << CapitalItem.new(nil, "Nashville") capitals << CapitalItem.new(nil, "Oklahoma City") capitals << CapitalItem.new(nil, "Olympia") capitals << CapitalItem.new(nil, "P - S") capitals << CapitalItem.new(nil, "Phoenix") capitals << CapitalItem.new(nil, "Pierre") capitals << CapitalItem.new(nil, "Providence") capitals << CapitalItem.new(nil, "Raleigh") capitals << CapitalItem.new(nil, "Richmond") capitals << CapitalItem.new(nil, "Sacramento") capitals << CapitalItem.new(nil, "Salem") capitals << CapitalItem.new(nil, "Salt Lake City") capitals << CapitalItem.new(nil, "Santa Fe") capitals << CapitalItem.new(nil, "Springfield") capitals << CapitalItem.new(nil, "St. Paul") capitals << CapitalItem.new("T - Z", nil) capitals << CapitalItem.new(nil, "Tallahassee") capitals << CapitalItem.new(nil, "Topeka") capitals << CapitalItem.new(nil, "Trenton") model = Gtk::TreeStore.new(String) iter = nil iter2 = nil capitals.each do |capital| if capital.group iter = model.append(nil) iter[0] = capital.group else iter2 = model.append(iter) iter2[0] = capital.name end end model end def capital_sensitive?(cell, tree_model, iter) sensitive = !tree_model.iter_has_child(iter) cell.sensitive = sensitive end def fill_combo_entry(combo) combo.append_text("One") combo.append_text("Two") combo.append_text("2\302\275") combo.append_text("Three") end end class MaskEntry < Gtk::Entry type_register attr_writer :mask def initialize super signal_connect "changed" do set_background end end private def set_background return unless @mask if !GLib::Regex.match?(@mask, text) attrs = Pango::AttrList.new attrs.insert(Pango::AttrForeground.new(65_535, 32_767, 32_767)) set_attributes(attrs) else set_attributes(nil) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/context_menu_cursor.png000066400000000000000000000027301511343406000266710ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±µIDATX…íÖ_LSwÀñï-PæÆ耥²Ä‘Íl«Yئ£Ãb"‰nÎÈËÂp‘…Ä9SÌj`Ü“ò°£,è²!º¨A¡‹ìaYC‡P$ÃKu£òçþî={h/v*Ú±—ä¤Ms{Ÿó»÷œ{áÿ˜"’õŸ-ît:—LOOÿVUUµHl‹ p8I""·nÝò­^½úEG¤§§§Šˆ˜¦)ÃÃÃ>—Ëõú¢",@ss³ƒAÃï÷{ WI‹‚°Û¶m“µk×ÊÝ»wÁÁÁ¾åË—¿ <÷¯#,ÀÖ­[%33SÊËË% >Ÿï§œœœ—#-–kÎY‘a(¥èííeûöí¶¼¼¼U/^lMNN^ ,‰%â¡¥W¯^¥ººÚ–ŸŸÿ¶Çã9’˜˜èž‰bN€ˆÌ”R\¹r…]»vi………%===_/‰±@Ì{SE”Rtuu±gÏÍår½ÛÓÓÓäÆ1/ ú2XyáÂöï߯U\¾|¹ÈìOƒxh[Í(¥8sæ ---¬Y³æƒK—.}ä< bÁ¥§OŸ¦µµ•ÒÒÒʳgÏ~ <ÿ¤ˆ‡fߌÑyòäIŽ?NYYYuggg-àŠxäd› ”âØ±c´··³aÆšööö€¬…"âu€iš3 jšÆúõë±Ûí$&&b·Û¹~ý:CCCÚ¦M›>;zôèdeeå—@Ð1Ö(®¨¨`&ããã%99Y²³³ÅãñÈ|¡”ÒOœ8ñ1³¨ªª¢­­ ¥‡¦¸¸˜7~ÕÑÑñ ð`D°÷€Âóaá1×Ô×׋ˆHmm­¤¦¦Jnn®ô÷÷½½½^  X¼äNÂñlLb† ŒŽŽŽ™™™’••%;vìÃ0ÌÍ›7WË @\$m<é`Š:tH Ã0›ššN»\®º©©)µsçNIKK§Ó)~¿ßðx<ÝÀJÂ'[$ãæI 6?Îôõõ‰RÊlhhøx(òz½ßŒŒ¨ŒŒ q8âv»ezzZ­[·î=Â3À>>>Þdšf`rr²{bbâÓ4ÇÆÇÇÛ•Rƒ†aøoÞ¼YÁ̰º®{÷îýؼ¤»Ýî7u]WÕÕÕ’‘‘!Ë–-“;wîmmmm@ÁùóçKEDÜn· ‹ßï—ºº:éìì”S§N‰®ë0ëÍêAdš¦ÞÒÒrdß¾}ß?~àÏx‡††¾ß½{·a³ÙHIIÁ0 D$ H¹víZ*€¦…‹³>­Ð4 ]×〔ywÀáp$;wîCà- ?J« Å¡Pè^ PJ)óÆ‚‚‚O€W€×ººº:B¡PÈçó z½ÞP(t¯»»û×Û·o‚Á`ààÁƒõÀR¢Ú¶$!²h¦·£ulRMMÍ;%%%[|>ßtssócccýÀï„{÷»Âúù> >`Œðìx E*Žž„Ñf~7œ‚„PBä÷î_Z  ÍÁHÎö$ýj‹J3’9—5¢ ²Š@ER¢ˆe<Îùþ±«T¼•%4¿ÑIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/copy_cursor.png000066400000000000000000000024551511343406000251370ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsnnÌÄ^tEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•± IDATX…í–OhWÇ?ovö͘1&KÉa\¡ö  .bi.ÅCrè"xŒۃЃPAK=饅–Š¡EO-XZj‹‡R¤*„`Š ”žÂâAR7Ò®¨Û®›¸‰³oþýzØl´š5¦Ù¶?ðƒá½7ï÷÷ûó^ð‚gEÑ>cÌ/a>ð†aÝó§ïû¿-..~zèÐ!PëñÑöeÙ""¿NLL¤¦§§U&“a÷îÝŒÑÛÛËèèh|ëÖ­/¶oßþ.à²!O:ï‰ãøÃ$I’={öH>Ÿ—½{÷J±X”]»vÉÎ;åìÙ³rÿþýúÞtÇœAðjE ‘(Šd``@¤¿¿_NŸ>-ÙlV²Ù¬?~\DDÂ0ŒÊåòÇ@šu†cÌSSSÑ‘#G$Š"qG´Ö¢µ–|>/étZlÛÛ¶¥··WŽ;&I’$—.]zXwN`Œ™?zô¨OWË+ù[)alšÙ\²K_Ó¢]»ßï ðe¡P=wîœ5;;ËÉ“'“ñññóÀ›+9[i³ð5ÐÇ£6›A1P,­CkM&“¡Z­¢uûN½’¡YÇÕ%{ºaší` €RŠM›6aY@Yš÷1 ±¦®ÕŽT*õ™eYoi­—çyʶmúûûéééQžç½|Ðh4ì8Ž?¢™+ëÇqœŸ>,a.[ÇÒºÐ7ÆÈÐÐPœR9@5 îܹƒˆ ”Âó<º»»¹{÷.I’ T3ßã8¦ÑhÀRrwB€Ôìì,/^l(E.—cxx˜z½N±X¤Z­¢”BD¨ÕjŠ5ÜÏÃÛZëšÖzAk½`YV¸ÿþÄ#ׯ_—B¡X–¶æÇùدñõðy™ 6A°1I’o•R—«$Iò]kÞÓüØImižJÂ'‰gffÔ©S§˜››£T*)Ýÿ C®ëÞp]·ìºîm×ugh6ªÿE'~V_ðoñQ , 4’IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/crosshair_cursor.png000066400000000000000000000017311511343406000261560ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±¶IDATX…í—OkAƳ܈JQPõàM=h½Ô›Ç‚GÛ¯àEh/Þ{ð¥ÀCOÓB ~‡Ð‚ÿÐ4ÕBƒ¶Y»›}=ì&ÆMw·µ½ø\&™wß™ç}ß™gfù¡ú~Ëq ’ žçÝ5Mó pIDB×u_޽ôQˆ¤…r]÷}­V VVV¤R©„aÊòòò @Ž€²Â™™™¢hEDdii©\̬¾U€5ÌÐl6¯c{¦,d!ø}6p&Çx™†F'"*¶e^™7þ8uýÛJ ´Ãp˜í°Å(m„ ú¾¿')1(Di†¡nµZω³—y¨N§S®ÕjRm£ ÓÓÓi\˜œœdnn.4 ãðøˆ(Ïó ÛÛÛjuu5Õ`ýH룔B)ew€}àPAdÖð#à2àзNÌz½¾˜º˜9×€ˆH½^ÿ<n\ ãã㋳³³®Öú¶ïû…Qô‹ÅâÔ`ßÚÚÚëÍÍÍ]¥T˜ä§µËåò[à'Љˆ´Z­óóóà päcÕ,‹Sq={[[[;¥R©JT[ÄØ>Äm@xìjI»Á°m›BáO¢ÇqWÀgÀKðÀ'ow;­Ø ‰R³7brœíp§g°,«|ÄÛk‰¿ÄÈêÿ3±K@w ôg FÛ3Ý ‡ÞpÃ`Ž‚\,Ë:] %8Y§–ß÷ÛçlÛÆ4#¹h6›mNâQÖ×ןµÛí­uX­V?Z–õ¸GŽÇIÖ[¬ \îéù"qùT ø—p¸\%ŠøøO¾OÆRäyËD’\ :3tLÂ#£LÈû˜ì¿?¦QÑDüw¢¢TSëòºIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_accordion.css000066400000000000000000000024611511343406000254020ustar00rootroot00000000000000@import url("resource://css_accordion/reset.css"); * { transition-property: color, background-color, border-color, background-image, padding, border-width; transition-duration: 1s; font: 20px Cantarell; } 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, linear-gradient(333deg, #222, #222 5px, transparent 5px) 10px 10px, linear-gradient(90deg, #1b1b1b, #1b1b1b 10px, transparent 10px), linear-gradient(#1d1d1d, #1d1d1d 25%, #1a1a1a 25%, #1a1a1a 50%, transparent 50%, transparent 75%, #242424 75%, #242424); background-color: #131313; background-size: 20px 20px; } button { color: black; background-color: #bbb; border-style: solid; border-width: 2px 0 2px 2px; border-color: #333; padding: 12px 4px; } button:first-child { border-radius: 5px 0 0 5px; } button:last-child { border-radius: 0 5px 5px 0; border-width: 2px; } button:hover { padding: 12px 48px; background-color: #4870bc; } button *:hover { color: white; } button:hover:active, button:active { background-color: #993401; } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_accordion.rb000066400000000000000000000025541511343406000252200ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Theming/CSS Accordion A simple accordion demo written using CSS transitions and multiple backgrounds =end class CssAccordionDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "CSS Accordion" @window.set_default_size(600, 300) container = Gtk::Box.new(:horizontal, 0) container.halign = :center container.valign = :center @window.add(container) %w(This Is A CSS Accordion :-).each do |label| child = Gtk::Button.new(:label => label) container.add(child) end provider = Gtk::CssProvider.new provider.load_from_resource("/css_accordion/css_accordion.css") style_context = @window.style_context style_context.add_provider(provider, Gtk::StyleProvider::PRIORITY_USER) apply_style(@window, provider) end def run if !@window.visible? @window.show_all else @window.destroy end @window end def apply_style(widget, provider) style_context = widget.style_context style_context.add_provider(provider, Gtk::StyleProvider::PRIORITY_USER) return unless widget.respond_to?(:children) widget.children.each do |child| apply_style(child, provider) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_basics.css000066400000000000000000000010451511343406000247020ustar00rootroot00000000000000/* You can edit the text in this window to change the * appearance of this Window. * Be careful, if you screw it up, nothing might be visible * anymore. :) */ /* This CSS resets all properties to their defaults values * and overrides all user settings and the theme in use */ @import url("resource://css_basics/reset.css"); /* Set a very futuristic style by default */ * { color: green; font-family: Monospace; border: 1px solid; } /* Make sure selections are visible */ selection { background-color: darkGreen; color: black; } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_basics.rb000066400000000000000000000051071511343406000245200ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = 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. =end class CssBasicsDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.title = "CSS Basics" @window.transient_for = main_window @window.set_default_size(400, 300) @default_css = Gio::Resources.lookup_data("/css_basics/css_basics.css", 0).to_s initialize_text_buffer container = Gtk::ScrolledWindow.new @window.add(container) child = Gtk::TextView.new(@text) container.add(child) initialize_provider apply_style(@window, @provider) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def apply_style(widget, provider) style_context = widget.style_context style_context.add_provider(provider, Gtk::StyleProvider::PRIORITY_USER) return unless widget.respond_to?(:children) widget.children.each do |child| apply_style(child, provider) end end def initialize_text_buffer @text = Gtk::TextBuffer.new @text.create_tag("warning", "underline" => :single) @text.create_tag("error", "underline" => :error) @text.text = @default_css text_buffer_signal_connect_changed end def text_buffer_signal_connect_changed @text.signal_connect "changed" do |buffer| buffer.remove_all_tags(buffer.start_iter, buffer.end_iter) modified_text = buffer.get_text(buffer.start_iter, buffer.end_iter, false) begin @provider.load_from_data(modified_text) rescue @provider.load_from_data(@default_css) end Gtk::StyleContext.reset_widgets end end def initialize_provider @provider = Gtk::CssProvider.new @provider.load_from_data(@default_css) provider_signal_connect_parsing_error end def provider_signal_connect_parsing_error @provider.signal_connect "parsing-error" do |_css_provider, section, error| start_i = @text.get_iter_at(:line => section.start_line, :index => section.start_position) end_i = @text.get_iter_at(:line => section.end_line, :index => section.end_position) tag = error == Gtk::CssProviderError::DEPRECATED ? "warning" : "error" @text.apply_tag_by_name(tag, start_i, end_i) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_blendmodes.css000066400000000000000000000034351511343406000255570ustar00rootroot00000000000000/* * First page. */ image.duck { background-image: url('resource://css_blendmodes/ducky.png'); background-size: cover; min-width: 200px; min-height: 200px; } image.gradient { background-image: linear-gradient(to right, red 0%%, green 50%%, blue 100%%); min-width: 200px; min-height: 200px; } /* * Second page. */ image.red { background: url('resource://css_blendmodes/blends.png') top center; min-width: 200px; min-height: 200px; } image.blue { background: url('resource://css_blendmodes/blends.png') bottom center; min-width: 200px; min-height: 200px; } /* * Third page. */ image.cyan { background: url('resource://css_blendmodes/cmy.jpg') top center; min-width: 200px; min-height: 200px; } image.magenta { background: url('resource://css_blendmodes/cmy.jpg') center center; min-width: 200px; min-height: 200px; } image.yellow { background: url('resource://css_blendmodes/cmy.jpg') bottom center; min-width: 200px; min-height: 200px; } image.blend0 { background-image: url('resource://css_blendmodes/ducky.png'), linear-gradient(to right, red 0%%, green 50%%, blue 100%%); background-size: cover; background-blend-mode: %s; min-width: 200px; min-height: 200px; } image.blend1 { background: url('resource://css_blendmodes/blends.png') top center, url('resource://css_blendmodes/blends.png') bottom center; background-blend-mode: %s; min-width: 200px; min-height: 200px; } image.blend2 { background: url('resource://css_blendmodes/cmy.jpg') top center, url('resource://css_blendmodes/cmy.jpg') center center, url('resource://css_blendmodes/cmy.jpg') bottom center; background-blend-mode: %s; min-width: 200px; min-height: 200px; } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_blendmodes.rb000066400000000000000000000054161511343406000253730ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Theming/CSS Blend Modes You can blend multiple backgrounds using the CSS blend modes available. =end BlendMode = Struct.new(:name, :id) class CssBlendmodesDemo def initialize(main_window) @builder = Gtk::Builder.new(:resource => "/css_blendmodes/blendmodes.ui") @window = @builder["window"] @window.transient_for = main_window # Setup the CSS provider for window @provider = Gtk::CssProvider.new Gtk::StyleContext.add_provider_for_screen(Gdk::Screen.default, @provider, Gtk::StyleProvider::PRIORITY_APPLICATION) initialize_blend_modes setup_listbox end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_blend_modes @blend_modes = [] @blend_modes << BlendMode.new("Color", "color") @blend_modes << BlendMode.new("Color (burn)", "color-burn") @blend_modes << BlendMode.new("Color (dodge)", "color-dodge") @blend_modes << BlendMode.new("Darken", "darken") @blend_modes << BlendMode.new("Difference", "difference") @blend_modes << BlendMode.new("Exclusion", "exclusion") @blend_modes << BlendMode.new("Hard Light", "hard-light") @blend_modes << BlendMode.new("Hue", "hue") @blend_modes << BlendMode.new("Lighten", "lighten") @blend_modes << BlendMode.new("Luminosity", "luminosity") @blend_modes << BlendMode.new("Multiply", "multiply") @blend_modes << BlendMode.new("Normal", "normal") @blend_modes << BlendMode.new("Overlay", "overlay") @blend_modes << BlendMode.new("Saturate", "saturate") @blend_modes << BlendMode.new("Screen", "screen") @blend_modes << BlendMode.new("Soft Light", "soft-light") end def setup_listbox normal_row = nil listbox = Gtk::ListBox.new @builder["scrolledwindow"].add(listbox) listbox.signal_connect "row-activated" do |_widget, w_row, _provider| blend_mode = @blend_modes[w_row.index].id update_css_for_blend_mode(blend_mode) end @blend_modes.each do |blend_mode| row = Gtk::ListBoxRow.new label = Gtk::Label.new(blend_mode.name) label.xalign = 0 row.add(label) listbox.add(row) normal_row = row if blend_mode.id == "normal" end # select the "normal" row listbox.select_row(normal_row) normal_row.signal_emit("activate") normal_row.grab_focus end def update_css_for_blend_mode(blend_mode) raw_css = Gio::Resources.lookup_data("/css_blendmodes/css_blendmodes.css", 0) css = format(raw_css, blend_mode, blend_mode, blend_mode) @provider.load_from_data(css) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_multiplebgs.css000066400000000000000000000133031511343406000257650ustar00rootroot00000000000000/* You can edit the text in this window to change the * appearance of this Window. * Be careful, if you screw it up, nothing might be visible * anymore. :) */ /* This CSS resets all properties to their defaults values * and overrides all user settings and the theme in use */ @import url("resource://css_multiplebgs/reset.css"); @import url("resource://css_multiplebgs/cssview.css"); #canvas { transition-property: background-color, background-image; transition-duration: 0.5s; background-color: #4870bc; } /* The gradients below are adapted versions of Lea Verou's CSS3 patterns, * licensed under the MIT license: * Copyright (c) 2011 Lea Verou, http://lea.verou.me/ * * See https://github.com/LeaVerou/CSS3-Patterns-Gallery */ /********** * Bricks * **********/ /* @define-color brick_hi #d42; @define-color brick_lo #b42; @define-color brick_hi_backdrop #888; @define-color brick_lo_backdrop #999; #canvas { background-color: #999; background-image: linear-gradient(205deg, @brick_lo, @brick_lo 23px, transparent 23px), linear-gradient(25deg, @brick_hi, @brick_hi 23px, transparent 23px), linear-gradient(205deg, @brick_lo, @brick_lo 23px, transparent 23px), linear-gradient(25deg, @brick_hi, @brick_hi 23px, transparent 23px); background-size: 58px 58px; background-position: 0px 6px, 4px 31px, 29px 35px, 34px 2px; } #canvas:backdrop { background-color: #444; background-image: linear-gradient(205deg, @brick_lo_backdrop, @brick_lo_backdrop 23px, transparent 23px), linear-gradient(25deg, @brick_hi_backdrop, @brick_hi_backdrop 23px, transparent 23px), linear-gradient(205deg, @brick_lo_backdrop, @brick_lo_backdrop 23px, transparent 23px), linear-gradient(25deg, @brick_hi_backdrop, @brick_hi_backdrop 23px, transparent 23px); background-size: 58px 58px; background-position: 0px 6px, 4px 31px, 29px 35px, 34px 2px; } */ /* #bricks-button { background-color: #eef; background-image: -gtk-scaled(url('resource:///css_multiplebgs/brick.png'),url('resource:///css_multiplebgs/brick2.png')); background-repeat: no-repeat; background-position: center; } */ /********** * Tartan * **********/ /* @define-color tartan_bg #662e2c; @define-color tartan_bg_backdrop #333; #canvas { background-color: @tartan_bg; background-image: repeating-linear-gradient(transparent, transparent 50px, rgba(0,0,0,.4) 50px, rgba(0,0,0,.4) 53px, transparent 53px, transparent 63px, rgba(0,0,0,.4) 63px, rgba(0,0,0,.4) 66px, transparent 66px, transparent 116px, rgba(0,0,0,.5) 116px, rgba(0,0,0,.5) 166px, rgba(255,255,255,.2) 166px, rgba(255,255,255,.2) 169px, rgba(0,0,0,.5) 169px, rgba(0,0,0,.5) 179px, rgba(255,255,255,.2) 179px, rgba(255,255,255,.2) 182px, rgba(0,0,0,.5) 182px, rgba(0,0,0,.5) 232px, transparent 232px), repeating-linear-gradient(90deg, transparent, transparent 50px, rgba(0,0,0,.4) 50px, rgba(0,0,0,.4) 53px, transparent 53px, transparent 63px, rgba(0,0,0,.4) 63px, rgba(0,0,0,.4) 66px, transparent 66px, transparent 116px, rgba(0,0,0,.5) 116px, rgba(0,0,0,.5) 166px, rgba(255,255,255,.2) 166px, rgba(255,255,255,.2) 169px, rgba(0,0,0,.5) 169px, rgba(0,0,0,.5) 179px, rgba(255,255,255,.2) 179px, rgba(255,255,255,.2) 182px, rgba(0,0,0,.5) 182px, rgba(0,0,0,.5) 232px, transparent 232px), repeating-linear-gradient(-55deg, transparent, transparent 1px, rgba(0,0,0,.2) 1px, rgba(0,0,0,.2) 4px, transparent 4px, transparent 19px, rgba(0,0,0,.2) 19px, rgba(0,0,0,.2) 24px, transparent 24px, transparent 51px, rgba(0,0,0,.2) 51px, rgba(0,0,0,.2) 54px, transparent 54px, transparent 74px); } #canvas:backdrop { background-color: @tartan_bg_backdrop; } */ /*********** * Stripes * ***********/ /* @define-color base_bg #4870bc; @define-color backdrop_bg #555; #canvas { background-color: @base_bg; background-image: linear-gradient(to left, transparent, rgba(255,255,255,.07) 50%, transparent 50%), linear-gradient(to left, transparent, rgba(255,255,255,.13) 50%, transparent 50%), linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.17) 50%), linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.19) 50%); background-size: 29px, 59px, 73px, 109px; } #canvas:backdrop { background-color: @backdrop_bg; } */ /*************** * Lined Paper * ***************/ /* #canvas { background-color: #fff; background-image: linear-gradient(90deg, transparent 79px, alpha(#f98195, 0.40) 79px, #f98195 80px, alpha(#f98195, 0.40) 81px, transparent 81px), linear-gradient(alpha(#77c5cf, 0.60), alpha(#77c5cf, 0.60) 1px, transparent 1px); background-size: 100% 36px; } #canvas:backdrop { background-color: #f1f2f4; background-image: linear-gradient(90deg, transparent 79px, alpha(#999, 0.40) 79px, #999 80px, alpha(#999, 0.40) 81px, transparent 81px), linear-gradient(alpha(#bbb, 0.60), alpha(#bbb, 0.60) 1px, transparent 1px); } */ ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_multiplebgs.rb000066400000000000000000000075411511343406000256070ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = 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. =end class CssMultiplebgsDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Mutiple Backgrounds" @window.transient_for = main_window @window.set_default_size(400, 300) container = Gtk::Overlay.new container.add_events([:enter_notify_mask, :leave_notify_mask, :pointer_motion_mask]) @window.add(container) da = initialize_drawing_area container.add(da) button = initialize_bricks_button container.add_overlay(button) paned = Gtk::Paned.new(:vertical) container.add_overlay(paned) css = "/css_multiplebgs/css_multiplebgs.css" @default_css = Gio::Resources.lookup_data(css) # Need a filler so we get a handle child = Gtk::Box.new(:vertical, 0) paned.add(child) initialize_text_buffer container = Gtk::ScrolledWindow.new paned.add(container) child = Gtk::TextView.new(@text) container.add(child) initialize_provider apply_style(@window, @provider) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def apply_style(widget, provider) style_context = widget.style_context style_context.add_provider(provider, Gtk::StyleProvider::PRIORITY_USER) return unless widget.respond_to?(:children) widget.children.each do |child| apply_style(child, provider) end end def initialize_drawing_area da = Gtk::DrawingArea.new da.name = "canvas" da.signal_connect "draw" do |widget, cr| context = widget.style_context Gtk.render_background(context, cr, 0, 0, widget.allocated_width, widget.allocated_height) Gtk.render_frame(context, cr, 0, 0, widget.allocated_width, widget.allocated_height) false end da end def initialize_bricks_button button = Gtk::Button.new button.add_events([:enter_notify_mask, :leave_notify_mask, :pointer_motion_mask]) button.name = "bricks-button" button.halign = :center button.valign = :center button.set_size_request(250, 84) button end def initialize_text_buffer @text = Gtk::TextBuffer.new @text.create_tag("warning", "underline" => :single) @text.create_tag("error", "underline" => :error) @text.text = @default_css text_buffer_signal_connect_changed end def text_buffer_signal_connect_changed @text.signal_connect "changed" do |buffer| buffer.remove_all_tags(buffer.start_iter, buffer.end_iter) modified_text = buffer.get_text(buffer.start_iter, buffer.end_iter, false) begin @provider.load_from_data(modified_text) rescue @provider.load_from_data(@default_css) end Gtk::StyleContext.reset_widgets end end def initialize_provider @provider = Gtk::CssProvider.new @provider.load_from_data(@default_css) provider_signal_connect_parsing_error end def provider_signal_connect_parsing_error @provider.signal_connect "parsing-error" do |_css_provider, section, error| start_i = @text.get_iter_at(:line => section.start_line, :index => section.start_position) end_i = @text.get_iter_at(:line => section.end_line, :index => section.end_position) tag = error == Gtk::CssProviderError::DEPRECATED ? "warning" : "error" @text.apply_tag_by_name(tag, start_i, end_i) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_pixbufs.css000066400000000000000000000156171511343406000251300ustar00rootroot00000000000000/* You can edit the text in this window to change the * appearance of this Window. * Be careful, if you screw it up, nothing might be visible * anymore. :) */ /* This CSS resets all properties to their defaults values * and overrides all user settings and the theme in use */ @import url("resource://css_pixbufs/reset.css"); @import url("resource://css_pixbufs/cssview.css"); @keyframes move-the-image { 0% { background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%; } 3.125% { background-position: 55.19% 76.11%, 72.14% 64.79%, 76.11% 44.81%, 64.79% 27.86%, 44.81% 23.89%, 27.86% 35.21%, 23.89% 55.19%, 35.21% 72.14%, 0% 0%; } 6.25% { background-position: 60.79% 76.04%, 76.04% 60.79%, 76.04% 39.21%, 60.79% 23.96%, 39.21% 23.96%, 23.96% 39.21%, 23.96% 60.79%, 39.21% 76.04%, 0% 0%; } 9.375% { background-position: 66.46% 74.64%, 79.06% 55.78%, 74.64% 33.54%, 55.78% 20.94%, 33.54% 25.36%, 20.94% 44.22%, 25.36% 66.46%, 44.22% 79.06%, 0% 0%; } 12.5% { background-position: 71.84% 71.84%, 80.89% 50.00%, 71.84% 28.16%, 50.00% 19.11%, 28.16% 28.16%, 19.11% 50.00%, 28.16% 71.84%, 50.00% 80.89%, 0% 0%; } 15.625% { background-position: 76.55% 67.74%, 81.32% 43.77%, 67.74% 23.45%, 43.77% 18.68%, 23.45% 32.26%, 18.68% 56.23%, 32.26% 76.55%, 56.23% 81.32%, 0% 0%; } 18.75% { background-position: 80.21% 62.51%, 80.21% 37.49%, 62.51% 19.79%, 37.49% 19.79%, 19.79% 37.49%, 19.79% 62.51%, 37.49% 80.21%, 62.51% 80.21%, 0% 0%; } 21.875% { background-position: 82.54% 56.47%, 77.58% 31.57%, 56.47% 17.46%, 31.57% 22.42%, 17.46% 43.53%, 22.42% 68.43%, 43.53% 82.54%, 68.43% 77.58%, 0% 0%; } 25% { background-position: 83.33% 50.00%, 73.57% 26.43%, 50.00% 16.67%, 26.43% 26.43%, 16.67% 50.00%, 26.43% 73.57%, 50.00% 83.33%, 73.57% 73.57%, 0% 0%; } 28.125% { background-position: 82.54% 43.53%, 68.43% 22.42%, 43.53% 17.46%, 22.42% 31.57%, 17.46% 56.47%, 31.57% 77.58%, 56.47% 82.54%, 77.58% 68.43%, 0% 0%; } 31.25% { background-position: 80.21% 37.49%, 62.51% 19.79%, 37.49% 19.79%, 19.79% 37.49%, 19.79% 62.51%, 37.49% 80.21%, 62.51% 80.21%, 80.21% 62.51%, 0% 0%; } 34.375% { background-position: 76.55% 32.26%, 56.23% 18.68%, 32.26% 23.45%, 18.68% 43.77%, 23.45% 67.74%, 43.77% 81.32%, 67.74% 76.55%, 81.32% 56.23%, 0% 0%; } 37.5% { background-position: 71.84% 28.16%, 50.00% 19.11%, 28.16% 28.16%, 19.11% 50.00%, 28.16% 71.84%, 50.00% 80.89%, 71.84% 71.84%, 80.89% 50.00%, 0% 0%; } 40.625% { background-position: 66.46% 25.36%, 44.22% 20.94%, 25.36% 33.54%, 20.94% 55.78%, 33.54% 74.64%, 55.78% 79.06%, 74.64% 66.46%, 79.06% 44.22%, 0% 0%; } 43.75% { background-position: 60.79% 23.96%, 39.21% 23.96%, 23.96% 39.21%, 23.96% 60.79%, 39.21% 76.04%, 60.79% 76.04%, 76.04% 60.79%, 76.04% 39.21%, 0% 0%; } 46.875% { background-position: 55.19% 23.89%, 35.21% 27.86%, 23.89% 44.81%, 27.86% 64.79%, 44.81% 76.11%, 64.79% 72.14%, 76.11% 55.19%, 72.14% 35.21%, 0% 0%; } 50% { background-position: 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 0% 0%; } 53.125% { background-position: 45.44% 27.07%, 30.57% 37.01%, 27.07% 54.56%, 37.01% 69.43%, 54.56% 72.93%, 69.43% 62.99%, 72.93% 45.44%, 62.99% 30.57%, 0% 0%; } 56.25% { background-position: 41.65% 29.85%, 29.85% 41.65%, 29.85% 58.35%, 41.65% 70.15%, 58.35% 70.15%, 70.15% 58.35%, 70.15% 41.65%, 58.35% 29.85%, 0% 0%; } 59.375% { background-position: 38.68% 33.06%, 30.02% 46.03%, 33.06% 61.32%, 46.03% 69.98%, 61.32% 66.94%, 69.98% 53.97%, 66.94% 38.68%, 53.97% 30.02%, 0% 0%; } 62.5% { background-position: 36.49% 36.49%, 30.89% 50.00%, 36.49% 63.51%, 50.00% 69.11%, 63.51% 63.51%, 69.11% 50.00%, 63.51% 36.49%, 50.00% 30.89%, 0% 0%; } 65.625% { background-position: 34.97% 39.96%, 32.28% 53.53%, 39.96% 65.03%, 53.53% 67.72%, 65.03% 60.04%, 67.72% 46.47%, 60.04% 34.97%, 46.47% 32.28%, 0% 0%; } 68.75% { background-position: 34.02% 43.38%, 34.02% 56.62%, 43.38% 65.98%, 56.62% 65.98%, 65.98% 56.62%, 65.98% 43.38%, 56.62% 34.02%, 43.38% 34.02%, 0% 0%; } 71.875% { background-position: 33.50% 46.72%, 36.01% 59.35%, 46.72% 66.50%, 59.35% 63.99%, 66.50% 53.28%, 63.99% 40.65%, 53.28% 33.50%, 40.65% 36.01%, 0% 0%; } 75% { background-position: 33.33% 50.00%, 38.21% 61.79%, 50.00% 66.67%, 61.79% 61.79%, 66.67% 50.00%, 61.79% 38.21%, 50.00% 33.33%, 38.21% 38.21%, 0% 0%; } 78.125% { background-position: 33.50% 53.28%, 40.65% 63.99%, 53.28% 66.50%, 63.99% 59.35%, 66.50% 46.72%, 59.35% 36.01%, 46.72% 33.50%, 36.01% 40.65%, 0% 0%; } 81.25% { background-position: 34.02% 56.62%, 43.38% 65.98%, 56.62% 65.98%, 65.98% 56.62%, 65.98% 43.38%, 56.62% 34.02%, 43.38% 34.02%, 34.02% 43.38%, 0% 0%; } 84.375% { background-position: 34.97% 60.04%, 46.47% 67.72%, 60.04% 65.03%, 67.72% 53.53%, 65.03% 39.96%, 53.53% 32.28%, 39.96% 34.97%, 32.28% 46.47%, 0% 0%; } 87.5% { background-position: 36.49% 63.51%, 50.00% 69.11%, 63.51% 63.51%, 69.11% 50.00%, 63.51% 36.49%, 50.00% 30.89%, 36.49% 36.49%, 30.89% 50.00%, 0% 0%; } 90.625% { background-position: 38.68% 66.94%, 53.97% 69.98%, 66.94% 61.32%, 69.98% 46.03%, 61.32% 33.06%, 46.03% 30.02%, 33.06% 38.68%, 30.02% 53.97%, 0% 0%; } 93.75% { background-position: 41.65% 70.15%, 58.35% 70.15%, 70.15% 58.35%, 70.15% 41.65%, 58.35% 29.85%, 41.65% 29.85%, 29.85% 41.65%, 29.85% 58.35%, 0% 0%; } 96.875% { background-position: 45.44% 72.93%, 62.99% 69.43%, 72.93% 54.56%, 69.43% 37.01%, 54.56% 27.07%, 37.01% 30.57%, 27.07% 45.44%, 30.57% 62.99%, 0% 0%; } 100% { background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%; } } @keyframes size-the-image { 0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, auto } 100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto } } window { background-image: url("resource://css_pixbufs/apple-red.png"), url("resource://css_pixbufs/gnome-applets.png"), url("resource://css_pixbufs/gnome-calendar.png"), url("resource://css_pixbufs/gnome-foot.png"), url("resource://css_pixbufs/gnome-gmush.png"), url("resource://css_pixbufs/gnome-gimp.png"), url("resource://css_pixbufs/gnome-gsame.png"), url("resource://css_pixbufs/gnu-keys.png"), url("resource://css_pixbufs/background.jpg"); background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%; background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat; animation: move-the-image infinite linear 3s, size-the-image infinite alternate ease-in-out 0.75s; } /* Make the text editor has a nice style */ .view, scrollbar, separator { color: black; background-color: rgba(255,255,255,0.5); } .view:selected { background-color: rgba(127,127,255,0.5); } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_pixbufs.rb000066400000000000000000000053171511343406000247370ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = 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. =end class CssPixbufsDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.title = "Animated Backgrounds" @window.transient_for = main_window @window.set_default_size(400, 300) @default_css = Gio::Resources.lookup_data("/css_pixbufs/gtk.css", 0).to_s initialize_text_buffer initialize_provider paned = Gtk::Paned.new(:vertical) @window.add(paned) child = Gtk::Box.new(:vertical, 0) paned.add(child) container = Gtk::ScrolledWindow.new paned.add(container) child = Gtk::TextView.new(@text) container.add(child) apply_style(@window, @provider) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def apply_style(widget, provider) style_context = widget.style_context style_context.add_provider(provider, Gtk::StyleProvider::PRIORITY_USER) return unless widget.respond_to?(:children) widget.children.each do |child| apply_style(child, provider) end end def initialize_text_buffer @text = Gtk::TextBuffer.new @text.create_tag("warning", "underline" => :single) @text.create_tag("error", "underline" => :error) @text.text = @default_css text_buffer_signal_connect_changed end def text_buffer_signal_connect_changed @text.signal_connect "changed" do |buffer| buffer.remove_all_tags(buffer.start_iter, buffer.end_iter) modified_text = buffer.get_text(buffer.start_iter, buffer.end_iter, false) begin @provider.load_from_data(modified_text) rescue @provider.load_from_data(@default_css) end Gtk::StyleContext.reset_widgets end end def initialize_provider @provider = Gtk::CssProvider.new @provider.load_from_data(@default_css) provider_signal_connect_parsing_error end def provider_signal_connect_parsing_error @provider.signal_connect "parsing-error" do |_css_provider, section, error| start_i = @text.get_iter_at(:line => section.start_line, :index => section.start_position) end_i = @text.get_iter_at(:line => section.end_line, :index => section.end_position) tag = error == Gtk::CssProviderError::DEPRECATED ? "warning" : "error" @text.apply_tag_by_name(tag, start_i, end_i) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_shadows.css000066400000000000000000000026201511343406000251060ustar00rootroot00000000000000/* You can edit the text in this window to change the * appearance of this Window. * Be careful, if you screw it up, nothing might be visible * anymore. :) */ /* This CSS resets all properties to their defaults values * and overrides all user settings and the theme in use */ @import url("resource://css_shadows/reset.css"); @import url("resource://css_shadows/cssview.css"); /* Get a nice background for the window */ .background { background-color: #4870bc; background-image: linear-gradient(to left, transparent, rgba(255,255,255,.07) 50%, transparent 50%), linear-gradient(to left, transparent, rgba(255,255,255,.13) 50%, transparent 50%), linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.17) 50%), linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.19) 50%); background-size: 29px, 59px, 73px, 109px; } button { color: black; padding: 10px; border-radius: 5px; transition: all 250ms ease-in; border: 1px transparent solid; } button:hover { text-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 { padding: 11px 9px 9px 11px; text-shadow: 1px 1px 2.5px alpha(black, 0.6); -gtk-icon-shadow: 1px 1px 2.5px alpha(black, 0.6); } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/css_shadows.rb000066400000000000000000000057501511343406000247300ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Theming/Shadows This demo shows how to use CSS shadows. =end class CssShadowsDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.title = "Shadows" @window.transient_for = main_window @window.set_default_size(400, 300) paned = Gtk::Paned.new(:vertical) @window.add(paned) child = create_toolbar paned.add(child) @default_css = Gio::Resources.lookup_data("/css_shadows/gtk.css") initialize_text_buffer initialize_provider container = Gtk::ScrolledWindow.new paned.add(container) child = Gtk::TextView.new(@text) container.add(child) apply_style(@window, @provider) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_toolbar toolbar = Gtk::Toolbar.new toolbar.set_valign(:center) item = Gtk::ToolButton.new item.set_icon_name("go-next") toolbar.insert(item, -1) item = Gtk::ToolButton.new item.set_icon_name("go-previous") toolbar.insert(item, -1) item = Gtk::ToolButton.new(:label => "Hello World") item.set_is_important(true) toolbar.insert(item, -1) toolbar end def apply_style(widget, provider) style_context = widget.style_context style_context.add_provider(provider, Gtk::StyleProvider::PRIORITY_USER) return unless widget.respond_to?(:children) widget.children.each do |child| apply_style(child, provider) end end def initialize_text_buffer @text = Gtk::TextBuffer.new @text.create_tag("warning", "underline" => :single) @text.create_tag("error", "underline" => :error) @text.text = @default_css text_buffer_signal_connect_changed end def text_buffer_signal_connect_changed @text.signal_connect "changed" do |buffer| buffer.remove_all_tags(buffer.start_iter, buffer.end_iter) modified_text = buffer.get_text(buffer.start_iter, buffer.end_iter, false) begin @provider.load_from_data(modified_text) rescue @provider.load_from_data(@default_css) end Gtk::StyleContext.reset_widgets end end def initialize_provider @provider = Gtk::CssProvider.new @provider.load_from_data(@default_css) provider_signal_connect_parsing_error end def provider_signal_connect_parsing_error @provider.signal_connect "parsing-error" do |_css_provider, section, error| start_i = @text.get_iter_at(:line => section.start_line, :index => section.start_position) end_i = @text.get_iter_at(:line => section.end_line, :index => section.end_position) tag = error == Gtk::CssProviderError::DEPRECATED ? "warning" : "error" @text.apply_tag_by_name(tag, start_i, end_i) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/cssview.css000066400000000000000000000016121511343406000242510ustar00rootroot00000000000000/* Make the text editor has a nice style */ .view { color: #2e3436; font-family: Monospace; background-color: alpha(white, 0.30); } .view:selected { color: white; background-color: #4a90d9; } scrollbar trough, .scrollbars-junction { background-color: alpha(white, 0.80); } scrollbar slider { border-width: 3px; border-style: solid; border-radius: 10px; border-color: transparent; background-clip: padding-box; background-color: #999; } scrollbar slider:hover { background-color: #555; } 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; background-repeat: no-repeat; background-position: center; } paned separator:hover { background-image: linear-gradient(transparent, transparent 1px, #555 1px, #555 4px, transparent 4px); } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/cursors.rb000066400000000000000000000070341511343406000241050ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Cursors Demonstrates a useful set of available cursors. =end class CursorsDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Cursors" @window.set_default_size(500, 500) sw = Gtk::ScrolledWindow.new(nil, nil) sw.set_policy(:never, :automatic) @window.add(sw) initialize_box sw.add(@box) add_general_section add_link_and_status_section add_selection_section add_drag_and_drop_section add_resize_and_scrolling_section add_zoom_section end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_box @box = Gtk::Box.new(:vertical, 0) @box.margin_start = 20 @box.margin_end = 20 @box.margin_bottom = 20 end def add_general_section section = Section.new(@box, "General") %w(default none).each do |cursor_name| section.add_button(cursor_name) end end def add_link_and_status_section section = Section.new(@box, "Link & Status") %w(context-menu help pointer progress wait).each do |cursor_name| section.add_button(cursor_name) end end def add_selection_section section = Section.new(@box, "Selection") %w(cell crosshair text vertical-text).each do |cursor_name| section.add_button(cursor_name) end end def add_drag_and_drop_section section = Section.new(@box, "Drag & Drop") %w(alias copy move no-drop not-allowed grab grabbing).each do |cursor_name| section.add_button(cursor_name) end end def add_resize_and_scrolling_section section = Section.new(@box, "Resize & Scrolling") %w(all-scroll col-resize row-resize n-resize e-resize s-resize w-resize ne-resize nw-resize se-resize sw-resize ew-resize ns-resize nesw-resize nwse-resize).each do |cursor_name| section.add_button(cursor_name) end end def add_zoom_section section = Section.new(@box, "Zoom") %w(zoom-in zoom-out).each do |cursor_name| section.add_button(cursor_name) end end end class Section def initialize(container, title) label = Gtk::Label.new(title) label.xalign = 0 label.margin_top = 10 label.margin_bottom = 10 container.pack_start(label, :expand => false, :fill => true, :padding => 0) initialize_section container.pack_start(@section, :expand => false, :fill => true, :padding => 0) end def add_button(css_name) cursor = Gdk::Cursor.new(css_name) image = nil if !cursor image = Gtk::Image.new(:icon_name => "image-missing", :size => :menu) else path = "/cursors/#{css_name.tr('-', '_')}_cursor.png" image = Gtk::Image.new(:resource => path) end image.set_size_request(32, 32) button = Gtk::Button.new button.add(image) button.style_context.add_class("image-button") button.signal_connect("clicked") do |_widget| apply_cursor(cursor) end button.set_tooltip_text(css_name) @section.add(button) end private def initialize_section @section = Gtk::FlowBox.new @section.set_halign(:start) @section.set_selection_mode(:none) @section.set_min_children_per_line(2) @section.set_min_children_per_line(20) end def apply_cursor(cursor) toplevel = @section.toplevel window = toplevel.window window.set_cursor(cursor) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/000077500000000000000000000000001511343406000227655ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/16x16/000077500000000000000000000000001511343406000235525ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/16x16/gtk4-demo-symbolic.symbolic.png000066400000000000000000000005041511343406000315110ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆûIDAT8ÍÓ¿+ÅaÇñ—ëJ¹‰;*)nJYü·Ld±Éd±ý%ò/(É@Ê¢Œ”ÁfPRºJ~ ß#Ïýõum>uêé<çó>§óôÐ^ÃØÃ=ö1”S[§‘0>á3‰ç•ÚG£à¥ÁØu b˜K8Âlöc]irƒØE-§û1fdûY…BÊXÀ!¦cšT·XA5j·0‘ • /c7؉®wØÆ"º¿MEÍ*c g˜Ä86eKnR¡U2™6Ú™óëÿ.ñúß#øy…œb c9ÆÎq÷o¸X}ÉÝ®p"û+¿ªsq^“ýЖúÚJ6¶ã?õóIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/16x16/gtk4-demo.png000066400000000000000000000015521511343406000260560ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/ÇIDAT8u“MhTg†Ÿï›;3Þ™I†„QilÁEmÚd¡(]¨4h(¢ÁºÜ…@Ù´Š.²RDˆD7.J5( üYŒMµ&‘bI[’HÒ¤½™ÉäÎÿÜ{3ßç¦I'Æ8«ó¾ïùá¼h­©N@ Ç’Éäát&­Xò,+9w¶»»; ˆx­5}}}¦eY{æ3¹žL¡œp¼Jyt2]øñ׿Գñ´N$l¾;ÁÖÖÖu@=|ïâó-G~“s̤ٛIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/22x22/000077500000000000000000000000001511343406000235445ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/22x22/gtk4-demo-symbolic.symbolic.png000066400000000000000000000006651511343406000315130ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆlIDAT8íÔ1kQ†áÇD°ˆŠ„$‚¤ÚEÁn·°1ˆX ›¤ˆb™"Mìü –¦ ¶þÓ$M E¤‰… Xl§QaÅE¶Xcqï&³7;;“5e>¸Ì sÏ{¾9sÏ¡œ®` ¼Ádɸ\`Ÿq”Y­A\Àý˜®Þ¢R¼†—hóT{AãçÙõ )ôz¼Îáën_GÆ0neÁ5L ?ëFÜØ.]sRß –ð†2ðQÌ` /0½j†=<À,b žc¢³a( Æ]ÜÇ{Ôc’_ñ}3>ßÃ.E—wÒÌ—suÜ Þa«1I…ÒõT8ëþftÿJ¨ã3™OÎSZŠ<÷·ã}Wÿ<.À§À‡çÄk 3ãø¸5„TÓçl¨u|ςᶄ.ªâRI`B3+m6>â›b÷°×¥¼ÎKÝgõWB›øÝ'q¡Æœ ™§/ôõ–u¤¦Ö]IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/22x22/gtk4-demo.png000066400000000000000000000024011511343406000260420ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/^IDAT8•ÕmLSWðÿ¹÷Ò{o_h)ccÔŽñ2—f¤Ë:5Ù$€0‘%ŽA2‰KŒŸt˜˜e]–Åi šh`cY"Yü°-:…AD"#ââY|¬Âº…¶¼ÛÒööÞ¾œ}"ÈRÜ?¹ŸÎs~yžsNr ¥@!¦££#Ýb±”òjM¥ZT—D)QÛÇ|Œ}<(dëÁ‘˜œû¬&dúÃfµZOÄi›ƒÈÑ£GÕÕÕÕoŠ]… h*xž[ápû£÷œ!µ}ÜO<³J¢[¬&´Œ#/S‹*k–ÄB¸zywee倥4\QQ‘fÏÎΨ û‡¦È=§‡›–§”G’8Ü4tŽˆo¬4¾ZQRváþ¸«½íä6Bˆ@”‘$ÉÀi4ZÞÿ}ɨbƦCˆ?ž(iâ”âê=9tÆÎz™ª]ít8iÇÃÇ%6±j1=øû7gÓôÔ¤Í.‰¤ÄpvÀ™ÒwwJc~ÑTßÞÝv—‘e ñéix6l ÑoÁVjÂkyÆeAB€µ+ÓQ÷Ž™Ö׿ãõÕAz9ô xNÌ$z½>×ãv»E‘Ml6mBZK nNFhË•q²{wí ÌÌʰäó4C/’™Ø(½j%vå|1'8ÂcoÚí0!'èõޏ]°ÙÙ0vwÓYãsôØo.ÆšŸŽÕ¹ÍЈS¹Co‡Ûˆ]îF >µhŠÌ…ÃaŠGoxQb££˜.,$ºãÇé§Tãrƒ^—O“dA—ß¶¤þÉ0É©,C:xQhß{«ÉMé'D!/g./-æ ÝSÕrìÕ’”°$åºý ðÅ](Õ}†K&(4˜ff‘M|y9ø’°z= 7P ¬o§À ô Ê¥ÿn@v<q¸ V¨¨_\ ‰@>ò… àrr ºŠ#SK6[Ä­Èà^F°á¸ÿQ§‰W@Qñôi]°© ¾º:ÐH$Éá<Î é$RÙLlÔ~ŽùWØåžù5@ðÀ‘#F-kµÆžMÄs£Óÿ TŒ©õP3Æy8tøðá‹[wìxO޾ݩ;q"JTªÿ…Àé J?jõm1Y Ï2b|]]]¿¯ß¸±j² à¶¾¯OaÒÒž Ô2X/îŠïÖ_“ßRöMõžøasÙ–²àÂP«T*SOÏ¡5fóf_Y™ŠpÜ’ËcÀ"Ÿ/F!»M~·âÆ­[×[¾ký¹¹¹ù€)^PJ翹£QÈ=ÕÚúexbBžÙ¶£ú…ëyÚ4¹Ž^ô~õJ“Ê_÷ÿinnþ*++«À+2h¤`Ás8 0744ì•}>YŽ…èß³×¥‡ÁÉ@Oï¹ÎšššZk˜ðXdÞy^€ó2m6ÛûÃÃW÷‰¢¸@€gæ&ãæ¦$Oÿ±f é ;† IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/24x24/000077500000000000000000000000001511343406000235505ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/24x24/gtk4-demo-symbolic.symbolic.png000066400000000000000000000007211511343406000315100ustar00rootroot00000000000000‰PNG  IHDRàw=øsBIT|dˆˆIDATH‰íÔ¿KVQð–â’/´˜a‚† ‰A!Ñâ¬$äæàâ´ô´»6F4…(D´Dƒhà Ð ‰%þEH|u8Ç^¹{}ï›CC_x¸çÞsÎ÷{Ÿç|ŸCý¸„gXÂkt–Ø{&ñ8Öpt*~E¡[_Á$~dˆ³QZèj$^?ƒ8‡xƒ®<â¼ÀNIâTFC)JLµúäsx"¿‰ö8ÀrI⟂šbô¡.DÒ6ô  ˜jzS±WÆt`w…3üÞ”(ÓÃø|‰^|È!Ûx.Xù©Ð'm§e wpOðþcŒa;Î/eÂ1!Ç=EéŸd³,þt|çûðH°u.ЍeSÁ"Þ †x"SŠ<¤J”BEÍeÔù<ÆG`«çÄYżpñýîƒÁ盂ï/7H¾‚l|È6Ú&>¡[Í÷õ`³ø–Hur™löñY¸IS ЮТlªøŠØ+à¨×q#ŽGq­ÞÇR„l?’MlIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/24x24/gtk4-demo.png000066400000000000000000000025361511343406000260570ustar00rootroot00000000000000‰PNG  IHDRàw=øsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/»IDATH‰•–[LTW†¿}f˜ÃÌ0 —ÚRm”ÚÔ AšNÕ¤•„ŠÔX IÛhlb|ò–¨)i¬Æ  [š&Ƈ¶±JÑz%RjÔÆ ¤QÔbQK+*0£ —™9g.»ÌA@ú';Ùkýÿù÷YYk!¥d¬ˆð1Q ³œNç†n—»Þ§û{ïÞ½÷ŲeË^L€G„ÉBDH•'N$fffæ¨kÅlÉHaiyàVZÚÍéÓíEP›ñ¼ÕÓrób‡Ãqð!ù$aDY!öîÝk),,|ÓlµåGG[óUÕ8µÕÙ¸Õá±´´÷ W¿þ_ÒrG ÇÛ™™à G²×€~§ñÒ…õ€_JŠÄ…"++˺iíÚŽ@´Õ|îf·¸Õá2<èñ’Re´:(;uÇüƬ„9ùÙ¹¿Ükï<^}èÇb!DRJ^¯7ÎhµÆ¨} /'˜”=B#Ž‹”\ºå»¶¨m½ÊŠu65·¶¶nÍÊʲ !P\.—ÒõàÃÙ³EÊý?Ù±tºLŒð㟂Wr¬±#êÌnkêK)%Çk«oª iA¨§×¢E"ðmÅ9)¼63á™ÄBÀüY‰l|7U–¬Jãõ¹ƒò‚çT£9 ˆ€Ñn·Os9·f³!’½d ñrµË/^lO’¾7*ú52ÓT9Ån‚m²ÉS%ZôÓ¸ƒ…Êæøk>«jÅv ‡*t¾ÚZº22˜S[˶%ÓB¿u*Ž´DæÎ0Ê)¶8Ñ¡_—M¾jÑÒSË@¨{dò0#€Ï瓌V‚mmôÌ›'lû÷ËO?*ä¾~E6h‡EŠ7“š¾âñHG*<+@jÞ]»]zø¾·P\õþDm2Ü“x:ÁH´°M:Þ¹LTõ"* ƒˆ"϶Àê$ǶóåèrprŠ¢Œì!ÑѨyy¨ÙÙìvêJJ?q†TÞ‰ÝI³÷$­úùq"O4Ô>­VÌEEÄUT[Z ~?}[¶Ð_2D!è Þç¤{+vC y¶D+±ã:€® xޱ –—ãÞ¸é÷™0W¼‡ˆ5$±8æ3îh¿Ò¢Õ=å@ƒ;KK?dfº Gp²äôœêû“b%?¶‹2Ü”pkõìÙ³çì‡kÖ¼¯­^Ýa;p L¦ÿ%pÝ{”Vý«ìÕAM÷õþÈ?îšššß.^¼¢+=ýšýÌ]‰ŸqŒ2……æu¡õöËÚ[úöîúc?,Í]^ ŽžhÀb2™RÎÕÕíÎHM]êÎÍ5 £‘˜›—(íN¶Ž4õmæVjÓTWšš~Wõseeåe èƚŠ`f®ªúÒ÷ð¡öhåJ9pÉÏ;_”å] äÙÞ¯½Þ.ý¯{ÍÿTVV~•œœœ¼ $1@Tøù™hà›Ô²²²ÍšÛ­iAü»¿Áûx°k ®þô©¢¢¢U@ Ä*C ˆ`L'DT ©¸¸øƒÛ·›/îÛ·o»Ùl^Ìž ;5†]¹Y9Áh oÆ0‘%\ ^À¾ËÑ[Ähü ~iAâ¤ÂaIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/256x256/000077500000000000000000000000001511343406000237265ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/256x256/gtk4-demo-symbolic.symbolic.png000066400000000000000000000075411511343406000316750ustar00rootroot00000000000000‰PNG  IHDR\r¨fsBIT|dˆIDATxœíÝ]¬ewYÇñ/C;P©b,eŠ Sh)¥ZÚ2¥j©‚aÔ*oѤD.D ½ A.L01*—šx!ŠÆjzA¼jx™68Phi«U(´ÐÚRŠÌð6ÓN;ÌŒϬÌÌéœÕ}öZëÿ²þßOò\MöËœ}Öï<Ï­½þOEz¢Ÿ®®Înd}G’&÷,àýÀ÷#ÇÕ€¿~.Û;“4™3‰ÿ‡œx௭cH³ñlâ€ÞOÿ² øk`Kú·,i¨_ àGØØoHÛJ°2ìÀ_[ûŽ>ïYéþ+’–õâ=À¸¾A lðwÀA¦=ð× ‚çLÿ_”´ÖùÀuÀOH{àRFPÆ¿¶öAðóÓý×¥v½ø0p˜ü{_ Fƒ@Á+¨ãÀ_/ž;þDš¿×%ÿ<´à –vó8ð i®n"ÿš*ž7ÎMªÛàfò˜”Ðàòˆ¹ë1â´æ¶a?N©|Ov_"ÿWZuApöÊ?]©P›ˆÿvòh¥×㚉MÀ[€»È`ÕV]¼hÃ?u)³Sk€¯‘ÿ@ª½º xñ†>)ƒÍÄùœ¹•A bm~øù”¹Wç,õÉHzqà?@þ£µ:D|G PrÏÞ Ëj­v¿BãÜ>Ëj½v Ü“:eêØ ÍÀÛ?ÅÕ¶3§ç~©tÛgÝOþ䵬œµ—¸ÍüfàöY–uˆø–ê³i@·}Ö·Éÿƒ·¬Üup! pû,Ë:V÷g¹²yJÂ×zðŸÀY _S*Ñ?þ†¸e3Î>Aþ䵬ÕÍù[hÜ[€‡ÉÿXVªú4îOü>åtÑIÿqsÐ>‹!/4õ윺xˆHËRZ7•ïà<ŽfÎip1ðÇė䯸ý¤/˜Bʵˆõ|àÏÈ¿x£2ÝAüNîîÍûV€ çü>)WÏSw_Ǽ¸9Áë©{€k‰ß‹Ïd~/`Îï“ãôYênàNâÊ­w¾Út¸ßÙ»MN£žÏ_Õ”‹€Oöº)¯øoŽÝÍE¶Üü&ð/Àc™ßËzçóWµúfrJÝ |‡hµ®"öÔ¼}ø5àuÀW2¿È4ç÷ÉÕ¬}©»û€}­í”·G¢†Ù ¼ø=âªÑÜή&þðŒ}à/†<¸„褼nâà__ë<xa‚×Ô´Á~5qÞ®Û¿’åÎç¯j1äÁ¹G€µRŸ)€ø ±ƒX$ü^¢×Ôøn^I\É—ûsL~>U¥@'õÚÀbð\â_¹¯Óòî&fê×_Îü^ À9¿O©yº½Ä_+»½¦Vó}âË`~å–õ|þªJZXOêµ€oÀ~àq‘°$?þ˜«?Içó¯dÚ9¿ÏbȃK£8HÜâeÀ®D¯©~7çÐßü_æ÷R͜ߧ–è¤^ø:ðzà­Àw¾®Ž¹‡øùïþ'ó{Êæü>5Œkå¸nâB’-ß%xøöIÌÖwf~/0íùüU-†<¸ÆèäX8|øp-öTæ0ð¯Ä_ØÿÀ9¿ÏbȃkÖʱ6°›8ç|-±P¨ñ|š˜ó¯!¶Ïis~ŸÚ “cmà ñ­² ‰®@ÃÜO\ŒuñÅ­Üf3ç÷™K@¾nà^àÄ­ÊHøºs±Ÿ¸qË9ÄÅX¹Uy>U5¯¬'ÇÚÄiÿüq§â9…ëŽplοt‹¹ë)yÎï³òà¹þ’æê~@Ü[î2àK _·6_.'þÊ~'ó{™ýœßg®Ðɱ6q‡âíÄ"á¾Ä¯]²ˆ9;ð…Ìï™óûÌqX+×u‡‰¿t×/ î<ÛªG€¿ÞN„cn%žÏ_Õbȃ[€N®µ÷¸h1Ÿ™ðµs;Bl«õÀ¿ãœ?…ÅÏ}X+×ÚÀG‰.àä¿°%…[‰À{+ù7rmzÎïÓZtr­ tû^Â|÷3|˜ó/#vÙÉ­ù9¿O«y»;˜ß~†Ý6Úçë¹oªÒÔùüUµ´°ž\kÝ~†×Qÿ~†%m£=Ç9¿Ïbȃ[³ø6Çö3üfâ×ê6â†)%ìÅ蜿;€åê ®$ü ±R~9eÿ?¼øCÊ­mÄ)Æ‹€Í™ßKj‹!6ž(×uÁ³>B|Ûðy _{¥m£=§óù«Z y°#Àúr)€¸ùÅåÄjúÞ ¯2%m£]ľzs`ô˹6Ðݪü|bO»\î~™2¶ÑvΙ°œœÝÀñû¦Üæêøm´?›ðu×ãùü ¸°¼œkpâ~†S.$æü«Ïàœ_ºÅ—óLÁÔûÞ@ü…½žüÛh·v>U‹!vXMε?ÃníÀ7Fx¾!œó2†É¹60Æ~†{‰9ÿàcã½µ•9ç'æ0\îµG‰Ö}¼xÖ)mmçüÕ-†<ØOεX~?Ƀí‰uääœ?ÜbȃÆ•{màøý o\óo_#¾°SÂ6ÚÎù…°˜Fîn`/qÇÝû€—·Ý~'¹µ|ÝþC<Æþv;GxŽ9{˜¸´÷@î7’ÙÀ¯â¥»c{ÿ»ïýôº3wQÆ7çR; x q[ýÂitk[h§ØD|£Ñ•ý‚iµÒ lÞ€·â*žÞœ»çüÊùÌ©pί”WíÝ€s~å €2ÔØ 8çÏ€PŽZºçü1ÊSj7àœ?C@™JêœógÌ([înÀ9æ €òåèœóaÔ#E7àœß .SuÎù2ê4f7àœß0ïT¯®ê<ø›eH 3¤†Rà ©a€Ô0@j˜ 5ÌfH 3¤†Rà ©a€Ô0@j˜ 5ÌfH 3¤†Rà ©a€Ô0@j˜ 5ÌfH 3¤†Rà ©a€Ô0@j˜ 5ÌfH 3¤†Rà ©a€Ô0@j˜ 5ÌfH 3¤†Rà ©a€Ô0@j˜ 5ÌfH 3¤†Rà ©a€Ô0@j˜ 5ÌfH 3¤†Rà ©a€Ô0@j˜ 5lŒ¸80ÂóHZÞàú¡OrÊoäa`œláù$­ïQàsÀÍÀ¡¡O6Fî$ÂàBàé#=¯¤p¸ø°¬'+:vÒøî>|wì';Àn@ËàÀÝS½ÀбV3êœßgÊ»i#&™óûL»©ßds~ŸTvÒÉL>ç÷I»)áœß'G€Ý€Ú•|Îï“+:vjI–9¿Oî»Í_Ö9¿O бÐÜ1ç÷))Àn@óPԜߧ´èØ ¨VÅÍù}J °P]Šóû”»•¬ø9¿O v*O5s~ŸZ c7 T5ç÷©-Àn@ùT9ç÷©1:vJ¥ê9¿OÍvšÖ,æü>µ@Çn@c›Íœßg.vÇìæü>s €ŽÝ€V1Û9¿Ïì´¼ÙÏù}æ»õibÎï3÷»=QSs~Ÿ c7 &çü>-Ø ´ªé9¿OkбhGós~ŸVìæÎ9 -@Çn`^œó7ÀvõsÎ_p"»:9ç¯Èx"»z8çd¬Ïn \Îù#1úÙ ”Å9dÀrìòsΟ€°<»<œó'dlœÝ@Îù «±˜Žs~BÀ0vãrÎOÌÎn`8çüL €ñØ lœs~fÀ¸ì–ãœ_`vësÎ/ˆ0»9çȘ^ëÝ€s~Á €4Zìœó+`¤ÕJ7àœ_  ½9wÎù•1ò™S7àœ_) ¯Ú»çüÊe¨±pΟ µtÎù3b”§ÔnÀ9† €2•Ô 8çϘP¶ÜÝ€sþÌåËÑ 8ç7¨GŠnÀ9¿1@]¦êœó¥Êl.áy~8s„çQ…þþÍœ™pç!IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/256x256/gtk4-demo.png000066400000000000000000000443531511343406000262400ustar00rootroot00000000000000‰PNG  IHDR\r¨fsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/ IDATxœí}wœåýÿ{û^opt* p©RDÁFSTTlÁ5¨11šo±‘ü,€ ŒÁDÄB¯Q$j *áîèå€;®ìÞímßùý±7»ÏÎ>3;3;»·w÷¼_¯yMÝgvçó~>õytÇ¡uA§Óé’u/޽`) ûZ>âx©Ï)~q¤´@(x­µY/#ƒÔ#€ëºxÈ@ìE’|Á4-4SÈz©kÄΩ!ÚK$÷Xð{›Œš âìåã9&—Hé~ø{!“ F) Ôzáq¥ûRß H µœmÚ~ð {)“F)‚$ ¼œmÚ÷Dzói®†‚ÙË™p0hBÄiÇ«x5$ Ü—ÓóË]Km‡²—4a`D$ØŽµ-¶ŽuL b‚OvF) F D‚Õzµ/w-Ö1 @(è´}Ú6mM»Oð {a5…±©ÐÒЄj½œµÜc<ô"íëå… í)AæˆvD\Çÿ¾Œ´ÓâD¨õ±H Ö1Ú~¬s´¶’B Ž NR!܆Ävø {ã#…Haµ^‰PÓ ØãÓ¶…í laÁ[Ë%f$Œb ‰á9µê½Ra× Îë)Û ¶õ”ï‚‚íGP(ý“¿Íç„Ú‚R­€\ ·ÃÙˬÌ@Æj½;^xLMO/Ö« …œ¶&±ºììlÃÃ?ÜuÿþýÕëׯ¯àCPÈùŇH2Ð#L„í)"óh¦ Y«õ´cR¯Ù7ÇŒÄ1=üyóÚßzë­—öïßXûöí‹M&S&8Î3Ÿ}öÙ_o¸á†Ý >¹ðšO ¤6 eþæH0Z%¤°Àók%ª½Pà…Bohü)ìüÚ@ìùý^½ze,Z´¨xÔ¨Qúwï^œ••ÕIäwœ;wîë§Ÿ~ú¯+V¬8† ð{I¤V@šrý l“kávø`k|Á Õ@ „çøíxÕúX½;žÜŽ¥ÚÇrÞ‘ÛB¡7Çy¡7ßÿý]}õÕÃú÷ï?¤C‡ “Èo! —×ÃgëQZ^‡~³Ñ¯sPY8WëDûÜ4ÑÏß÷ßÿñüùóß>xð  €‘¦ï†…ó$ÍŠRH­ÇŽç {u±ði» U{Þco`;vlÁÂ… ‡-**œžžžKyæ˜à8àTUJÎÔ¡¤ÜŽ• ‚ïÉüñÝ0¸{ðk_ÞP†Â\ ¦íˆL«¸ËÀétV­_¿þõ›nºi+ÂfM#jrH€ùT"¥  «õ´cJÂsbBOª÷¦6mÚX/^|Éøñã‡öìÙsH›6mºIü’¨qxPz¦%åu(;[‡·ŸzI/m(ÉJÒÌLÒ£û¶^â/;wîÜgžy楗^z©‘f¿#šFÀ† ¥ …ž_ÇcÇ …žž#žìÝCλ Íž={Xÿþý‹;uêÔßh4ZD~ Ix|9WߨË×¡Âæ’õ9ðè—†™#;£G» ÑÏsçÿñÇ?»í¶ÛVîß¿¿a"š$(€²M®…ÛdûRG ’€&'ž£öò|Oo*..ιï¾û†Ž1bh=edd´ù-$Á8SåDi¹%gêp¬Â@ù/E<Š{äáêá‘&îrp:µ6lxsΜ9ô 2‡@- 0³@’N)8(†ÁëíÅÞ€hÁ•€c`ÈÊʲ,Z´èâË/¿|XŸ>}†´mÛ¶‡N§+Ë•„½Á‹’òFµ¾¼õ.Ÿš¯‰€‹I©ƒÛc\¿¶0èÅÿòÊÊʃK–,yyéÒ¥?#èàM^#à…_˜LĆ )À^>‘v¼p_JàI!ç÷ÅÂsQjýܹs»ÜxãC TÜ¥K—&“Iܵ.¯?€£ç()·£¤¼çjä©õJ —x´Ë±âú‘ЫC–è5Ç~úé§M ,xó¿ÿýo‚ÀG „Ú jˆ„@B¯…Z¯Dðc©öJÔz9á9SŸ>}²zè¡â‘#G÷ìÙspVVV;Êï gkœ!;þèy|þ@ìÅ¥ÀcP·\\3¼r3ÄÍ·Ûmß´iÓª9sæ|æóù܈4 Èh°àˆ… UBs!øJ…^JàiǤÔz9ª½Pàiê<\VxÎb±˜y䑾S¦LÖ¯_¿ÁíÛ·ï¥Óéx' "Ô»|(-¯ }Ó«ækTC-€Ù¨ÇäKÚa€BI³àÂ… eýë__þË_þra }rüJÌÚZ¸>Ø‚ˆ@3ˆ!øj…^kµžvLJ­7@ÜŽ×!2½6ž`˜1cF‡ùóç2dÈ¢¢¢f³9“òÄ„ÏÏáx…‡ÎØQZ^‡òj'ý­Lâ!m²-¸þÒNèÛI<û˜ã8îçŸÞzÏ=÷¼¹wïÞ Dkr†b¦ ­@b;Ô>œ²Ð„$„_®:ŸLµ>VxN*ëNػ󶽩¨¨(ã‘GƒAÕ+·eåõ!çÍ‘\µ^ ´$0ô¸|`!& ,„Ñ 쨮®>úÊ+¯¼ò‡?üáIÀÈ$"6TÕ Sø“%ìÂcñ„碜vüþĉÛÞyçC‹‹‹‹»wï~‰ÕjUUAçp8QéÙñ§«Ð\^­ €G~¦׎è„]s¤.ãJJJv.\¸ðÝ»wŸEtm-lȪ % ŠD„_‰àke¿Ë±ã…Yw²Ãs………é‹-xÙe—÷îÝ{p~~~WÑ%.ØÝ8t¦¥åv>W·7uÔz%HðèÛ)×_Ú m²Å½^oÃŽ;VÏž=û#‡Ãá ª†bP üjmuá¾Ø¢4ø¾aØPn6aðÀÅcÇŽÒ«W¯K²³³Û«y`Ú ŒÑZ‘JÀ#ÓjÄô¡1¼W>„/,‰ãÇûØc­øç?ÿy‘c¶Ú°¡kï {yZÜ]¸„zöÆÅd±XÌ÷ߟ+¯¼²øâ‹/Ò¾}û^z½^UÝé ÅãK5£µ" €GQÛ ÌÙ Ä•A¿ßïÝ»wïG7Þxã{åååuˆÎˆ•DԢ†¢ Põ—ª'³ëÌ{çÄÚÀ4mÚ´ö·ÝvÛ°!C† éÖ­Û%‹Ee]GÎ;Pz¦‡Êí £µ"• t:`dï\YÜñÒŒúúúŠwß}÷õ… ~°“w¶š°¡\ˆÕû {¤ðXˆµAÁ7uéÒ%óW¿úUñ˜1c†öìÙsp^^^gµr¶Æ,¦9“œ1Z+RxdXŒ¸²¸Fö.€T–ÇÉ“'¿â‰'–­^½úÂ$@ŽVÌ; å IÖìÌ5 •´#´åÍ ½Õh4¦=üðÃý®¼òÊKûôé3´C‡ýôz½ªÉ*È1JËë`OòÀ­Í…xt.HÇÌ‘PÔV|¤â@ àýúë¯?½ùæ›ÿqüøq;ZQØ0^KÎ15.ÖÆ%}Æ 3§M›öˆZ÷8;ïõòM=0FkEs# ø‚ï•s‡ÃQµfÍš7ï¸ãŽ: [|ØPÐl±0)üiÒŸþùK/^ü²ÒÆ·¹B“U9—Zc´V4Gà!w“Ó§OøÃþ°låÊ•e‡ I'¡’°¡¦fÖ$ †¤zÞ¡gFcÏ kïÞ½ G5/VcnÊÎÖ£äLêŒÑZÑœ €‡œ L€ÿ»ï¾ûü–[ny§¬¬¬‘aCr&#¡6³@+"ˆÒ‡dTü‘ûR„ÀûÌv»]R’ë\>¬Ü~§šÑÀ ÍgkœxuS™ä&z½Þ0bĈkøá‡ËÖ­[·jþüùü¼†|¨š×ôûtˆtêkaÄçH¡× ÖÂk‚t:$ 4]V*û¦ XŽ9R#õ¥YV#î˜ÔCrl8­±ïh –¬;ˆÝÿ«MKOOÏ»å–[~U^^þ×ûî»o € 5ÛtµÜPT‹X“ù-±(hµ/´ˆìx£:fµU¬$b€Xh©D$ýTWWÇ4Þ³ÒŒxlf?\Ú« f£´‚ÛÀgÿ)Ç‹Ÿ” ìlèu:tè÷Ê+¯üí»ï¾{xàÀíd6.<XöEŒ,úòÂy¥„<' ¨*˜áï-²Èh³Ùd¥Þéu:ÌÓwLêG³”ã¼Í…[ŽàÝÇQ+â{Òét†¡C‡NÿöÛoßxï½÷®5 Yˆ& "µ2Ý&übrDóÁ‘k²]ªI@ 5©Å@O#ÿ‰à¨7èß%OÝ0YÌ$`H.~<^‹g?>ˆûÏ‹šV«5gÞ¼y–——ÿíᇠaÓÀŠ`ôKhš”iTPãà×r|zºÚÚÚ(JõîßÊK/…ïàAê˜IÀÐTðøظï,ž[‡ÎØE¯+,,ì½téÒ¥ßÿý¢aÆuBPÈ@xÀŒpÊ»°þEÌP¢Ä9 uC1m âšššš(Ð¥§ÃûÓO¨> ÿø½qÌ$`hB\°»ñƶ£Xµó˜è ®:N7xðà©{öìymíÚµ³,K6‚$@b ¿@Ù&ס¶(}F¹ÍHkyMè*++©œÃš[oEÍw‚s:©7çM%`h ütÒ†g?>„-?œ­1±X,Y³fͺ÷Ô©S/=úè£Ci‰€7„NBåKRÈ•’€H}‘˜6@UY.\¸M‘I +W¢rÄI“àñYÌ$`høülýážýø~:i½®mÛ¶-Y²ä¹ýû÷ÿfÔ¨Q Ž„y543@S ž(ÙI{¥¢¢"Jâ5òM‚îq6›Aªë=XµóÞØvTjPXÝÀ/ß½{÷ëŸ|òÉ ééé9ˆÒrH"  ¿˜6 Úˆ—hˆº¹×ëåü~D$€F€\“ OÝП™ M†Cgìxný!lÜwV´FÅl6g\sÍ5wŸ«FôÊ—Ý`-ápرÿ<žýø ~<^+z]AAAÑÓO?ýÌÏ?ÿüÛI“&!-j´¼š @".S@mPêuEâ…<ä˜7ŒéÊL†&E­Ã‹wvÇŠ-Gp^|PY]¿~ýÆoÚ´éõ7ÞœƒÈH™@Djª´¹f€&€ðFÂB €ÉcϦÍL†æ‚²³uxñ“|öŸrÑÉ_M&SÚ•W^ylj'^[²dÉhDšüÈY´ÌA)?›j-@ ' ,x½^ÑP 0“€¡9Àà°ûX²î ö¯ËÍÍíòè£>søð᧯¾úêîˆÖ¤ÌÍ’¤@M©!ß ‚Æy<ž¨H€^†@B®I°€™ M »Ó‹w¿8W7•ál ]s€‹.ºhܺuëV~ùå—w¶iÓ&‘$ V7D Ôq9f@"¢<"=p»Ýqi¡/•a `&CŠàèy–~ZŠ¿9§Èä±F£Ñ:vìØ;ÊËË?â‰'.FtT V>€jM ‘MPC<˜IÀÐ\à8ì9X‰W6–ÁÞ >6ŽÉdÊ|üñÇÿ‚  L–Ê·QØ^¸øòH+ €oä._Žôùó£Îó&Aÿ®9XµãX\÷b`Pƒyi˜0 -úvÊ–”‡Õjmp¶ ?! àˆý(S GJ$DŒwæv»£5…>êMM÷îÝÈ}åèÒ¢'‹äM‚—6”‰u00h…þ]²1¦_[t+̀ŨLÉDæHåÑ6È8…x @xÑ}§3zàþx5 +WÂûí·ÈÿðCûö:Ï›~u ß®Öì¾ F½#û`øEy蟃^½f^SSsá(ßëó 9Ž l!—‚R ©Âóä:´ír¹4õÐàýé'T &mŒm4 v2“€A=²ÒŒß¿‹rPi‘œ}H ¤ëó"Ž9Ž:DOª+UshaHÝZ·N6òL‚Ì$h0êõÕ·Ã.ŠÏž/uoG‰{«¤=¯àرc¼ fÿkZ ¨E"h¯bD»=zµD„åB®I°æ«Sø3 š ²ÒŒ˜ÐŸO¦=¯4 ààÁƒäDdhO wÆÌ7–q޳Ùl ÍT9&ÁQf¤.:æ§aBÿBôé”Õdö¼€@À_VVFN—%,¯×ÌùÇCɯ%œº˜vž_G-6›-Zhb“à_ÿBîË/‹š¸¡?^f&AÊ`@—ŒN!{^)tÐ!MŸq¬¡¡·/HÙI(´ŽD¥ó¨©©I €Þz Þo¾5 ²™IФàíùáå£} ÚóJ‘¦Ï…†ˆcN§³I|ZfŠ]ÃTUU¥”€†I°bÒo¹%ê<3 ’ ííùo}PŽdƒfÿ××דHT&`”& 5=X*s8P3~0JÀL‚¤£c~&(DïŽÍËžW Z$”A´Œ@¸Ýn¿ÏçóÆÞ“ŠÀƒ™ÉÀ¢ŒîÓ|íy5 iv»'ñRƃPV ×ëõ’ÌL@5mtÉÁÛ»˜I F½£ãó-ÁžW‰:¥&@\‚ãˆÕát`A𤥥Yù¦²ÀC–IP4 ^ÚP†fPaÏgYTųRÕžWZPuuuèÑ4€N ID¹Ž@”qFèL&pÑS¤ä˜¿e&A:å§aB+°çÕ€fTVVòÀü“p?@"‹¢Ž‰MÂÙħ[N%0“ 6å`LŸ`ý|k±çՀ欨¨à @(?ÂmÍ4d99@dhðŒ  ™ÀL!´µç·à°{w³³çÕ€¦œ:uÊqaÖ\ýb€Ú" áwðÐ,BrÀLàö‰Ý•njõö¼Ð|GŽj%õ‰h‡Z @‰‡2¤ $bn€¦Dk2 x{~@לбìt“ìÏ·d{^ hÀÏ?ÿËPLRsÚ (¦¦p@âæhJ´d“``c|žÙóÚCèp»Ý®ºº:"#gJ¡ø3‰Ì²š±@¢á­·‚åÅkÖˆ›3ûaÍÞÔ5 H{¾CžzfÏ'Ff]ä{ßÐÐP°ðóQÒà¡iš°ú„¡…08p¹\-ÊÂ{à€´I O=“ ;݈ ýÛa`Qò2ͪíùC®-(qom•ö¼RÐì‡Ãá@¤,‘r$&ôÔŽVI[¤kÑæ`tÊOÇÄmÑ»c2TÄçy|çü¾u¬jõö¼RÐìÿÆù„Ž?!´J!YSƒq¸†††çƒ\“àŸ{Oá»$˜‹r0ºotkŸ=Ÿ¡/@GÓ À k˜ð«- ˜ Ú’0$£h|dOÒÔcÌÛºdãí]Ç5½·Q¯Çè~ÖC[{~vîŠ0¨- Èn·×!Øû‹…þÔšD“€ )&ijÈ3 r51 ˜=ß<@3jjjÈáÀiuœ—Ú—DM ¯#ÂápD9S½"P+$Ê$è\Ž ýÕÛóÁøü(qoeñù$欪ªjRZ@,È&êçÜ´†ˆûZ¸@B+“à’nÁø|Qœö<‹Ï7 h@EE èbP3(¨R„H ¾¾>%M&d›sûã¥A“ QöÕAó:tˆ¬” §ÓΫ†ÚÄÌš0´Pgj¥9&˜=ßü Ôü~¿ÿøñã ˆ”—„W‰·QSSÃ@±LÌžo¾N’q¬qB±äŸ„UÉŒHõÉAšÞP1|8:TUAg6Gœcö|Ë€UŸ5!AI­› ÅbUUU­&X-¸úzÀ-ܯU]WÀNùCs‚Œ A„E@$¤’ƒTAyY¨á‹ÊÊJ¦0´jЀuuuDzû#FÓFìâ Õ¤(‚Àñ“ƒ'0´&Ð ë’^ ¨#ÚÍÅjÈcœÏç‹ÐZK*0@O²ÙlMR h£ÄjdăeCkÍPUUŧ“f@Bz|!´4äd(EÏ `0Dy¼Z*h>€ .•€±Š4ÍL´P˜ÌТ†g`P špöìY> ~9PDr@ õ#dÓ´Ä‘ä‚Fååå|°”0!ˆGPÂH!VcCkÍ xøðaá|r*S"@Vy®¥M‰:æx IDATÀ 1&Ij% Ø<jHPt~@†V¡Ðår¹üOæIhAZˆÅDRs°l@†V £Î ³.²³Ôò³ÿ4A"À´s\KŸ„A 4û¿±@8°ãLé<€XÚ€ÐÀ4†V‰…@ñTFAN)0¼Z ñá¨&ó0´dè¨ó&€ÜJ@!T“F"@¬.€€†††è¡Á™ÀÐ @Ójkky €‡T& ˆcqWÚ€X!Phßét²QZ%h>€FÖðˆ'#PD @® !dКæd` !RD& ÇH8”jq7ªµOÂÐzA#€óçÏóƒ$5˜‡V&@¬`hÊ#‡ÃÁ€¡U‚V ØXÐ3åøâ‚ˆÕYiÁv»C«M8qâé &,0žä„$¢ êêꘀ¡U‚æ,))ÎD"£T¢°ÙlL`h• MrêÔ)rBZñOBTÉŒ¿†°Ùl, ÈÐê ƒé‚ A9!ˆ0X¬PSs Ñ™€Qv urf¤< Ý12ãn´5ö‡<œy†.Mݬf«>zÁ4‚€h¡Nh% œ‰A"Ô˜ÊÊJ¦4`BWó¥èm™„Þ–)(0öˆ8oÖe`fî«èÔPŒíu†‹ú[ÐìÿÆùh½½4'‚D€Ž69KN dè ÐË2 ½,“ÐÓ2]õ:è ‡:ŒL¿ =Ìã°®ö~œóýœä7Ðæ©ŒG3‘íRKħ §©4¡‡s»Ý~¿ßï7 ¡ Ò˜ÐthoêÞ–)èm™ŒN¦ÁЉX…Õþã(uoG™k;N{÷aBæ"ŒÌ¸:èPh샻 6agý³ØëXN‡vË‚H€œIACI¯V€\G Àëõz#€ù’“. =ÌcÑÛ2½,“‘mhO½.Nx¾A™{JÝÛpÁw$âü–º§QêÞësþ² `Й0%ëwèe¹Û~ ›¿<Ól@K"&‘3˜æ•€€ö&€˜#â˜ÇãñX­V+€i‰E®¡s£ÀOBwóuêuŽ@»w¢Ô½GÜ»áâ¤'#=æÙƒeU1#ûY °^ èf{ vbƒýqp}¬ù³4WÐ4€êêj±Á@¥<þÔ;µíJ†0ʦ‰šD¯‡ÎbçfŽ$- ‡ÍCUûI(4ö½öœïg”º¶¡Ô½g¼ß+Vß];ÖÖÞ‹Ò´m¸*û/°ê²aÕgcVî«èíš‚ öÇØ¬Æ ;+**„uJ³ÿâöÈ%šÍ¯!v£ ž‘Á ¤ésÐÓ<½­SÐÓ<iú\êu^Ή£ž=(soG©{;ìþ³šÜ¿sNx¾Áõ9/¡›y` õ:t5ÀzÛC8æùJ“û4WÐ4€sçÎ +z✦ˆWÛ ÕFthðêê8›ÓºPhìƒ^aº.æaÐÃ@½®ÖºQàwà˜gOÂBv6ÿü½zFg,Äå™Â 3!Çзæ¯Á¿+°£~ ü\Ô_ß*@óœ>}Z8@Ò+µ0d‘ç¼^/KV£ÎŒnæ1èm™ŒÞ–ÉÈIÄ ÀÓž}(uUû ß¡¤µ‘C_9–áˆç_˜™ó } ƒ£3îÅE– ø¨öþ¤¶'U@ÓŽ9¢¤P3»ŸD¢ó¨ 60¨rÌÊY†"óH˜uôßɰá°gÊÜÛQæÞ g 6É-ŒÄ9ïÿðzÕ4LÉúF¤ßthgì‡{ 6c{ýŸñãMpÉïðš WRR¢¤0!ˆ‡„~aCEj°P`: ŽÅ÷²\u¬ÒWŠR÷v”º·á”ç;àOF eÃǹ±Éþ{”º¶áºÜÿ‡,};ufLËz½-“±ÞöìþsMÝ̤@¨¸\.—Óéô£ +ćiçØÜè²³a2Ö3`½ê*è,ô0óà¸ç«F¡ßŽZÿ©$·TŽx¾À² quös¸Ø:ÐÃ<÷ìÂçößà®Ïš¸…‰…Qg†E—qÌápU€RÅ?Bhª$*HÒÀLÀØ«WPà§O‡ù²Ë 3™$¯ÿÈv?J\[àá’ÔBmá ÔbMí=œ6Wfÿ ]&Òô9˜“ûz;§`£ý ¸¹º¦nfB@³ÿë„*¬S.  @ŸLßÂMÉó¸q!¡7öîM¿ã‚‹À (sïh¶ÂOâç÷ü3s^FWóÀ ´Ù(2ÄǶqÂóM·P{ˆÔÄJN¸HHy2铃´@ @_Xë•W…~êTè²³©×qv;\[·Âµa\7¢ýñãÐ¥¥%¹µÉC­ÿVUÏÄØŒ0!k 0!×з焯˰«îyøÑrÂ…´$ »ÝÎ;•„Ò5G"€–ÆAN§³Å€iÈX§O‡uÆ ˜‡§:ôÀWV×çŸÃµa<_|ÎÛr^x9àÀ—Ž—pij3s^AcOè ÇØŒp‘y<ÖÙ@¥¯¬©›© h&€ÍfB®eä ’Àq§ÓéâÍêMK"]z:,“'…~út:u¢^Çy½ð|ñE°—ÿüsøÊZÆË/ʽûñZÕTLÍzÃÓot0 Ä=[°­îÿðmê¦m  %UWWóI@MV ¨ÓâI æ€JÍÈ`èÖ-ÔË[&L€.\×@E\7…~ëVpv–Oƒ—saƒý·(uoǵ9K‘©/„IgÅUÙFoËd|bûê盺™ª!2!ˆ’IAÐÒ*cä4€«¯¯o^€Áó¨QA[~Æ ˜ú÷½Ôûý÷AÕþóÏáùÏ‚=Y(sïIJ —ãšìÐ×: ÐÓ2÷¶Ù‰Ïì‹q婉[¨4ÀùóçI€PFz$@L¾TC)Ðz©FQ¢9L¢ÏχuÚ4X¦O‡uÚ4èó£Y8‡îíÛƒ½ü† ð—³:øxШƵw 8m¦eÿf]Òõy¸!÷-|ïü›ì¿‡‡s4u3¦œ={–\i% œ*AÙˆwD )BuR5€0Lýû‡có£GzqÿøñϽk«bLö9ßÇqÏ¿q}îËèb ’v#º™Ga]íƒ8åý®‰[(4ÀñãÇë7iu4¤t –¡ê¤Êì@:«– BBoèÖ~¡ßÏÞ½p6ªö¾ŸÙØwÉ@µÿ8VU]‡q™a|æÃÐÈ‚ž–‰Xg{U¾£MÝLIP&ñ•——;!m÷Ë1âF²3H6èõ0òÚ›† ½ÔûÓOaÞ×_þÔ*®iÍ8ãý¯]˜‚©YÀ°ôù€N¦ÁXX° [êžÆw ï4q éNIõõõd@ï($hZWJ1X¨Ø¡ºº:¡>]v6¬S§…þª« /,¤^ǹ\pïÜvà8¡Y´‡‡kÀçöGQæÞŽkr^D†¾ Lº4ÌÈ^‚Þ–IøÄ¶ŽÀ…¦nf,ú,© AbyýåB5A$2ÜŽsTWWGiñÎ *®™1æqãD‹kü§O‡Þ½c¸†æŸ_ßÚPâÞ†e.ǵ9/¢·e  ·e îk³ŸÚ¡Ä½­‰[F†NrBR.ä %‹¤bÿ…á***\Â(5"ŠkfÌ€±W/ú…<ß~Rí½?þ¨è> © GàÞ«¹ ÃÒç㊬§`Ò¥!CßóòþŽÿ6¬Æ–º§R¢xŠæ´ÛíBˆ=4x³ˆHÙ0¡‡r:5“ƒè ƒ¼éÓ%‹k6Ü[¶{úM›¨¬Tø8 Íß5üÇÜ{‚Ó”™†¦ß‚n–1XWûÎx¿oÒöÑ’€ç åÿ±Ó‚5%% ó×Ûbk¡ºÃÉÄ4dH86?bDpÄ |%%áØü—_¾Ô1hƒ*ÿ1¼Uu Æg>‚q™¿„ºã΂Oð¯ú¿áËúÿ×d£%Ñ4€ššᤠbHi' h@Òéðz½‘“ƒ4–¿ê22`™4)›ïØ‘~žý+\\säõ:†Ö|ØUÿ<»wâúÜ—‘oè=Œ˜˜¹½,±®öATû'½]´$ ¢€ÔIJŠD &ÚˆÐh“ƒ´Ù²æñãE‡ÄòŸ;7_\³m¸º–9‚ ƒzœòþ+.LÁ´ì?¢8m ³i(¶Ù†Íö'±Ïù~RÛCÓ.\¸  @n°$”Vñ¥át`)»Eèä<OT(Ð2uªà.¼ûö…cóÿý/Xq C,x8>µ-B©{®É~éú|˜u¸¦1jð©}1É™ƒB¤€œ@Ž)@C“ÕÐ|ä9š'“Tqü@p~@êÔ×õm[Ж߸þ³ÚÌ\ÃÐúpȵ§=ûpmÎÒШÊ}­ÓÐÙ\ŒOl¿B™{gÂÛ@s6N" ÒFŽ•7èÃÕÈG¬âÒî÷7.~Úä ¶ÇÃÙ‚TÏœ‰†·ÞbÂÏ7êx·æl´?/Œ>gê qsÞjLÏþ L:úXZ¦=z”ŸŒ)øRæuñß±EèüãIÀïr¹œÂ/Ê~â ˜GÒ I ‘ø¶a^«šŠ³Þ¡cÃÓoÇ/ ¶¢£é’„ÝWèä8¥¥¥ÂÁ@h j¥ §!bDÀ/>Þ­[·þGøA]V 6o†uÆ …Íb`ˆ ¾Ãx³j¾t¼ ~ä6Æž¸³à3ŒËø%tšô‡‘ Lât»Ý~ˆwšIE„ ÀÝÐÐà1bÄK‡:õíF#òV¯FÆ}÷©lƒ4Nz¾Åò “ñƒsMèXWóÜÛf§ÍÕäóHeÿŲó5%…˜ 3¶(æù'ç>ó£±÷àà<þ¼mĈ¯íÛ·/z„ ¹¯¾Š¬ßþVÎs00(†›«ÃzÛÃXS{Oh2U‹.×åü ss_Gš>7®ï§%‚ЀIÊÒT’©ø‰ÅÀ À ¡®®Î~饗¾ýÅ_P“¶³ÿügä<ÿ¼œf20¨ÂϮϱìÂDñ|:v±uîk³ ™/Sý½2æ¤CÂãšC ¦ºÑH€ïýÝ’@‡Ïç«?~üŸ}öÙ×´f.^ŒÜ7Þdƒ!^ÔÎcuõ€ÎlŽ£É âàÀáë†7ñzÕ4œóþ@pDŸ‘éwáž‚Íhož‘B ©,@9«¦M*ÍÒÓéGØ èCBZ€:õóçÏßòꫯn¦Ý/mÎäúiÊ !ÎвPá+ÁÕWá+DzP¸°ÐØwçoĘŒûd‡ Eêh“‚ M‚¤äÚEÄz~ e"ìð L¼P þø×ŸÿüçO@ÔH)Ö+®@›­[¡ÏÏAÃÀ ?çŶº?áïÕs`óŸ ëMÉúnËÿ9úp$hNÀÆ A„ƒÈÄÐ>ú裲뮻îíFj ;£í_ÀT\ç£00ĆÝïT߀­u„ *¦Ù†¸5 ¦f= £.¥ú|>?!™,$@œš. 4õEŒ„aA’x"jõÛ·o?1mÚ´UµQѶ-ÚîÚËeê“6䂇½Žx£êJœ÷ ŽÎXˆ» 6¡ÐÔHÓôyŸs8 ˆÌŽ•ò@p]é#10¨ÂyßA¼Qu%þíx \ã«ßÎØ÷lƸÌ_€ȹ)iÀ¼6Ksæ!×üVU@ £˜ê/FBs€$22P îàÁƒçÆŒ³ª¬¬,jn]Zò?þióæ©y,Åðql©{ÿ¨¾vp£ÎŒI™E]ëp8øB Ò&$ =¾Z›R>fŸ%HúHM D'Ož¼0jÔ¨¿8pะ!:“ ù«W#cáB!6Žzö`yÕåøÉõ©è5v»½áw]Ì(•c£9T€LS‚c4 €4¤H 9ꫪªªG޹ú›o¾)~*=r—/GÖã«}<ÅpløÚñNz¾¥ž¯¯¯¯C´€6#˜ÐkN‰œX*‰Aj.´Xί ;vì›7o¾~Ò¤I…ÊþË_ Ï˃í7¿‘Ýh¥0é¬`½#Ò ƒ)ê5 ¡¦¦ÆŽ°©+ÔhÂ/fhFqÇqœN§Î¬¬… ¨yÈ1ê¶äŽÏçã&OžüѺuë\×_ýpáÅ™¿þ5t¹¹¨]¸ˆÎ,f`P|C7 O¿ ƒÓnDš>GòZŸÏçýôÓO Zø…þ¹@M·ÐÄ$ú±fΜ¹aÕªU®Ûo¿}œð⌻ï†>'5·ÜN0 ƒè GoË$ O_€‹,ã¡!? —ËåzòÉ'ßyûí·Ë4ky3Wè óР )hb$™ÄT$,X°`{mm­ó¡‡š"hÒæÎ….;Õ³f±)Á#]Ÿâ´›0,ýVä:ËúÌ©S§*×®]ûÍ3Ï<óueee‚þ,>ÔMj|@j\€„8íÐ’B¶¿àXÄóÈ#ì±ÙlîßýîwÓ C„“Ó:mÚlÙ‚ª3°Ùä? C«EgÓP O¿ ý­×Ddù‰Áçó¾þúëÒeË–}÷þûïA8©Ïpu!<4Ÿ+ aæ€f@Ñ€ä˜ä½O=õÔjkkÝÏ=÷Üu&“)âÍcÇ¢ÍîݸpÅTTÄyK†–¹N=UUUõëׯ?ðÜsÏ}_ZZZƒpm ™ÕÚ€`D‹¯„%5±ˆ@L¨­4Ö@rìªçôoûÛµµµîå˗ϱZ­Ôm<m¿ü¦LÿäɘÏÅÐ: Ä©ÇáÀ§V­ZµÿÕW_-ñz½¼pó¡k‚ÂO|ãBXøI ˜ðKjñ? Áš€!D1æÛo¿}Ðf³½ûÎ;ïܘ™™™Fž3öî¶{öà”)ð•”HÜ’¡%CS¯¡¡Á³eË–C/¾øâ_}õÕy„sVø‚6±ðÂÏéàËâ…ö?-ôGÛº8 Dü‹£IO*J®…‹žX“‹X˜ˆµ €µqIo\²dȘ8qbÑG}4////r–ÊJ\¸â x¿§JÜ$èØÐ]Z_aIEßP-:CüÈÐ`HÚlCä8–dš:¹ï&®ã‡À'ž\¤zþ¤ôþ@ÐŒtk4àÍ ±ðZ@‚DÙ¹sçü;wÞÔ«W¯¨Q9¯5óçÃùÏÆûÈq€6PãÔûñÇϬZµêÀòåËK½^¯P¨]Äšìåiª=Ù㓵.äˆXb*ÌÞ¿±½q o"óBˆÃ1„‚üçå<´¨õôéÓܨQ£Vïܹó†K.¹¤ù!É„ü÷ÞCmn.¯½&ã6 ©†8œz%/¼ðÂþ½{÷V Z°…‹Ñ=½˜z/üXa?Ya@-„Há«ÈbG¤²§„Ûªª*Œ5ê½;vÌ9rdïˆOèõÈ]±úÜ\Ô=û¬Ô#1¤Ô:õÞ}÷ÝŸ^xá…ÿÕÔÔÎ:¡°Ólz²§''¾%{w²—åè£EÐ{­4à¡2m “ídz›"¶¸qãÆ­Ù´iÓ5“'O¾Dx³ì%K Ë˃ý±èRMC1"ýv\l½Z‘SïÕW_Ý¿víZÞ©'´áiÂÏ÷òB¡:ó„½½X ¼˜ÊÏCv"PVI˜BˆÇ©÷ì³Ïî?r䈑½9éÈ# €œÍZLèi =b‚/æåsø8ÞÑÐq×$("‚OAÔWÆ8&ös³fÍÚ´råJׂ ¢+ ñ‹`%á­·²JÂ&†FN=a/ìé…a;~!ç¶$…\¬· »”àKyû&ü@“hàÍ~[òë)û¢ÎÁ;î¸cgMMë‘G™UIxãÁJÂÙ³Á9£¦'`H ìÔ|aèNʉ'tèŲïc¥ü‚²Nš”Ià·HR µ%$ ¦V…þˆE‹}e³Ù\O>ùdt%áUW+ ¯¾šU& pê‘a<šà =ødµ^,›^LðÅ^ŒÈu´îý @ ÑNA)ÛI쇋rºüñüomm­ç…^¸6ª’pÜ8´Ùµ+XIX529ƒHSO˜ÀC ß G§&{{‘ §§—ÓÛ‹ ÔûšáR„MH@i5¡˜ú…—^zimm­{ÅŠ³ÓÒÒ"+ ‡ Wž:%ïá$‘§MÍÚõd9®5?Þ^^±ÐóH”ð)D@\$ Ì*¤…_xžü#ï¼óÎ!›ÍöÞêÕ«oˆª$ìÓ'\IX=(1ƒé¤(š“I$ ëørb²~ «¸¸¸ÃÆoj×®]®°› U3fÀ³gð”j´DPãÔ;~üxÕ{ï½'åÔëñɤXN=1û^®M¯Æ¶—| 9¤0 %=ÂIf„I€¯"ÌÙ«W¯¶Û¶m»©¨¨(º’°¡Õ³fÁµys¼  e@œN½S §ã z¼Ðóv=­·ÚõZÚö lK­!²<˜D¡LiRk`‘N:ìܹóÆÞ½{w6ˆózQsË-p®Yï#7{;õ ƒi€¬ÏðN½%K–8zô(Y~+æÐ¦ç*qêÉÍÇå<(Ûl§œàóH)' q1&7m˜|øï:æÌŒ9òÝ]»vÍ4hP7òÉ„ü÷ßGmNo¼!ó¶- A§ÞíœvC2zü4rjœzJ{|ˆìÓÖÂmÚ>ù[4IOœòÄE€x²Üœü³555ܨQ£>ؾ}ûÌÑ£GGW¾þ:t¹¹¨þy™_ß¼¡Ö©·iÓ¦’¥K—’N=©Þ^ §žPÕW¢â+Qó…Û´ýð‰&VÁ›š’@¬œÚû“çœN'7~üø7lØpõÔ©S£* sž{ú¼<ØûÛ·j¾ˆÓ©÷sã˜zr{üxz4á—"HìâÂÓ¹:™"¶w³!@3Ðd`ŸÏÇ]qÅŸ®]»Ö=kÖ¬èJÂLJ>/µ÷ß–TI¨¡SO*MWhßËéí›Â©'ܦí‡O¤ˆÐ“h»G‰E0IDATVhBZ ,òÌž={Ë›o¾é¾óÎ;Ç ?”±pa°’ð¶Ûšu%¡I—†ÖëíÔ“JØI„S”s±¾Å>fG@BH@êëBûwÝu×®šš×¢E‹&EUΛ¬$œ3§ÙUºcXúmŠz+W®Ü¿bÅŠ²8œz±ôbäˆ ½§m‚í!ô$š%ªH€C‚Àýú׿Þk³Ù\O=õÔUQ•„Ó§£`ófT]}58{j‡òàÔ#‹qb9õ„nÈqêÅêñ[½š/…fK€bHøÀ"úÓŸöÕÖÖz–.]z°’ÐrÙehËW^¸ëÑ’Ž }ŠÓnÂÐôùÉpê +ñøžžlƒöxÃxØÄ…½Å >fM€*à_­ À+¯¼r ¶¶Öýúë¯ÏŠª$,.Wž>-ëù.¦¡ŸS&ô´„¹N=1¯>sê%ÍžY$@© (!±$´^½zu‰Íf{ÿÝwß›••YIØ·o¸’°¬,Æm œz|ù­R§mL=æÔkB¤|*°ÄHæ·iéÃzÊÚ@Y“©ÃæÆ…Ÿ‰(‚IHÆßeݺu7äççGÏIxþ|°’ðÇ£œ¨Tà9õ„Ûd^¾XÒsê¥Z #a91Y?À‘sòõ™C† i¿qãÆÛ·o='amm°’ð«¯"ŽkI¼SoDúô°\SÏ‹ÈX=9;éô“ëÔãI±ì{¦æ'-Ž€¸H@‹1¢H W¯^m·nÝzc·nÝè•„3gµeK蘠¡S/Ö¸zrœz¤#9õR-’x¤ÒÀ":t(صk×Ü>}úDWz<ÁJÂ?$Ø©'6Qsê5S´' d 1&UI¨tŒAò³Q/òÙ³g1jÔ¨÷vîÜ9{ðàÁÝÈëÌfäðA°’ðÍ7eÞÈ0™ŸþùŒ+®¸"ª’Àq€ ¹¼  ‡½,“´rêÑl{¡ce‡9õZZ q‘hÑ"}fýd˜0DkÖ¬™:gΜrÚþrå\l‘§m@M1§;WâÔ#ˆìCp Û´ýð‰Öô¢+@«"@3ÐAïÔ# n„j½ðx¬t•8õ”ªùLèSŒ¡€øµ¹ð$@æ d L æY³fuÝ·oŸýرc  †‘½¹PðÅzÌ©Ç@#*I@¬’Pª†€Ï–[‰µ™ø 9ñ9)øäpÙRepˆ$æÔk¥h•Q1(XD¸OFÄjh ioóÂëàD ˆ 9’.•–ˇÈÞžsê1` @ à·: µþzšÐÂO ²a‡¡ø>’(H[Þ‡hµ^ØËsˆ´ï™S#*â  R à{ü¡Ð‘Ì©þëˆë¤œwB'^¼*¾\5Ÿ }3#ð/gŒJB@œx_ÍiÆ&€ “‚m@P ŒÂÏÓzóåÁ„¾Ùi* 2aˆÜš bÇ„ß Ð…SŽ`35Ÿ! ŒTBæÐãÂ5MèÅÎѾ“G,à×jzyYN=&ô-Œâ€Jà×Rç„ß#¹D µnÓöÃ'Ø Ó¢À NÈ r_‰Ð«%r[IoOÛŸ`/J‹# 1”—˜@Çx9ÂÏC©*Ï„ž!FB¡6 µMÛ‚öÇ)t&ø Œ´†Lm@ξØq±?,!Äú<üVF €Ôè¾  z¬Þ^nê±rž`/@«#€"ò_µD¾€ýñ `È ‚Ð¥*o!ëOdBÏ Äÿ6g–W~:=IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/32x32/000077500000000000000000000000001511343406000235465ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/32x32/gtk4-demo-symbolic.symbolic.png000066400000000000000000000011051511343406000315030ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆüIDATX…í×OˆMQðÇLÄn2“äO³ #”•ÅéYP$2K+[Y)VvÖvJ±· z‹‘šDžÅD";#OͰ8÷æ¼;÷¾wß{—Õ|ëÕ½¿Îý}¿çû;çüÎc0Lâ1fP0Wi¬Àfñ;ó›ÁMü$‡8OÈÁªˆk ñÓÄ• ©áæú Îr¨,ñ¦ñ²â¬Nž7àfÄ IžÑŒ §óLá¶D±£xÛ'ùLD¹Öõ¿„Ëi°–1”|”ºq;q?óTçà5N «¾™pìÅyìÇÊxpü²=z^‡Íø…hàvaSñW\ìm&±qœÂKëß`é.ˆ‘º1–$|‘Ìà,® µ„EÜÂÌ'±ƶùQì@ŒØÏx.,¬há®ã›Pç:Žc}uã½ö•\ÃnáØ][2§^¤f8‡wIl\Ø=£ßtDv”AêFŠé~ÉûP)–, X ˜ÅÿÀÙÂíô%> ç…óy‡ö;AUøŽG™…<„†ÓLÄLø{C‹x†‡BÃjCQ/¨Ê7¸‡E:5£AÜhá>^uX¦öâFn@w7:Ö¹j —Ìgt¿ýâ„0Ì µ@ˆIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/32x32/gtk4-demo.png000066400000000000000000000033241511343406000260510ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/1IDATX…Å—mPT×Ççî.»,ïŠÀfDMi4M H_;R±‰RÌ„Q&c'3uôK’I?Ô–Ø|ÈL°Q§%ÖšL;bÚΔ™¢&cm3$¾Å hcMb,C¦B‰…ey_ö²{÷îî=ýà]Šàº€úÌÜ™{ç¼üÏsžûœs„”’ÿ§Yt!„„ù)å =Rf#ØØØèÐ4­d,ÜçóëmáHÄß70ôæŽ;Ò„jzóÅŽz¨ªêã6›mƒ26'Ú {†ýzË-_R{¯jYúpv+Çæ§¨w÷ÏòòòŽ¡éDc @”¾§§gAFFÆÓz„Mö[±sí¶7¡­[µwxTô°€Õ¢°ai'®ö0®“çWºÆ’Äõ®Î/5‘ûŒç€Bhšǫ̈ø‘ÕjÛ ‘é-Ý^Zo«Îën¾@8ž3Üôóö‰ö¤'ò2 Ÿ{ê±FOÿÐß¿üâò«Bˆ>)¥3¦× †®«-hù罢ݣÆœ‰f·)<]¥¯^’ÙýÚk;W[[œh YJ‰vä°|é{Ùò;óS§Ë‚!ƒW{|t=e(hýåïkÞms»Ý¥BK,Râ}åÅûòKbûòLÊŸr=ÀÀh?6ÜL|ïR÷‚9sç}èóûÿUVVfæÚÄßP‘RJ…ÀÑ£ ¬ZÅêÔ |u}®a³ÌøoÀn³ðLa;7/”[×åÈãKápXòW¬Xá2žTˆî䷴ЗŸ/ÒêêØµ±X¼ä݃¸¢Iv+%gñÝEV™îtˆ.íŠüT?*¾îk@—câs[ôöööä{D#0þíó1R^.’++åO«ªø¨u”‹-ýSD6…Š•óY’«ÈäD‡èÐ.Êóú1q£ÿ`IV®ñ§Æ[ʼ4;ë ²xä!!S)¢5pÒ8<®´«ˆÈPÌJ(¥RÊñöÉ€UT¿t‰þü|Ö׋7_xÅb¡U;-OjŠ…ÆjÎúvÏ*Q&ÈXˆšáñ0\R"²Ô!özòÂ*ì,HX9m`êft_"³ã= ÛƒÈH`RYŸc]D²2oÖS“p;©@Pœ¼ƒ%‹p;]úe~˜º‡ êoñCpŸ%°àØ´ ‹Ë…@¡ÉŸáoO ~ÂÚäJ¾Ñ?çßZýì¤a0Àöä“$–—£dfjnf¬¦9<ŒýÅmw‰Œƒœ}G¥<›úk.¨¦ô‰ i+*¾v-Jz:úÕ«¨ï¼ƒ188aÄýOqÿÑNÓ¥_æûI?Çn¥)ðÞ´$îíé¹–µk×ÞŠ [Äí¾÷ˆiù†—Ó¾*¾m/á¹´ý\Tßf$rk¼Ý0ŒñD‹Æ[þÂ5k~r-þgê©SA%;;®P<»<Ï™Ñ*–;·±Ü¹ÁÔWÀÜ àõzo.+.®<ÓÖö×ô+Wt[~þÔYgxŒJ•}»Št²mÎß°Y…Ïç Ý`Zð›·ly«æØ±©çÎíë×ÏHp²¹lù”9«C›’†¼–¯ßúÕoö644 s'êÿKB3 a!Ä(p³²²²¶³³Ó]]W·Gyã gàÐ!ÅìWÔ¡¤R`ß,—Z·êÖP²öɉƋ/ï[w¶©©éð騄Çr!„$9¥¥¥«þrèÐ~ëñãsÆvî´"%Ù‘{<O·(aEÖëyöµâ«¯š¯Õýùý3555_}@¿)ì4)e$êù=î,O"°`ñâÅeíÍÍ­Þúú`·Ó)C†&«Ü.YåvÉ}žBùñÈÞÈ€¿+xÓÝÖ{°æàáÜÜÜíÀ€ Hì€%êô¸N,B˜]‡cÍ円scÍÍZÈÐäá¡­²Å{VõΞ?õŠŠŠ×À2à[@&à4—Y™,<-€  À<`ÙûGŽÔ‚ÞpkGSguuuMZZÚ` ð(¤˜ýcŠN|â^ÍÌœ¦'ÉÀC@6`CÀpt]`Ìä‚:-€  ààNn¦¨n¾Ïøf ð__B‰›IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/48x48/000077500000000000000000000000001511343406000235645ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/48x48/gtk4-demo-symbolic.symbolic.png000066400000000000000000000015261511343406000315300ustar00rootroot00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ IDAThíØK¨UUÇñOfÖ­ðÁEï@èá 5J*Eð1ŠÂ@Á ש!gÒ pd‡M”8‡‚ ¢NDmPTƒ ¢ˆxÕKT䃫·ÿ³oÛu÷Ùçœ}ö9ÛÁù‚ÃZûìýû­ÿ=,+ð~ÃA,ð÷jcB¿så¦GÜÈs8‚;ž–ÌÈ’FTð‚~W¹ð´ÜÒ°‘ñ9f ÄU1²tXÂ_Æ—5OËô ¼Ò~¿fáiùSLµY×þ`ÀÂÓòWËȲªÂ_ÃqÌYx×F¶¾ã=©_ˆð÷…?3ÝŠ]cx ŸˆubŽ?!¦Í|4î‹tZ‡Se=P‘óx“¸‘è[}ØŠÇÓ?ȘÀ6GãW¼‹÷qµÅ-~Æxß%m«°WdÅ3í^:Z]Ð>!ô´ˆ1À¾ÀÓØ ¼#ŠøŸb7¾OÚÆ±C˜j'üB^`žÔ@Ƴb«<#–y¸‡Ó8)¿² á³8*zõ¤ÿ;„Èóm؉åÞs!ûÑKÏ øF,|ûÅ oÇ1£Mâz®¾cž—Ñkè)Ù _ƒÉóW±›p9ië*ÏËèziNÈ¢1!røn«þšX|và¾Âá\{Æ8ÞÆK¿?GºÏÙ^á3ø¿wñì˜H£MzL•„ƒÙªÈÓ.yàuå3K%ê0‘4«Äê^´ÂöM•A\F<“$žú ‘¦hš‘¦hš‘¦I |­x7ù¨0cùŠt7:%ΛkÍ¿j’;¸ˆKâþhŽ¢íôŒØ×O‰ezS7Lfñ-Ή›Œy”šŽÆ/âÖãFÙC4MDcgÄÝSGº=‘ #mó¼Œ^Ž”ƒŠFǺ|±0eÚ´i'X)¥RÛz&ÀùïØ±C9{öì‰ Þg†LÎ%ÊdlHE­N¼]§S–Õé Ñ[:]Ç!À yl„ѤÓ^ÉÉÎJY¾|y €ØSo¸p&œ˜˜(Ûµk×(Þ×w:#ãfûrŠèšGáVNY^«c<2¢»;µ2– îù~b|lˆ¥¶¦fÏú¿´aïÞ½M°«ny›;yV£Ñ, ;×çÇ6·šÅ’Z_Z«•W©õ°Š½;ª p@å+ǬQa¦ç"üM•wÊRccc÷0Áæ.•s%T*Õ×B‹Ž~•_Fµæ^î ´ öŸ½ÏêçÇÏ7tcS‹öÝ«—.¼›PHé2ÈÓ([VVæoij¬y9tu|®|â¸× Gz~¹oÁÍæèW^}íÇú‡û·nÝú,9!¤Ótïü ¦©©IFE‘¶,^Ì´®JÁ² a4idØS{kP—+‘OÜæo«­3ÿü—eÅUÕÕ©III„ïe‚ ØÇè¿ý–4LœHâú+¦”XÖ+÷N· X$ä_y OÏ/÷5ÿU‡)¹wïÞؼáBÄE€Éd¢p`)*‚zøó$øv6Ì,…÷埒À—a\T%NΉaB·ðkÏÙå-d2™¤ö^’ZZð(a*ãÿá‡ÒÊÕ«iîÍr¾´ñ‰îã§@|L?<7ˆ•ü89S)ü,ýÛ”Åüª;ƒ÷ƒK)%€Vb‡AË>¾2¥Ð­_Ϙ ‘|èõ¡»Oßg¼!âcB9€P^Î’2Ó é¨ñ0S¥¹ Ö6kSJ ÜyÀb±P¸yc 'OBK¢Ž£ë’I›NÕ1Zcç7pgx&È“b‚1$‚¡r9pÓ˜G³õÙÌ}óUPHs`0(í`3Äš4ŒÍøoÙ"}ðæºïj¹Y­é’ôÐ0%&ŽÄ 0†ÖŒëÆ,ú½.—©³\ï˜;„â¸ÚÇ€H˜®_ØÔl†öí·Ë™3tñöíôb„’¾PûØÄçŸQáÕtH¨’ÄD ôºq/Îh~ jkYOH»…‹½^/õdaãÄZ\Œ1ÇcÈôAâ?ªaŸ{Ư WÑð 9ôRŠ;a†"W³â‰äaf³™vÇΰܺõˆ¤ÏÁƒX÷fIÕ´Ø”‰šŽX˜®Zï=Æíà"@§Ó¹ âÎ@u:4ϜɆJv5&+¼F°+¸˜[«ÕJðÒŸzO ¿ÅªDçO‰ß"žXY…#JDqS1@1ì`„ËcðÀrÃÓeÝ_dvxôBˆåç \êQ.à¦6,Æû-E4—€sú¯áÍ ÷ØL` øäd(ÆŒCX4‰wQdüÔÉVœ×oC°l’Ti(2Dµù²§[ÛöïÕ¤~ýà·t)úlßeJ ¬7n åw Qµ–"òÎh´ÞAžfÂe1˜â¿ âëy `ÃÂÀÏ™ù‹/BR«aÌÉ~çÎoH!á¢!}Ù˜®Ú€›Æ\üj>Ûãup@a+gütÿþð™;²˜HÀ˜ ý¶m½ÞÌÍb5ò4)é³Óü?Æi}:L’¶Çë´÷€Hê³`øÉ“!ÖÔÀxäZ·lñ éŽpÍx*6 S•©(N¢L(p7ÜíßÄÓ•‹w+?ÿ\Ð}ñ´ Ë S_—ЊõÈ×¾ŽQb†êSø1AÝžÛ^@ë¸øø/²Ïžý¬ï¹s7i’×ɺÃuc6N·nÂkÊÄðÉÝšã,€ÂVS/X´hÏWõÏÊÒû¼õÖSmáè¥FÕ®…f©6BņµârŒÚbÀ½"!Ä@½víÚcwïÞU§§¥í`¢¢õ|Àâ)¶£n›Ž£Ê\ˆIÊ÷€JT²ÂÞq÷Ø=@)4fdd\˜1þæùó+2Ž{Üòß!žO5½.(ëFùù¦Õv^.õÒNËëörž€*88x@aAAzQ§IL䤯ŽË*¡’€ÏÔѽ~*ø0ˆåæI#‹\ëÙŸþsì“ ÿ8V\\\à!€z»‘Ý °‹ vþBÏ<ùþèÈÈ?¶$$pÖ²2¯ ¬˜€Qò?™žå^%¥¥%—öeþë‡Í›7_Ð @[-È€znobJ)%„Xhˆ¿Ÿ2哃û÷ß›{þüjͼy¼ðóÏÝ&Ú*6 /r Ä‘ŠEVÆ >•>/i]ì‰êêê‡ZèœH[a«R?VnïV‹ÉÑ;à 8--mÚß–.ýÒ’âcøî»¶8êÊ,äˆâ§à%v±)B#]ûåLÆ7»söíÛW›µµô°eC l8·ÍŽn½…ì XjÍš5G+++Õéii;”‘‘}ZSSeî2T°l^R,´ÆroHjõê‚Oç¬Yó‡Ÿ4M#\ˆÙNºû?Ji>Ø2—€ˆ¸¸¸Iõwî”k³²„ZŽ£I êÓ„ÓOë‡ÒÜ–Ruk‘¡¹U­-8y"kÖ¬Y Œ @ÞnHöÑ#>=à$‚>ª¼¨è´þÒ%“EhfÓëôŠö  7k„’Š_®nܸ1U&“Mð€‚`ëË{KÚcvŽbk€á…§Ní¬z±AS«Î?š—9~üød# [&ã`‹%â)qÇ×ëF7ÐÜ2»E###C***,°¢#‹˜`Ï"ðâ¿´qðt=»6ë*ì?6ÖE$x؉ïro­í$„Ú?&Øm7­X=¡zUÓ›÷F?°×µ^VÝc5ìž;Uÿ¹ú•êÃ0or]]ýŸl °ŸR=¼zRõ7oÃzwÓm3ñ¹ÀVÙÖ+zÛ¸^UÝ÷`3Œw^»sEoÛÖuÕ3«ÛïûS€ Ûõ+zÛ¸.o2tdï¿X¿ó›¾å¿°ù\ÑÛÆõ7ÕÃöø;€•;§º¨ÕOѳö¶^غ`íŽOÑ{iueã‚K_W4m œsŠßìÛ­ª‹›¾å¿µñ<ëÆ×[ª Oò;€Ó:£é[þãsEo×K«»â/nÌ:qEï=ˆY‡[LJ Ý2¸›vâŠÞ+«kÿвV¿ÞÙô6Aì³:qEï#8Y›[¿SÝ3áì¦où—䊞UG›þ[¸UÌÎ=:qEïŠÆ?t¬í[ïnê,œI[ì²s›ÞwÁõëÎcËa‡¼²ú–êOG£ì’3ª/lzØ_T}iu“¡±Ë®«žS}GÓ€&¶ÈmšNr?¯ú§Æ·­ù­T©Î D€ms“êAhëAþbf3^]}kõŠÑ…À&lƒÏ¬¾²éÿåÕ§-‡;V=»ú®ê×k%0ÂÙÕý›öñ/Ìá=¶ÏÕT?ÐôfA˜€M¹{õȦoù÷©n6¶Ø“75xÉèB`ÕÖå–ÕÃsEyxQÓù€¿\¬ŒÀªÜðŠÞÕý2£yùhõCM3$>6¸84€Ã¸u'îä?´ºÝØr`#þ¶úžêÿŽ.C`?ÎlÚ¿¿0WôàeÕ·Uo]„ÀéܱzDÓÿÁÕ§-¶ÊÑê)Õÿhš2 ;Cà©ЉÖþ=Æ–;á]MÛÏjz—l=€ªó«¯jjíYuó±åÀÎú½¦Û¯]œŽ°L·¨þu®èÁ:\Sýdõ½Õ‡×'%,ǽ;ñÀ¿oõ)cËÙ{õ¿ªkš<[E˜¯O­Ò´ÿêöcËÅzeÓ¶ÀŸŒ.nH˜3«{uâýú®èÁö8>dè;«÷ ®*`×׉;ùª>ch5Àé\V}_õãÕµƒkaá€ÝrÓêØË¿WÓ7`·¼ºi[࣠a¹€í÷ÙMCu.jú–‹¡Õ«r¬z~õÕ;× Û眦C{Ç[û®èÁ¼]QýHõ„êªÁµ° ÀvpExsõ˜ê7FÂ2cܪizžñŸèEMC†Þ6ºæMØŒ3ª/ìĽYÝdhEÀ6ûhõCÕ« ®…™Öç6Mû ›Nîßvl9ÀzGÓ¤ÁgŽ.„ùVÇ=`]~»i[àõ£ a>€Ãù¬N ÕùЦoýëp´zJSGà#ƒka€ý9»º'öòÞ6í]Õ÷TÏjz—ˆpz÷hzà_PݧºÙØrªúý¦· ¾vt!ì&à“[=,Wô€íwMõŒê¿5†=N\Ñ» é›þ—抰[>P}õcÕuƒkaG,5ܺûø¨n7¶€•ø‹¦m?]Ûo)à&MƒtŽ·õ¿ :kdAkr¬zvõÕ{×›s¸cõˆ¦þ—WŸ6¶€ú`õøê'šÎ ÀÇ™S8ÒÔÎ?¾—±ål…×4m üÁèBØ.»îTý›¦½ü/«n>´€íõ¢ê›«¿]Ûa×À-«‡çŠÀA\QýHõ„êªÁµ0ض€^Ñ» º_uÎЊvß›«o¯^<ºÆÙÆð©ÕCšöñRÝ~l9³õ¢¦!Co]›· à̦Wì^˜+z›öÑêÉÕÿ®.\ 4*œ×‰þƒ«OT“wVÿ½zæèBØŒMWôvÃË›¶þzt!¬×:ÀùÕWåŠÀ®9Z=¥úŸÕ‡ך¬2œÓthïxkß=€Ýöî껫g5½b˜9l¸w'®èÝ·ú”CWÀ¶ùý¦· ¾vt!¬Î~À­ª‡6=ðR}ÎÊ+`]W=§ú¯Õû× œ.ÏEÕWWwÏ=€%û@õýÕW×®…C¸±p‡¦þM#t?c“°^U}KõÇ£ á`nîV}_ÓÉý#cÊ`‡\[=µé¶ÀeƒkaŸŽ·óÖt÷Ó[øØ«3«/©¾±ú`õêÜØgTŸYýUÓ?8¨W6m üéèB8½3«ÿ’‡?‡÷EÕU?SÝvp-œÆMc!ï:ºfåƒÕ㪟¬®\ 7âŒêcÕÙ£ `–^×4[àw×Á'8³í À<}~õ;Õ óŠø­rfÓ,hX§ «7T—T·\ lΑ¦í€7T\Ëâ lÚgV—6½æŸ®e±FypÓ»¾¿ºÙàZG`¤sš^%üú¦¡slˆÀ68¿z~õgM¯fÍÎlzlƒ/nš0øÌêÓ×2k:l›3«¯¯ÞX=&CêÖB`[ݦzRÓ¶À}×2;Ûî «W4m Ünp-³!° ÎèĶÀc›^*Ä!ì’[UO¬^[=lp-;M`}^õ’¦!Cç®e'¹À.»°é%Boz©{¤À®»Yõ¸êuM€=˜‹»6m ¼´ºÛàZ¶žÀÜ\P½¦º¤ºÅàZ¶–À©¾­ú›êQƒkÙJsvÇêÒêåÕ=ײU–àÁÕ_6m œ;¸–­à Kq“¦m7Vnz.–KsûêiÕŸT_:¸–a–ê‹«?j2ôƒkÙ8€%;³C†S5¶œÍ n]=©úó꾃kÙN¸WõMÛ·\ËZ ðñÎhÚxKÓ¡#C«Y“3®_×^ÿ¿ÀÇ{SÓõÁß]È*Y«®]l©Ï­^Ò4hèNcKYã/Að2 8µ «¿nÚ8gl)‡w<8§w³êqÕ_5‚%ÀþÝ¥iKà¥ÕÝ×r ÜÕkš† Ýrp-û"ÀáÜ´é–ÀªGµ#·êX;V—6m Üyp-§%Àj=¢é•Â_4ºSq Vï6Õó«›.ädt`=ί¾qt'#Àú0º€“q ÖgëÀ•C«€yzÿèNFÖgë;ÎÀêm}@€ÕÓ€Ò€`lÀm}À5@X­««ËGq2:°[Ûþ/ÖekÛÿ%ÀºèÀíDàªêØÈB`fv¢p,7`•v¢P¶`•v¢P¬ÒÎ[°:¶`v¦ ÀêèÀ °@¶`a>Ú–?WX½­nÿ—ë°ÕíÿòXX ê°:°@:°@,-X ê¸«¡ $ÀíÔ€‡w,XœË«££‹8VkëÛÿ%Àªm}û¿Xµëxž,ÐÎu®ª®UÌÄÎuÊ6ÖÎuÊ6– ´“[Ž,ÐNv€ÃÙÉ w¬ºlt{!Àê|¨ºvt{!ÀêìDû¿X¥¸P¬’,,ÐÎv¼NH€ÚÙ-NHHhg;®ÀÁ\Û4 h'èÀj\V]7ºˆ½`5vfÿ¿X•Ùÿ/VEHHh§ÀѦ{ŒÀþìô@yÄNwÊ6ÄÎwØ?X X X˜««.b?8¼ËF°_ÞNíÿ—÷À*ìÔþéÀ*Ì¢ ÀþèÀéÀéÀÍ"¸ûc höGHHæcÕ•£‹Ø/gçÚÿ%Àaí\û¿¼k6@öÎ,,, 4›-€k®_ÀéͦPº°W³é”{5«€—ÀÞèÀͪ Àé]Q]5ºˆƒààv²ý_† ´“ûÿ%ÀaèÀÍ®à=pz:°@³ëpz,-X X X Ùu\€S;Ö €œÚ‡«kFqPÌÎ~û/jg–%ÀÙ€šeÀ5@85X h–[œÚ,;×VG7Yì˜YvJNe–€àTt`a®«>8ºˆÃ`ÿ>ØvÖ©€—ÀÛéöéÀAìôÀà t`X [°@,-X Yw¼nœ,Ь;Ü8X X˜£Õ‡GqXìÏeÕ±ÑE–û³óíÿr ökç–ì×ì;|2X È, d höï€O6ûÀuÕÕ›*vÄì;e>Ñì;%À ]U]1ºˆU`ïfÑþ/öcíÿ`?t`Óð.8a1@N° $ÀÙ€Ò€Ò€ZLÀ5@8Ah1&W6£Î¸{3›ö °W³iÿ—{¥ ¤ ´¨ÀlN;À!-*èÀÄ, d HhQ€UÇ6Ql¹EuŽUWm¢ØbÇZX(Ûð‘êèè"Vi/ÀË€XºY}û/Ø‹Y,öBHHHHh‘ï`ét`ÙX:X X˜ëªŽ.bÕ8µU׎.bÕ8µÙµÿË5@8Ù,8Åv–LHHHh±×X2X Åv–Lh–€3öøÿ¹vÿ_˜“kª#ձх¬Ú^:Çr€eº¬>üko l°L³lÿ—§2Ë€%À©,¾à K¤°Ö*`;-¾ °DÀZ«€íd `­UÀvÖZl§Åo¼g­UÀvZ|ø½µVÛi¶`¯~nZ½¡ºËk€msnõ‘ÑE¬Ã^;G«‹«+ÖX l“«›éÿöªþ²zpõ¾5ÕÛd¶íÿÚ_¨úóêÕ;ÖP l“Ù^¬ý€šÎÜ¿zÓŠk€m¢p#ÞÞ^µÂZ`›èœÄ{ªV/[Q-°MtNáòêÂê—VP l€Ó¸ªúÚêgVðï€m¡°×VßTýðŠþ}0šÀ«¾«úîëÿv™À>ý`õ Õ5køwÀ¦èÀ¥M¯þØšþý°n:ô«ÕW6ã÷(0k³îìuàa|QõÕ§oàÏ€U¹YõÑÑE¬Ë&@Õݫ߬>kCÆG›Àl­s à†ŽÏxã†þ<8ŒY·ÿks ¦ù÷©þtƒ&ĬÖf@MèÕK7üçÀ~è¬ÁåÕE™ÀöÒX“ãó~zП§¢°F×VÎü¶Àš™À66Äü¶‰-€ º´úšÌ`<`Ã^Ð4?àã `Ñl ð;ÕWTï]‹¥0È+«Vï]‹4ûÀ¦†ÔgW¿U}ÞèBXŒcÕÙÕÑÑ…¬Ó¶vŽûû¦ù2ºãòfþð¯í5µa’ùlÆìÛÿµ NÌxþèB˜½Ù¬Ý 5Íøw™Àzél¡ãó~ht!Ì–À–:V=¶úöÌ`õt¶Ü%ÕÌüVK`<3óX-€ñ‚ê««+GÀ,;äÅM¯6?€Ã²°c^Y]PýãèBØi:;èµÕ—Vo];K`G™Àa,"lû4ÀøuõÂê¾£ `g«Ž´€+æsìwYõЦ‚°jÿšw¨éjàWU??ºv›F°)s5ÍtþúêÇGÀÖûåÑlÊY£ ØcÕo4yxÐØRØRï¨þSÓôÙÙ[J8îw›Nw>¼y€`Þ[]XýÝà:6fi êϪ·Tl™??'|¬ú™êâ¦gÃb,ù[ðƒšæœ;¸6ïuMgÞ[}xp-C,9TÝ»élÀgŒ.€µ;Zýjõäêƒkné ênÕoVŸ=ºÖâÕOT—f^Ìÿ'LÎk ÷]+q¬úí¦oû/®®[ÎöN¸MõëÕ¿]vYõôêg3wó¦—@£ ð²¦oûõ±À¼™'wEõœêiÕ«×'ÌŸùðñ^ßt…ï« ®`­ÎªžÚôaËZâ:Ú4ˆç‚|ñè±ÿ‹Ø²6¹ÞÙôßýy,Ü·6½·|ô_Ì–µÎõÒêâ¦-0®÷uÕÕÿKÚ²V¹>Ò´··8©‹š^m:ú/mË:ìz]õèêÜØ“4½Útô_à–µßuuÓ¡¾ûˆÓ°˜À.yGõÕ3«w®`çݹzKã¿ÕYÖ­ëšõ]Ôt¥XŽ»Cõ’ê_Œ.®wYÓëy¶zãàZfíÖÕ6þŸµìõš¦C}· €¹yÓ™€ÑkYëê¦}ý{À0GšÞ“>ú¡`ͽ½éM}·€­`~€µ®uÃC}gÀV2?ÀZÕzõÄês`'˜`f½ºzTuNìó¬ý¬+«§åPÀ,\˜ùÖ©×Ûš¶n³b~€õ‰ëºê…Õ9Ô0k÷¬þ¡ñkìz_Ó¡¾»Àb˜°ÜõGÕÅ9Ô°Xwhzmëè’µþåPÇü€y¯·V©>5øæÌk]S=/‡ú؃#Õsÿð²¾ÞÛt¨ï.À>œU=¥ñ2këM‡úÎþä_)ìùÛ¿®È¡>Öà[2?`×ë«GW·:ù¯ç?d~À6¬£9ÔÀ†™0n½§z|uÇÓý’`ÌØìziÓ¡¾#{ùåÀ:™°ÞuyÓ¡¾{íõ›ò9Õ›ÿ°œÓú«¦C}çîã÷wûÌ8ì:~¨ï~ûüì`¨[7½|fôƒt×Ö;šÞ±pÞþ?rØ7Ëü€½¬ër¨€™1?àäë#Õ%ÕÝüéÀ;£úÑÆ?p·e½6‡úX%ϸ:‡úX°¥Íøû¦àsûU|x°Ëæ>?àø¡¾‹šÆ'×›ãü€TO¬>w…ŸÌÎý›Çü€×4ê»åj?˜¯/©Þ×ø‡ø~×5Õ ª‡eü.Èݛހ7ú¡¾—õOÕTç¯å“€…9¿ú›Æ?àO¶þ°éðâÙëú`©¶m~Àû›õý³uþÐÀ4?àÅ}ðÿeõ¨êœ5ÿ¬À ©~¡Í>ô¯¬žVÝ{?p›šð¶¦7õÝv3?p:gT?Üzü¿W}mÆïÀÖúæV3?à}M‡úîºÙò€ƒú÷|~ÀVç ì¤GTW´·‡þ9Ô³ñÕeüÁÿÕãªóF¬Çíªlzsàªw5½—ÿkª› ¬ `«ü?*"7•¶2Ö[IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/512x512/gtk4-demo.png000066400000000000000000001226061511343406000262240ustar00rootroot00000000000000‰PNG  IHDRôxÔúsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/ IDATxœì½w|Õ¹ÿÿ™ÝÕ®ŠeÉ–l¹wË6n’+ÅÄ`0`ì0` ‡B5$—„›|“›Üä’üÒpÁ@RH¡W:„z[r/’­^¶ïjw~X³Î̜ٙÙÝ}Þ¯—_;sæìh´‚}>çiGEA‚ Ù~³ˆôÅE¦èÿ#‚È_òÁØëAb€ ÒƒAä…`ðõ A@| ˆ&ƒßΟcË— ‚ІAä6|'y,ýb"1@ƒ!@Æ&ƒï$CoÓ_V$â8$ÂaØ`ô­¸Ÿ]¢!Ý/ S_\$‚Ad|'yŒ|1‘ ˆ4 @Æ!?Û"Áèïü´¾ÐH… ‚È}£÷22?Û^ž/$a$ÂrÄàg[Xaì­ Çß@_ŒD@€ ,  ¾UsÒy•îþt¯¥ó$ˆ¼†A¤A–ãøVs»Aº¤cØí ƒß@_”DB€ 8qø*ßÌu+ÄB:Xiô­ ì7Ð&‘G rØàÛq續f3céü<õÉô¥Iä $¢Ÿvë§cÔÓ¹ÏuÌ;‚ÞµÁ“éË“ÈqH‹êñíX峯­˜Ë{#«t=ão¥8à¹6x2}‰9 ¢ ÈC·>¯73ÆsͼÀîs­gÑ»6p"}‘9 "¯!ƒ¯9fÖ[`³«ýt¯ñþlÞk'Ò*‘C òŠŽã«]³Ó¸ó¼Gk\ïz:uùj†œ×àÛ%(,@ä$ˆœ§@WùF ¾Ù÷óŒëatÕ¯vͨñ'!@ H9|®9é^ãýYfHwåÏ:N÷z:ç¼×N¤/Y¡ O»õ­ŽãÛaðí ð„ÒYÍ[=–î¹Þ8{2}Ùƒá8rØàk]³Â­ŸŽQÏ„H'@ÍH5èé^c=ŸÖ5µ1­qödúÒ% Â[ßð¹ÝÇjçfË•FVÍè&céþt„å "+¨ÁgeËÈóŠ—Êó¥“' ü²I*®± ·Ú¸™W½1Ö³R~‘w 2Bºõ³Çç5âé\g­ò•óµæ(åhx=£Ïãp’ oáxH¶‘ÅU~®Äñ•çfWð錹8æÙ!Xîþ¤â:8°Kðki³'Ó2‘AH–An}æ¹.~c­uM00ÆsMï9$äFYnì“hŒ•‚@M(ï©FPŽi½êñžó^8‘¾”‰ áÉö¹K»õ³Ç׺–î*žçšÚ*_iØy ¾K1GË+ ËØ&1Øà‹*?›eü“ŠëÊchŒi!=ƒüY”Çà8Oë¤ÿ¯HvC‚›6øj×x…€ÜúF\ôJƒ¯eØ]*ï‘Æűò^ÊÊŸÇZAË ¿(;VŽ+…¨¸Å<^Ï€Q…ˆ¼„¡Iºõ3eðåÇéz–1Ö—ŸË3ü•†\iüÁ¸¦' ,(½í¶ÛN›6mêáǾüòË;î¸ãŽCñx\2úò"€ –`ÐFóÒ5þ rO€\ð† ãBÀʰϹÞ8{2}q@ )ÐU¾™s«Vö¬±t ¾š¡W|éUÍà³ :kÕ/½¦Ž'Ož\ò­o}kþÉ'Ÿ¼pòäÉ ‡:&8|øð«ßþö·ï|衇šÁr¯+_@) ´„€–ñ§ü¢` P¨Ág™YÕó[áÖ×2øÒ¹rÅ/?æqÓ»cÊþ€sÇã¾ñƧ¬^½zÑÌ™3ÔÔÔœàr¹Š`!‰D"úÞ{ïýyíÚµmjj c ñ—ËÅËøë% ZíÐS;WÓ<‘¾Ä‰4!‡ä°[ßNƒ¯<çV|­kj«|¥`­úy ¾ÖªÞ-{¯K1.œyæ™U6lX¸páÂúñãÇ×û|¾Jd€`0ØüÈ#ü檫®zÇŒ|´…€Z² –wHO ð¼jóœë³'Ó—9ayBžuÝãé|­kvz=ƒÏ2ðzn}å±ò½L×=F^>VSSSü­o}kîç>÷¹Ó¦M«6lØD¨ÿ-l§©©é­ï~÷»w>øàƒ‡0XÈE€ZX€7Lh‹Ö1Ï+ï±Ö˜Ö8{2}©œÈQ Ô­o•0cðYcZ¯ÊU»Ú8Ë­¯JcÏW{5ãï \}õÕ“.¼ðÂ…'œp‚ѣGÏv»Ý^8ˆd2{ï½÷^·nÝCû÷ïá¸G ‰ãžen€ÜðóŠ£b@k iki³'Ó—;¡ €Áán}» >kÌ*#¯vlÄгƴâóé¸õõVýrAà–Íq+æ¸K–,©¼öÚkë/^¼`âĉõ¥¥¥Ã‘„B¡–G}ôž+¯¼òU7ü’PËW$úåyÒ5–Èv~€Ö3å–@À¡8ÜàëÍI׸³Æ¬tëÛ±Ú·²,›5–Ÿ‡ÛŸxâ‰û.»ì²009PîçÈû ¤“@a"¯ ArØ­o§ÁWžóˆ+ ¾Ö5Ö*ߌÁW[ÝË:0иì8¾«´´ÔsóÍ7Ï8묳̘1£~ĈÓA{2N")b_k M~46÷¢©# Àœ ¸jÅäAóßlhÇ´Ñå1Ôgúg·´´|ô£ýè®»ï¾{/ØÞ¹'@ÞdHið-11Ö«Ö1ϹÞ8{2}ù<$l†ÊótÏͬøÍz#n}å\£åy¼n}¥ñwpþù£¾ô¥/-œ?~ý„ æ•!Ë´öDÑÐÜ‹†&?ö Ö—4GM<õNÞØÙŽå³Gbåüx=æô‹(Љ>úèéË/¿üÁO?ýÔÁ•j"@nä•›±„ /XÇ<¯¼ÇZcZãìÉd S n}«€ƒÏÓzåuëÛYžÇ2þ×´iÓÊnºé¦y§œrÊ‚©S§Ö•——A– Çhlö£¡ÙÆ&?º‚1Ý÷h €W?kT”á¼ÅcQ7É|Ÿ¡h4ÚõôÓO?°nݺm8fèåòý”"@-YPÏ1pŒcLí\mLk|ðD2 “8Ü­o—ÁgYeäÕŽzÖ˜ÓÊóÔä»ÝnÏM7Ý4uÕªU O8á„úššš.—kÀz™&™q =„†&?š{q¨=£_<@bÚè!X»tj*‹Í<6 µµõ³Ûo¿ýî_ýêW`‹V3!©Tòˆ‚€€Anðõæ¤kÜYcVºõíXí[Qž'½ò¸õ•muµÊó®³Î:«ú+_ùÊÂúúúú‰'Î÷ù|åÈ2þXÊ­¿ûH‘xBÿMàr 8uV5ή _‘é°@òÓO?}îŠ+®øÃ|Ð…Á ‚ʽôvd鋞WÞc­1­qöd2  ²lðyæ“[ÿéÄñÕÜúFÊó¤U¼r|PyÞ¸qãŠ7nÜ8÷sŸû\ý´iÓê*++' ËDâ ì>@c³;›üèðG-½¿Q 1´¤kÁ©ÃL?C,ëÙ¼yóï/¾øâçûúú¤°€<9PY6Èj-Ìò°¼Ðcó¼òkižHÆ!ï!À @ãø¬13«zžãt ½üØ¥2Oé¾×rÿ[]ž7 TïÚk¯|Þyç-˜={vݨQ£Np»Ý–î gQuwëh !™´ï; ] 1¹¦ ž8£‡™oeÐÞÞÞøóŸÿü®Ÿþô§;pÜ LTóPX€È;H ë«|3n}; ¾òœçš_ëšÕåyÒ«Vyžš›ß­wN=õÔaW_}õ‚E‹ÕOœ8q~II‰ù%¬Iºƒq44÷¢±ÉÆ#~„¢æÜúF0+À%8yfΩ¯¹´QÅ;vlÙ°aÃïÞ|óÍN°óÔrXa^! % 1ÆzÕ:æ9×gO&c‘w¤Èaƒ¯uÍj·¾™¿YCoÆ­ŸÑò¼ªª*ïÍ7ߟÏ}ã7ÎXµjÕ‚™3gÖÕÔÔL!«­vIû[»õ›:BÆü®9@&€D‰×sêGáä™Õp™üÊèëë ¿òÊ+½øâ‹ïêêŠ`p8@î  ²Aùä\2.JN ?ïû Ù­odÕïøò<®sÏ=·æÊ+¯¬_°`Aý„ æz½Þ!È2m½Ñ”[ÏÑ¢ñÜsë!@bô°ca)5æÃ===‡xà{¾ùÍo¾‹cÆ]*T+T†ä^*$£€IÃo·Ñ·Ò­o—Á—§cèµÜ÷jãV—ç)Ý÷JãŸòLš4©ô¦›nš³lÙ²úiÓ¦ÕUTTŒE– ÇØÕïÖohö£+ ¿ƒ^>‘M ±`Ê0|~ñ -1ß„qß¾}olܸñ¾§žzªìA­²Ai܈7:càÇ˜Ú¹Ú˜Öøà‰N64Œ#@ ¿•Fßn·¾Ú<»WûŽ/Ïs»Ý®k¯½vêš5kêO8ᄺѣGÏt¹\惿&HŠ"¶…RMx¶‡tàÿc™Â |E.œU7 §Î·ËœC1‘HD_ýõ‡/ºè¢‡ÛÛÛÃPßdˆ•$¨ P~‘5%L~³FߎU~º_ëZ¶ÜúŽ(Ïà:í´Óª6lذ`Ñ¢Eu“&Mšçóù*e:±”[ב"±ÌµÚu:N5Ÿàı˜>ÚüÆ‹@ ùÁ¼ïúë¯ «Œv”‡”ã@úb€ç•÷XkLkœ=ÙI†§€qŒHÓø›1ü™^å[åÖOW1øFÝú¶•ç5ªxãÆ³—/_^_[[;ذa‘e¢ñ$v=îÖoïµv½|Âi@bþ¤Jœ·x,*Ë̇8ðö­·Þºéïÿ{Ž #» š ¨+_x(? Èº°Éð]íÛáÆWž[qlÄгÆ_ž@ذaäµk×.˜3gNݘ1cf¹Ýn/²ˆ(‡;B©lýmÎiµëtœ*ÀëqáÌy58mÎH+Âñ·ß~ûÑ‹/¾øoÍÍÍ!PÙ  « 㟮á·ÊÀ+Ǭ\ñÛáÞ7êÖ×3øÒ«Vyž|޲<8îÖO½oÉ’%þþõ¯×-Y²¤~òäÉóJKK‡#Ëôû[í6÷bWsÁ¨3[í:' ‰ê¡>\°t,fŽjú^Á`°å/ùËýW_}õëÜIPž# ôØY6heX€ç\oœ=™„@ÆÉаaÕoÆð[yž n}– Œ1¿Vyž2i/õ¯¢¢Â{Ë-·ÌZ±b…Ôjw2Ôÿ†!Ö—ÄÞ–@Ê­ßÒ½ôò‰\s&Tà KÆbøó§¦¦¦÷n»í¶{ÿøÇ?Ä@O• ê@B sd\X¼êÏ„ë^yžM·>û^mÜHyžÚ1ků[žÀuÙe—[·n]ý¼yóêÆ7Ûãñ#‹ˆŽt†Sný}­ô%è{ÇjrI@‘Û…sGbÅÜ‘ð¸]úoÐ ™Löýë_ÿzrýúõíß¿?¾²Ay>í6HØJF€AãŸiÃ洛½Ö5Ö*_Í}ÏãÖ·¼<€0wîÜòë®»nþ‰'žX?eÊ”ùC† ,ã÷¡±ùØ ¿±¹þ0¹õí&×€Äð!^œ¿t,f7_d …Ú~øáß^uÕU/㘠SeƒZahŒÉ_õÆxÏõÆÙ“IØJÆ€EÆß Ão•Ñw‚[ß1åy%%%E7nœqÖYgÕÏš5kþˆ#¦ ‚`n e’¾„ˆ}­ÇÝúG:ÃÆ¾}Ó䪘9v(.X:ÕC}¦ïÕÜÜüñ~ðƒ{î¿ÿþ}8füõº RÙ 4™„€-dDdÐøÛ±¢Ï”¡ç1øFÝúrî¶ú—_ç.Ïàú¾0êŠ+®¨¯«««7nÜ\¯×[Š,ÓÒI¹õ÷¶ëËïV»N'×xܖω3çÕÀë1H|ðÁO_~ùåÞ¹sgƒË3ÑMPí\ùjÄ `» `=¶ Æ?“†ß*7¾C¯ueÈ3åÖç.Ï›2eJÙ7Þ8¯¿Õîü¡C‡ŽB– Fû°«9€†æ^44ûÑÌýôò‰|•eEøÂⱘ7©Òô½ÂápדO>ù»K/½t;V PÙ $¬ÃV`ƒñOÇðÛm൮ÙáÖg|镵Òw3æp•çy½^ϵ×^;íÜsÏ­Ÿ={v]MMM­ËåÊúzÚ‚)·þáŽèëÀ¹ä“¨SŽ –ŽÅÈ óy¬---ŸþøÇ?¾÷Î;ïܶ'ÀLÙ Ô’ÒŒàyÕ:æ9×gO&!`Û@¿Y×¼Ö5ÞU~:n}– Œ1«ËóäÇî³Î:«êË_þò‚ H­v³¾ƒ^{o4åÖß}ÔŸ÷;èåù(Àípê #pÖüQð™ ˆ¢˜üè£6_y啸øã{1P(·Vë&¨–À€¶`ó¼òkižH"À¶“Æ_o,S.{³¯¼n}«Ëóä]·–»Ÿ§<n·ÛsõÕWO>ï¼óêçÌ™3̘13].—ù†è&HŠ"µ‡Rnýƒm…½ƒ^>‘ï@bJͬ=qF3hkkküéOú¿øÅ/`¬lÐÎn‚Г¿êñžë³'“0D¶€QãÏ»ê·â•wŽÚ\­U~ÆËó¸—-[6ük_ûZÝâÅ‹çOš4i^II‰ù,&“tb)·þ®#~„i½¼¤P¸§ÌªÆ9u£Pì5—*#Š¢øÉ'ŸlùêW¿úà¿þõ¯. Üe0²A¹8P €_PX °TdÐøó®þÓ5ô¼†]m%Ϛϛ´gºV d²lPOXPÓ<±…€@ËøËÏ•BÀˆ»_oå.Ÿ£&X]Íà«­æ•ÿR«ü‰'–Üxãs—-[V7}úôù•••£U>¯ŒŠ&°ëˆ¿?–ß‹nÚA° ü,œ:Ÿ_4å%æsîÙ³çn¸áÍ›7• ê]8±€„@¶€Þê_Ïøk­à•Æ]éêç5ð¬x=keÙ˜Ûív»¯¹æšikÖ¬©›={öü1cÆÔº\.ó>$“"´…RMxÑzD† `Œâ"7ή…e³ªár™ D_}õՇ׭[÷XGGGüeƒjay©`^— …!ìvµ=­WÞ2<å ^-K€[ÿ´ÓN«Þ°aCÝÂ… ë&Ož<×çó Uù\2F‡?šÊÖß}$€HœZ홇@zŒª,Æ'ŽÃ´Qæ7ãôûýÍ¿ýíoï߸qãÛè — ÊË” ²¼Ðc+Ç”ãÊ1­c­1­ñÁó\¤%,Êú7ïç5üZ†]™…¯eðÕD€ €{Ô¨Q¾›nºiîòåËëjkkç>|¼Æç‘"ñv ¤bù~jµKd樛\‰óEE©ù°Àþýûß¾å–[îüñÇ› P& RX 1,,Jü3jüµöÜŒ1¹ÑV®ÞU »bLÍwoذaÒ\°`îܹóÇŒ3Ëívgu=Qıôú›ðh !I­v ‡AÀ<^ +çÂòÙ#à6H$±þóŸ]rÉ%9r$õþJPðeƒ@þ «€Öêߨë_-ÙO-6/oØ"€u݃†>uý¤“Nª¼úê«ë—,YR?iÒ¤y¥¥¥æ7ü6IW0†Æ¦ã­vi=Âé°Ž‘>œ¿t(”Po IDATfŒ)7}¯@ Ðò§?ýéþo|ãoâ¸ñ×+T†ä^-!è‹Ö1Ï+ï±Ö˜Ö8{rž»@:«å9ñ—oiõîáwpWUUy7nÜ8{ÅŠõÓ§O¯¯®®žÄø}2J¬¯½~£ßÚC­v‰Ü‚€õÌP/,‹aC¼¦ïuðàÁ÷¿óïlúË_þrì’A*T›˜" S@MðÄýYÆ_é²—Œºòk\2úž/ùËã/¼ðÂ…sçέ;vìÇ“õôš;é&<ûh="Ç!`EnΘ7§Ï©Çmn’L&ão½õÖS—^zéß8Ä1€2 ,d |É(o€€wõ¯óWKôSâXnø‹¤k‹-ª¸öÚk.^¼xÁ¤I“êËÊÊFðÿæöÐŽhµ ôˆ<‚€½T•ûpþ’±8a¼ù£`0Øþ·¿ýí·6lx ƒ½étd• ò†r*,«"ÀJ`Ôý¯çúgeë³bûE8¾²÷È΋***¼·ÞzëœÓO?}ñ´iÓVUUMAª&È }‰$ö¶S5ùGh="!N?ç/‹ªróN̦¦¦¿ûÝïnzðÁ÷ÝM0ÓeƒZ߈€„€«@º±-€ZV?ËøK¯^îeË–U=òÈ#߯©©©Ï¶Á€£]‘”ÁßÛDœvÐ# ™Ããpúœ‘8c^ ŠÜæ¾ö’ÉdâÝwß}æ²Ë.ûËîÝ»ý n‚yÈ–0Zê§æö—¯ú½Þh4úˆ×ë5ï÷bŽ%¸õ»1;~ Aä$œAEi>¿x ê'›ïg‰Dzž|òÉ?\~ùåÛ‰DƒËŠÊЀ™²Ál…òRp KÿÒ‰ýËöÈ€Wñ¯8?êñxJt!’IÛC©&<‡ÚCH:ïïGކ€³˜:jÖž8£*‹Mß«µµµá'?ùɦ;Ç=za­²Ay΀ÕaGxœ&t€ÅÿxD€[q,òØ¿ý+ÿþ×âÞÞÞ{ËËËGkþBtbØÙÔ‹Æ&?v B­v Â$œ‡Ë%`Ù¬jœ]7 ÅEný7h Š¢øïÿ{ËW¾ò•?½÷Þ{]`— j‰€l‡2î p’°+S^KHçjÿ 8VzXùîÞÞÞn3íÇñÔÛÍø÷Á2þAä%ɤˆW?mÃíïÄ{{:ù}Ø AæÍ›wÎo¼qï£>úyŸÏ'-Êä ´T•㟲]»rïÖnò±JÛî?` R;–ÎõBáªpl¨—1ì.•ÓúõÞ#ÿ£Jãò¼€A-~c±˜©ÀüÄeøï/ÎÆøêR3·!‚p<þpyí îÞ¼ MaS÷òù|å^xá5‡þÕ­·Þ:@1 yΖ–P~¯³¶sW.ÕÂÈ<Æž'T­<†â=Ê1]['ô£7Ïn2]+¯NÐú£(ÿàJ…è‰F£¦ ܸqu-Κ?Êì­‚ Ï¾Ö ~ýL#ë°éF«««§Þ~ûí?ûä“On:ùä“Gâ¸@î ¿ÊúJ!ÀúΗoñÎ2ü,ï€ÝÞY7î_ëÄêèŠF£–¤æ pvý(ܰz:<®¬7$‚°•¤(âí¸ýñx{W‡©°aöìÙg¼ôÒK÷<õÔSç—–––`pÒ¶Üð+{»°¼JA à5þÐyU<Þm.O€Þ;±Ãº±>0Þ÷i¹^´¼n®p8liË= QH"}xøCøÍ³8Ô2u/¯×[vÞyç}íСC¿þÞ÷¾W‡ca¹G@þOÙÙUiüYa­|+<Z‚Œcµ€&Ù™ZÞòºþ•ç¬?„RHç®H$byÏ] QhláŽçñÈ?!hr‡ÒáÇOúáø“;v|ó´ÓN…c"€• ¨ì𪖠¶1œš‘ç5þàxÕ:f« œ%`•àyx-C¯w®õKý‡‰DléÎC!‚ QÞjìÀíOìÀ?w¶Ãdñš0sæÌå[·ný¿Í›7_T^^.…¤dA)QPú§ °òxÂV‡ôë\mlà„,ˆ€LVÈÇô>0–Ðúç«CJ($@D¡Š&ðØ[‡ñ«g°¿-hê^EEE%«V­ºêàÁƒ¿ùñ¼Ãr¯€ÆÊ•!-[Ácøå1ë\mlà„ ‹',gõb*ªŸß ¹€ÿG?BßÎi=,…‚(Dš:øë¹]øÛëá› TVVŽ¿í¶Û~ØÐÐð³Î:k ç]% ýSºÿÓé`EHÀrIÌ­_NëCQ»ËÍ¢õžA°P(ÄèÛ³­‹#ôÐC<Ó?@HàF Q@ˆþµ»·?±¯}Ö†dÒ\\ ¶¶öäçž{îÿ¶nݺ¾ªªª =r!ÀÊP ÈóÌzŒˆå1ë\mìøÅ z²i½ÔŒ¿|Lï!ʯñz„ÒRˆº.¿Ý_ûÄpzM0&PH€ ˆ$KàÉwšðËg°çhÀÔ½<oåÊ•—ïÝ»÷Οýìg'b Pë&(:‚À› €Î+ËŽ±ÎuÉ”HW}8µÖè½Õ p ‰à méRô54ð¼u ¢P9ÒÁÿýc7þüêô†Ì¥` :tÌ·¾õ­ÿ·gÏžïžwÞyã1°› < ì(è;!Ш7Àlx@Žžе¡™Nð_ó¬þyæ¡··—+ ÿ÷¿Ñºh‘5!·>R‚ ˆÌñÁÞ.ÜþļôI+&ÃS¦LYòøãßõÒK/]6bĈr ,”¹P†ÔZ «uÔò @ç˜õª@YÙ 1ËBë)$@Dá'ñì»ÍøùS hlö›º—ÛíöžvÚië÷ìÙs×o~ó›Sp\¨‰7ÔE€øào½õÖW§M›Vv‚ «lPÙIPmC!­°瀾‘O;`‡È„5²"öÁRP¢âºØÓÓÓ'Š¢îUF`UH ”BA4}‰$¶~x?{b'>9Øcê^.—˽téÒó?úè£{~ÿûߟÁ „Xùòcµ\e’ Zy cZÞå±’Œ†¬z¿”e¤6®4úòqâñ¸®  A!‚ ótbøý‹ûpÿ¶½hWiiéð/ùË7777ß¾aÆZ ,”{äeƒj}$÷¿KåUOÈÏY¯`ÌÉ NóG§›P˜º‹Ål…‚ ¬bgS/~öäNl~ÿb}æÂ£Gž}ß}÷ýòÝwßýú¬Y³*Án'¬Ü[@Pk,@Ý &ÒI„Ϙ(pB ë—×óX˜‚Ë` P AXC")â…[pû;ðÑþnS÷Á½páÂ5ï½÷Þ½=ôÐ9n·[j)Ì È½E`W °VÿZ%ƒ©Ga›2îVçäÚòSíÃM‰€X,¦›bjÖ Dz@…‚(lz‚qüñåý¸gËn´tGLÝ«¤¤¤òÒK/½¡©©ég×_ý,¨W H¯ràÁÀD@V¯¥ýÔJ„Æ«ò˜un ¹ ô>éÌ„”X¨£Aì>À/žnÀ3ÿjF4n.,PSS3óŽ;îøÅ|p]}}}ÔE€düå"À…áåê_~¬ÄHu7VzrÉÚ¨ýÒ¢ü:—ÀçÜn«žëØCPH€ Â2I/ÚŠÛß÷÷v™º— ®ºººUo¾ùæ}=öØšþ°€Ü# ¯o-,OTŠ`°0 Ȫ —€EïÖ$%%V<Ó ($@a½á8zõî~~Žt¥·¸’ðù|åk×®½îèÑ£¿úö·¿=ê» *«$C¯•`$'ÀVyœ"x2%õ®‰‰D,ïhËBk($@{[‚øåÓxâí&„c S÷ª®®žþ“ŸüäŸ|òÉͧœrʰ½r/€”ÀÓ@‰‘òÀŒ–f˺¤ûKê…Äh4jK7@£X¨¦A„DRñúŽ6Üþø¼³«“íæDaöìÙg½ôÒK<ûì³k}>ŸT- V%À ÈCz0γJ®,/õ>´Ô‡‰D¸€ÞŽ€VaÙö ‚"}øûqçs»p¸#dê^EEECV¯^}ÍÑ£GïþŸÿùŸ: 4üj9¬’@é•…/€ò}¶‘+€…Rü‰D^`·@Žé($@¡ä@[¿~¶¾yÁhŸ©{UVVNý¯ÿú¯_îÚµë¶sÎ9§s¤jµAʲ?3^€Œy œjMR­}U®)Sc‘H„«§¤9,¬ üpýlL A@7:ðÓÇwâ͆ˆfâ€0mÚ´•›7o~äí·ßþ ޝþ% ì°™÷Û 5œ*Œ0àχç|à´xbÚ!_‘7PH€ bÁh}ó~ýl#´MÝK÷’%K¾rèСcàÞj›úž€?‚qœqq‹ ÕôG@ ‡Ã|UYÿøc AØÀáŽî|nþþÆA"æÂãÆ;ý–[n™†Æ_ÐêþÇ"ë+‰\±zNÔõP(äh€…‚ ì#‘ÑàZjróÍ7_ ¶ñç©ûçõè%Ú‚'“?Ì”Íðýų-$‚<€Ø;ï`øÃÃ3c†á÷K!­ÅÖÚð„AÎÇëqáÔF`Á”aYáƒË¢Ž¹ÕÕÕsq<ÀqÄñP€d‹¤q½…«š7›k®Ô HÓÏzÈ–ÐJòÓz.Á`Ïá$@-¤@å¦M(½ôRÃï—B³Æ ÅÝÏïF_Â\ïl‚ ˆ\`X™§Ï‰Ù㇢²Ìk×qÌVöÿq\¨Åñ•öKnÐÕ„—@AHW8Ù ö ±¬[jn®y$Ä@]—]†ØË/£âŽ;ÒjU|,$0÷n݃mæjc ‚ œÈ¤‘eX>{¦.G©×Ú=]X„B¡N÷H"@-æ/m¥ñfv®Í6NFˆ~¿?'€Dðþû{ûm!…‚È ¦ɵÕ_]‚¢ '>wvv»P^¥G–¿j{–'À”GÀ¹*D0âÿÐÓÓ“Ó A…]ñütèíííÆÀM€Ôêþ¥ñv@; œ"ôr¸?¤îîÐc@Hà7¿P\lø "WÈP<ß0===¨wÿceø+ÃPŒK(¯e\ è QE«¶L#ˆ@ìîîæò¸”¨…U!mÅ á 2ÏO‡ŽŽ?÷þçZî|^lNñ¨¡tók&@ggg·”X8«nfRH€ ˆ,’íx¾Dgb?"ÉŒ)š¯;·½½ÝÁþ¨Õí«‰@Ýɰ+@:¥}fžòXlkkË;PH€ ˆÜDŠç×O†šÊìÄóEˆhŠ¿†ÈVìŒnA[_#V ùO.päÈ¥@B¯ Ò³ŒzVóœî`¡ô Hôûý}¢(&AД–¹&$¬ lÿè(þñ…‚°žae^œ6g$æLÈ^<¿OŒboì54D· !² dë€ë¥®*®û8p Ш×Õ*㬄@ KŒº½Ò™^í«Á¬ˆÇãq¯×ëÓzc® ÀšÀÊù£0sìPÜE!‚ ,À ñüP² ÑmhˆnÁžè+ˆ‰êžÎR×p®{644È=P9Ö3üñ÷²ý´¼J—®q·MX!x ¸ÚΪc±XL·0—=r($@D¦ðz\8uÖÔOqV8bÃDîBñüìã|ð úßýÁ`PY DY™–sB!›ÀŠŽ€ÌÝï÷“ÀRH`Ø}÷¡ä‹_4üþc!Ì[N!¢ ¡x¾óàM ò&@ò…iN{Nó(1R˜¢··—rL"è¼ôR”½ü²ùÀ¶=8ÐJ!¢0 x¾³á-ìéé ‚ß#“p QEA°]ºªyôÊÿ”sÄžž*´KBçRH€Èo(žŸ;ð6êîî–<¼%€9‡Ó=Ü] ³³“€…PH€ CñüÜ„· pWW+ § ¾«€•;ýÉï©v.?–¬ŠØÑÑÁ•à"À …ˆB‡âùùo@[[›r# ½MrŽ\ñ(aÕdJÇèèè *› QHPj_@z%éi5¯Kcž%d;Àj.æFõ=”h9V…^ø¸Ï¿O!Â8©x~u)Š<Ï'Ž#@@‰«Rw^0T6’ãHcžN¬ÐkŽ®w ‹é{Š‹— H’ËÙJ¬ œ9¯3ÇPH€Ð‡âù/%®J¸ ï J€V(@>GG‰‚l +sä””¥ˆÅb|•”@ ’»Ùj($@؉“âù;#[ÐÝNñü€· ··Wêh{¬Y#€'æÏShèZ$áÞ€}PH€°Šãñü!(õegíBñü܆·@¿ÔcþŽ1ì¢(¦ý,N ¤30òïØÖfýS)($@¤ Åó +áõtuuÉs”ýgòfS ' –'€w€An@•Á²ÀçྭÈW¼–ͬƂ©Ï'¬‡·@GG‡² pÚöÈlNZþ¥yC´!Pf1ðPH ßÇó+˼Yé/Nñü€w'À––µ&@¬E¨ž}rl¡l +U«Âá0yJü£Ðºh†mÚd.$0¶wm¦@.2¬Ü‹+N›„éYçoCCt+Åó Þ€ææfµ€xšü)Ìjå@®x$ô”Tjœ€³ý~ó!* ä*Ÿ›5"+?·#± ý®}Šç¼9û÷ïWn¤rfÌ3"2ZH‘k@ y¢†äà« f@Y…Bù‹×ã¼ Y}Šçrx@cc£ÖVÀÛÐgͧ‹ÝÀêzù«æµP(D€BùC*ž?~(*‡8!ž¿ $UùÇàIL$‰ýû÷‡1° @ïKÅHÿǧxXy•S9…r—‰#˰ü„Ï' Ë›É1c¸­Ê°§9r1 ÷¡°T™@ ƒ$r äõ“+qÒŒê¬ÖçS<Ÿ0 çF@ò&@6™SœËÃÎj8fµÏ"ÛÀªJ€Ar àîH8 8ªÏ'ràƒWÐÿ¾ïßÀ®»£A¶éôXý~?%æ0©À+¯ â׿¦@¨,+Âisj0‡âùDÀÛÈï÷K©ù#[[·EQÛe¿šG€§´bÀœžžž(Ï$€³ nÚ„Ø[oQH CP<ŸÈWÒÜ8žÈÓÈH2 ’Œ‹‹\ðHRa===”'PHÀ^(žO¼M€º»»ÕvL·$б^;€•¥ò{*ϵ>t±««‹@aUHà‡_œƒM x>Qˆð¶îìì h\f%l#o{_3;¹å`!ÿåÄk:;;) 0I…yžéÓ ¿ßÛxñãl. €âùr^ü¯~•å§ Þ€¶¶6ùN€¬ €œkø£†Y`Çj?gôhmmåò¸( 0ç°½ðúõ†ß/8c^ fäyH`âˆ2,ŸÝx~T À' aŽD&áÍ8zô¨HÊ^•Ømô­îCÀÄ IDè‰ eí%ëZJ¡ƒÁ¾d2™t¹\šAMòä&¢ß¿f´7 IDATÎ/~ñXã ¤pZ<¿ÌU…u•då9BoÀÁƒåêTÍîðöüWÎwV o€ô!XÙXõƒÇãqŸÏçÓº €Ü¦ÐCEn–ͪÆB‡ÆógŸ“ñç!¼€½{÷ÊCrÒqj%òˆ[…ƒ€L‡%Æb1@¡…œϧú|"×àÍرc‡ÖN€Êr@å<£e€YÍ'Èd@Ùâ—Ç[ W÷¯YÇuó¨P~ï!'Äó¥úüÑ-Ø}q1œ•ç ˆtàñD£Ñp(Ò2òrÒ-õsL8À 9,xòt?üX,¦[ @€ü"ŸBΉçÿ Ñ­TŸOä4ö¯äY;ò4ÿqŒ‘ש@N:*K ’(L¬ ÜýünÄú2pz<Ÿ rJ\•ºóûXÕÌGï>Y NF’ •cJ6b±˜~ ¤À\?ÂaXøïõö†*ÊŠpúœ‘˜3¾‚âùa%®J¸àÖä;ÊQÆ÷s~'@ s€eÔäè}ÌëÑh”¯`I ÄõÏGœ˜X]†ås(žO™‚· # V§?99Óë_'zŒ¢š F¹w$¿8!$P7©'Ϥx>AdÞ===’«•è8n§ 5OÚ¹òxÀ\n@yyO¦CN‰çŽ¿ŸjÊCñ|¢PáõtuuI=$¤$@æž3Š·›IÌŠ¸pšÐÂh™…È P0Ø x>A8ÞÊ­€%´jÿ•×sÆSm`¦Yn+Æp8L€„•!§ßmÆ)3ª)žO†w'À––V`ù9'€…å¢ÀìN€@ö@:pwaŠD" ˜XøÆÙÓlx:}äñüƒ±AL«K)A¼!€ææfy ƒí‹žñÏ /@. D"¯€v,\̆2Åó "}x“÷íÛ'yX± »{Æ~f® -Õ5È …(@èb6$`Ï'kàõìÚµK™8 ·L¾‘ ÀçWÎÓÚ @Ë # ¸°"$`Ï'ëáIL$‰„ÁXLb àýë-X³ŽS=Ê&AZ°:2‰Ä`0HÂÁM›{ûm øáŒ…(žOöÂã…Bò6ÀJ —ƒÆƒV¡Ö¹å8A˜©ßcÜ€rñ?´5$ "‰Ãñ(žOÂÀF@€ñ¬~#%€ŽXùK8AðN¦¥è÷ûÉ@¤…Õ!ŠçDvð>xýïø`0¨Ü ÿçqç;ÊÈkaHˆ¢( ‚í-ÍÔ<<宑 Ì"…F¼ö„!C ½—âù‘}x›õööÊÛ{²JþXYñ;. W<†>¬ÞÞ^J$LÿðC$ZZàáR<gt ÅÞ¥x>AdÞ €ÞÞ^V0Æ²ÒøÇìVÄõY÷Tž³²5Sc===ä 2ÊŸ:×£;q(ÛAD?¼=º»»õvTk”³dg[2û¥ÙÑÑAI€A oàÎÎN­$@³ÆÞ‘bÁ à”_lÐstvv’€ ¢€áÍhmmU&Ý 0çpŠÀhcVf¦Òu#¶··“ ‚(`xsZZZü*—Œ4ü1š+`džåX-x“#¬ü…Uï ÉdR7 ËE€ "/áÍ8xð 2@Žj®Ç­-7ðVìdÞ`·ÒôŠÇãº^òAä'¼€þ€x }N5ûÑÂn`¶~ROaé–lÄb1ÝR@J$‚ÈO8sÄÏ>ûLžÈòg"îŸQñà”€tàReñx\_€ "/áñD£ÑH8N` ]aõþÏÆêÞ¶Ÿ™+ ÝÄ ‘Ë@€ "/áɃò€”IåVïèœ*ÒM¬Ô¿9‹QAD"@@‰«Rw^ÿ>€úbSk'@å\-x“3"2)ôš+˜ý@˜×£Ñ¨¾ ¤°}‹‚ "“”¸*á‚[wžßï—<é^£^£×l飨&òx ÇDA‘7ðVøý~ÖN€jñ­…«£]þJœ(Œ¶ad•l¤àñ ‚È7 î ¡%À˜§uu¬5–Qœ(´0’X!£Ñ(u$‚(@x=]]]ò$@9ét÷˺açÅ À̇¥+HA&¼uttøaÌýŸ3F^ '€tPûðýñÂá0_€šAä¼µ´´ûµ\õé}ÇŠ…\g'AòA&¼!€¦¦&¥ ïwrSð$e¤æ„B!.@Aä7b‘nÃ#}²F¦@º†V–¥VLF.¨ € ¢áõìڵˊ3’éoÕN€€³=F2/%WÍ ?R8¦AD“H$ƒÏÐ;¢ƒŸU8EØö¡>@I€Ay  C<+ùœ2ôjVºŒþhƒã  A <9¡PHÞ0©x•c·íËx³ §x”¤÷gÎáö ‚È<‚^Aÿ{=(›ÉmO€’œéàT …¡®L~¿ŸADÁÛ ` Á—¿êíÈ‹^ë`ù¼Œ`§°ã—ÐjÕÈLÞèîî&@Q`ðVôôô˜Ý ç½Z ׬y rѠǵÖÓÓCI€A†Á€ô ¹f¹¹Ê¹ã±J8ágÖevuuQ ADÁ»@gg§r'@V@%z«~½Pµl¦£<F,’:÷ ³³3ÊóÃIAä¼9­­­ò&@rÒ ä vÞ$+?XÕûµ¶¶RADÁ›ÐÒÒ¢LTsí'ç,rJ0dÃ`ô23_ ‡Ã‰d2™Ð{“‹r‚ òƒûØÕáÏÑ‚ ÀŒZÒ h)¶ÔX<×Í ADþÀëØ·oŸ$”-åyûýç,NÊHݾ±XŒADÁ™ îØ±C¹ «öŸ·]m.ógsγ\évdãñ¸n ‚ ˆüÇF#áp8¾î²Ò1¯ÑϺ×ÃÉÀLÌERpÈ@QhðäƒAy`½EfÖ ºÕ{ñdZð¨+£ï×½Î%( "/  ÄU©;¯@Ýàqñg] ÅÉ%\î~ÖX,Ó””¤û\A„ƒ(qU·î¼@  ¶ »{VBN¼½Ô޼?‰èwAyo@oo¯ÚN€jI€9“àǃS€F>Xn@yAù€Á}€Áå¬WôJÖÓ}¿-8E˜ù¥uÿHÑh”ö ‚(x=]]]J€V8@B-G€5uÌ:Ï(NéÀÝ(ÒŽ€AïF@ííí’@ÏÐË_•Ç¬óœ —À™‡)@Q ¤¹P´ Y`¶®Ÿu/®îLáp˜BAo ¹¹Ùm;’×8ÑN¥f#‡H$B‚ ˆ7 ðÀò>Z‹Í¼Û p¦cäUnäz?o€v$‚È}x= j9f¼×ŽÆIÀ¶‰@ @!‚ ˆ' ‘H$>ÅÀ&@Žjýk7i «û[€¦[& Q€ ¢@àñ„B!y „$’Š1`°80Ò&X‰#l¨“<JxËü´²,Eƒ$‚ ΀Bà·%jçFƇÝÀŽÁ°âòûý ‚(<‚^Aÿ»\¶Àvý«µ˜ÏŠÁ·Ãóîd€Xî˜ÔXooo”ç&Ôˆ ¬£H(ÁÏ<ˆo·ˆH@€½#òÞ~¿ßÊs…÷Gü_-Oèôôô€ 2@¥{¦ûÎD­ïLLöžà4G€ K.ÇØ[hŽœ…§$òÞ €îîn© °ÜfÌN€€µÀ ŒŠ–:4Æí @†pÁqÞ…¨í7ú#=3¹ÞW홆¯V=ƒ—ý¿ÀëÁ» jvb%~x{ôôôCòš½€9ã%°K˜õ轟·7³”HQâªÀ4ïé˜î;Ó}+PâªLë>náŒòocºoï¹݉C?)QˆðîÐÑÑ!÷Xáê×K\O÷ý¶‘M€ôËZ6`*µŽŽ „ FxjûWù+1Þ».¸-»÷ï\S½Ï÷~†¶ì¾Da›ÐÖÖÆj$?×Ú@M8°æ±ŽYç'S@¹¢7ëêg]WýCµ··S AÀ#x1É{Jʵ_éoê~"’ˆ‹axöÿc>¡çWüµ¾3ñLï"œì6õóˆÂ…7àèÑ£Ê$@-ò²ArxÜý´•ë<% Âáp2™L&\.—æ²…<D!SîªAmñ™˜î;S¼§r•Ri{±'ú £Û±;ú"çUü3|+UßsBñŒ÷.Æ“Ý7bOìUS?Ÿ(Lxs:$•Ê•É(\yfÆŸÒ8AAM…éþb±X¼¸¸˜Aô#@À˜¢º”ktÑÓ÷lïÛƒ]ÑíhŒnÇÁØ;H``ôí¯]Wbaéå8»üª£ÜUƒË‡ÿo‡~‹íþ£Oärà~À¾}ûôú¤ƒÞ}%œ.xB\áx<+...Öšè"@ä9>¡S}ËQë;Ó}g ÌUmê~ 1Žñ·ÐÝŽÆÈ6t&öë¾ç½ÐŸ±?úÖVÞ…±EõÌ9œXºS¼§âñžëp4þ©©ç$ ÎqçÎR«»¬üh€Fõ›¹\Š‹!F"i?AØ…W(Ådï2ÔúV¢¶øL”»jLÝ/‰>н{,/º m}»,zÒôÙùÇÞÇ*~‰é¾ªóæŠ–à‰ž±/özŸp2¼½½½’Pƒ•ðÙË…€;Îfuÿ8±XŒ¯pY Â1TºÇ§šñLòžà5u¿P² »£/«Í½äÈt ÙŠ‡º.Ç’Ò«°²ü{(ØÅ;CÝ£qÅð¿ã­à}x!ð¿õX΄WÈöЪȻÞÿJœ$Ò»Mc$áß £Ã‚G#ã¸àÆxk¤g†é{¶ôíH¹öÇÞG žÔ~Þ ý{c¯amÅ]S49G€€“ÊþS|ŸÃãÝס¥oG†Ÿ’p¼M€:;;åÞí0ôYíëàìÀ“P" ‘yJ\•˜æ=µÅ+1Í{:J\¦î#Ø{£ßµ¿=§³æÛûvã·ŸÇiåßIJ²k!ÀÅœWã™…¯U=ÿ‹·‚÷YR¥@ä¼µ··Ë=òׂª3Í´H×ͯÕ~Q-;Sé  Ç0Ò33åÚç]hzsÞÄ‘”Áß{ q1ÂX Äñ‚ÿ±+úÖVÜ©º/Gðâìòï£Öwžè¹½‰#~R"ÛðnÔÚÚªl,G.xcÿvT ØŽS=jBÁh'¦Ô%“ ²†Gðarÿæ:Ó}g¢Ò=ÎÔýD$q8þ#Û°+ºGû>³èIËÁØ;¸§ýL¬ú#Ô•¬S7Ù» ×T½ˆçzoÅ'‘§3ø„D¶áÍhjj’·–P–r‡˜9Ðë3‘àT Lj×@ú£ ŠÛ„ÃaÚÈ(CÝ£0½¿Ïþï2 æÊLm®ór<ÿE„’=iîýx²ç&4F·ãóC¦Zó]âªÀE•÷¢6|6÷Þ†ˆè¼dGÂzxs<˜‰»ò—pš°¢÷?“P(DÂvFÍÁ‚’KQë;£Šf›¾_{ßî”kÿ`ì$ÑgÁSæ>ŸEžÅ¡Ø¿p~å˜êýœê¼y%k1Ñ»OôÜ€ý±73ø„D6àõ466ú1¸m¼ÞN€¬1Çy-Ò¢(Š‚ XÕ¿ß 4Ý5áp˜+ 6"ÌpIåoM½?!Ʊ?þ&vEŽ}žÍu ²îü"––~g–ÿ<‚9¯Â=Wÿ Þ‹?EBäZ 9O@"‘H>|8cM€ô®ñÜÇqbÁi%Z¹zÍŒƒAòŽ$líß\g;öD_AL 꿉plŸ‚·B+¬¼£<'0ç pᔲo`ªw9ë¹m}~R"ðxûè%íe¥ñO¦È„0ÓàGëžjçL1à÷û© H Áëµ´M´´¹Nct£Ûq$þ1•­™¤µ¯÷w¬ÂŠ!·â䲯«– Ž*šÿ¨Ú‚mþÿÁ;¡ßÑçžgðä„B!V`­j20®çN÷Aëˆ`0HI€7®šŸ{.Š×¬AñÊ•ÊÍn®Äžè«ØÕŸÀgçæ:…JBŒc›ÿ°+ú".¨¸î±ÌyÁ‡UC„Zß™x²ç&ú[ä Á¯ ¿€ëß@ÂW}Έ«€«ýt’:RˆÞÞ^ êŠ,@ñêÕ(^³ÞE‹“).]‰©¾ý±Rì9Cìý÷´ŸÕÿ‹¹Å¨Î›ê[ŽoT¿„gz¿…Ï"Ïeð ;àí ØH™Èò&çTm¿œè0*"´þ8©×ÞÞ^ ÊÊà[¹ò˜Ñ_½îÑ£Mßópü}|y»¢Û±¹N¡{ñX÷µh,Þ†ÕCoG±k(s^‰«ë*ïLJá‡ñ|ïwÌy„ó1¸€šO7Ñ/'÷ °S˜õè½ßP‡¦®®.‹È?þd{»EOJä{c¯ážŽÓ±fèO1»ø<ÕyÓ}+ðêñtï7±3ò >!a^ÀÞ½{Í쨜«…Q‘qœ$¬ì! ¬ïÄãñXqqq±Ö]”è\.x—.=ÖŒgÍÍ›gú–};w3øÏ>‹èo}´¹N!Nöà‘±d;ÎúcøvçR×p¬¯üÞÿÿèýÔ®ÙpæˆFvô~Î÷Z! l'[€§Ä§Pí³¬#‹é¦õ’ »¸*+á;ûìc+ýU«àª®6u?1Cìå—S®ý¾½{-zR"Ÿø(ü(ÄÞÂwb¢w©ê¼%_Ä$ïIx¢ûzŠ¿—Á'$ôàñD"‘h8N€ÝHËÐg"10£8ÉÀKÚ âñ¸n" €Ìã™9óØ*õjø–-<æþ³L=ŠèsÏ3úÛ¶A PsBŸîÄa<Øy!N)ûN/ÿÜ`— wOÂUUOâµÀx%ðkÚ¢Ù!ðä(64JÇ5æ©]gke§ £ñM…FÉà¯ÞåËS®}Ï”)æn(Šˆ½÷Þ1·þsÏ!öÞ{€}½3ˆD_=eôûvî´æA »£/ážöøüПcVñ*Õy3|+ñêñTÏ-hŒnËàin$O4²`ÞK@ËUÃÊàô/‰ðo ÜÙiâQ ÏÔ©©>ïòå¼^S÷K¶·#òüóÇ\û[¶ ÙÓcÑ“Dú„’]ø{÷WQ_²«†þ^].\æªÆ¥Ãþ€wCÂÿÃ~Ò„· Pgg§”ÀÂHã¹FæeŒl^7¿|žòXë=ªŠ+ÊÐÄãoÙ²”Ñ÷Ìd÷T7Bü£Rez±·ß’¬ÖÜ‘}>ÿ ûcobmå_´HuÞ¢Ò/a²oï¾Mñ2ø„… ïF@íííRIÖ _iÜõ*äs-ÅÎgz¬l4à¾áp˜Ï@Í€મ>¶¹Îš5ð}6\¦î'†Ãˆ¾ðBʵŸ8|Ø¢'%ûéJÀï;.À©CnÀò!áRù­rOÆW«žÂ+_áµÀoD"ÃOZ8ðæ´¶¶Ê«ô ½c;øY…j$µÌN"‘y8)š?ÿ¸kéRÀenߨÄÁƒ©UþÿßÞ™‡IUœûÿÛݳ³Ì£æêÕh¢&1‰WEHXFQq÷ÄDÐÇ%¹¹JHb|îM̕䗢(’(» ^\@`Ü¢Æ-*û°h”a¦g†Yzÿý1sfª««êÔ9Ý}út÷ûyž~Nm§çÌÖï·Þz«Þ@mmW†=‚ÈR¢ˆàµcs°'P‹Iåó0¨@¼•Õ‹Œîû+œ^<Ïùÿ ‘Ïœ}ÐBõÑ*\Òïw8¿ìÇÒq'Æ]•5x¹å~|رÂÁ'ÌtcöïßÏz¢Ü•%ÝF߇%%b±XÌãÑÚÛ•·¾îšLO”' €x|§œÒµ/Â:M‚)Q¿—_î2úë×#zôhŠž” ÜK(Ö[îC]`®*}¼âã«‹<}peùC]Û[~‰ö(§ ]@]]]+ÄÁ|2÷¿•ÀÀ¬#<2Të5ÂÀ¶¶¶ü>І ë™å~÷»I¿exÇŽÞä:o½EÉuˆ¼¥.PƒÇÆàÊò‡ðâ*é¸o–ŒÇ¿‡µÍÓ°;°ÙÁ'Ì]tb"‘H¸¾¾>Ð]•{+GþªÈXà Ü* ™ç@¤¾¤Â ½½]KäRF@ï€]Éu&L@ÉøñðÒs•Ɉ¾ö:_|/¾ˆÈ§Ÿ¦èI "ûi‹6`EÓ-\v3.é÷¿(òˆ'}½Ç㇖áÝö…¨iý=B1:w$t<mmž·ŠÆ IDATmí07ò:ÆßJp «ã Ò!dÛ÷Tã¡1Ž+C™Çùرcúçd1gÕëÚ><ùä:‡u¹õ_z šÄòiÁòAû2|ø;&UÌÃI…çJÇ -›‚¯ÄêæŸá`èŸ0·Ð‰hoogÓËÆùÄR4&«qÚÀ +bõ ènÕˆë;vìXN.xŠ‹Qüýï÷ðvZro‹!øþû=ÛôB~J®CÖ8ùO½ ßë;#ûÞ#=«¾²àtÜ6è¼ÚúÞl›‡X¹f„ŠO±ÔÓÂÒÚÚʤŒSõ‹Êª6WàÖ%qÀÿùÏhKKK€¿QD6߉'¢ä²ËºfùãÆ%}vA¬µµ'¹Nçºuˆ~ñEŠž” ò—(¨=6»µ˜TñúNŽó¡cû݇3ŠÇ`uóÁùÜÙÍbtÏ`€ÌH[5Ô®5ìºdRˆŒºU€¬]è®innÎ^€Çƒ¢!Cz\û…çž›|r={zOà{ýuJ®Ciâ@èT7Ta|ÿé8¯ô&é¸SІâ'•›°¾å7ø¨ãŸ0{ÑÝà÷ûùC€Tîÿ(WÏI²Á üZì ðûýYu §_?”\|q—kÿÒKá=AœL—X(„ ›\g×®=)Afcmx¾;QЕýgK W±§/®.gà -÷¢#êwøI³ Ý3º€v~Ö‰7 €T°µÃï÷»~  àôÓ» þ„ (5 žÂ¤Þ/zäHor (¹Ad˜/ã@ðC\Uþ0Î(#wVÉœ\4kü÷`oðuŸ0»°@uʳ¸Q¨ÐqÙˆÆÅàÈ‘#®[ð¢häÈ×~Á™g&ýž¡>êuí¿û.%×!—q,ú%–7ÝŒ¡eSPÕï·(ôˆáêç=7\wÛŸDMëŽiÍaò Ý€#GŽÈ2ê–'+\)&Ü.d1v9bGŽqÅ6@ïqÇuð]~9J.¹žþý“z¿X{{Wrî­z”\‡ ²ƒwÛb_ð L*Ÿ‡ ÏŽñÀƒ ÊnÃiE#°ºùg8ÚæðSºÝ€C‡¥* #‘þéÎdNènù3¯Zó7Ü;=.ž@ ŽD"ŸÏ'ÞÓM:b Ï9§×µ?dHòÉuþõ¯øä:tAd# á=xâèø~¿_`DŸŸÁñgÃñßÀí×aó±™x«­š¶ v£ÐHdÔíÌì]9£·ŠÛ=:èÚÐC( ú|¾RÕ¦Âà)+Cñ¸q]³üË/‡ï¤“’{ÃHÁwÞé9v7´ukÒÏH„;ˆ „M­3°;°“ÊC…ïdá8Ÿ§Uý~ƒ3ŠÇâ¹æ»Ñ©wøI݇®`ïÞ½| ™@4&§p³`þ±(û¥ÆÄ‚Á`¨¤¤$-Àwê©=¿xôèä“ë45Å'×i¤ä!‘Ë쾋ù ãpiÿßãœÒë¥ãN-º?©Ü„u-ÿO:V;ø„îC3 ¶gÏÖ÷™g€Îv>cƒ_¿DÀöƒÇö#›zu€Ï‡¢ /ìqí~ûÛz÷)oßÞ³M/ð÷¿‘HÒïIDöˆµbMóTÔ6âŠþ³Pê­Ž+ñôǤòy8³¸ /µÜ‡Žh~îðÑñtvvvvttD öË‚u—²ÖKà€îá?²ƒƒø²*# MUïÀ(?Å—_Þ•\g žûIF,@àÕW{Œ>%×!¶w¾ˆÏƒïáêŠGñõ¢QÒqß)¹ §ÅsÍ÷àÓà›>¡;°È€Ÿ(Юɠ FçÇe”L+€:Ë* €©€,üö·{ÎÙ/>PÇš9xëÖuðmÜHÉu‚ÒýËoÂe·a\¿ÿA§X8®¿ïßðãOã¶¿`Ó±?!ËS==ð Ô;Àtw °Ìðª¢*ÍîeljʢzÆÉ´@ݯ2øü/‚_Çá^Ï+ ™ €²2”Œß›\çÔSÍnQ‹!øÞ{½ÉuþùOPr‚ tˆ!†wÚÿÖµ]°âÏøJÁYÂqxpaŸ;ñµâQXíÿ¾ïpøI§Ä[.M²ÄrìØ1v–¥Ü.Î]ù²¨žµ8!¬ñ©îm”ýrx¡€`PãÀ{¯ƒÖ¯·ù¸Ý_¬µ6ô&×ùòË¤Þ ˆüæËð.üõè¥Ó÷×Þç.évÁ ¾…ۭǦcÂ;mA,wìUº‡577󉀸mâ2Ìfýf»Ï\ýÃw[2 U¿¯ÿKé  Z‡Ù!¼{w|rPÚ¾AyH$BMë°;°ËE¹O¼½¸ÀS„KúýgÅsÍ÷ %rÈá'uÝ-€À¢»fŸs¤K$;ëç߇÷ÈÖøø³£\{4¤ì,ÍX(„àoôýp]]ªÞš BÊgÁ·0¿a,./ÿ¾[2Q:î´¢øÉ Íx©åרÚù¼ƒOè º‡566Š–dÞcL€9!œöXò×#]ïG¼èªˆ9ÒÀ×¹ab--ɼA„-:c-XåÿOÔ•Ôàòþ3Pâ)^ê-ǵÕ8³ãb¬kùotÆrç3Ëf" v {V ‚L°3}³"@”ëcÇDD;;;- €ÐGõœÀ|ï=J®C„kØÒ¹ûCïâêòGqZÑEÒqg—NÂW‹.ÀsÍwã³àÛ>aúÐøâ‹/ ë6[¿Ïyœªõ|¢%£â¢aD" çÔ']@ðÍ7Ѿti×Þüz:n“ ÷Ò9ˆ%×ãÂ>wbLßûPà)Ž+÷„[>‹·Úª±ùØLDbÙ§¤pðàAã@6mÅjÉÀ ׊‹ä2ÒªŒE©ø¦­üÀEA€ " ³S/kN´µíK—’ñ'"+ˆ!†·Úªñ×£—âËðNé8¼¸¨ÏOqûÀu8® ùôã™D7`ÿþýì1À€Ø¶È¶’óãtÚ²‚¤@’èüàÌ¿ÎÏoïˆ loo×ò”\z)*7l€·¼\g8A„+ø"¼9:o›lüJá·qç WpAÙmð¤$fÛyt=»wïf=V¶îeĸ;‘ ȼ¡rµ˜©²„¨ÿîWÄ(>|¸I÷AŠFŒ@em-¼Ç¯{ ADÆ Ç‚x¥õ±´ñF´DKÇxŠqiÿßãæO¡Ÿ÷Ÿ05èÄD"‘p}}½±û+.þ¬ñó¸IX ÊEû‹Œ?ëˆÎš5kKgg§öÙ»…çž‹ãÞx¾SNѽ… Âì ¾ùGGc›ÉÀ¯?­¬ÅY%z²Ô`!€0&L0<ÝÆÝUKéªoVÇØËÖõù~þ—ËŸÐãhjj ¼ýöÛÿ°òMœy&Ž{óM|ãVn#‚È8Ñf<ë¿ Ï5ß@¬U:®Ô[ë+þ‚«ËA±§¯ƒOhNˆ¼Æl»™QÖçjœô$óƒ’÷‰Æ‰fþæ™9sæ«@@+ÐÀwòÉ8î7Pxî¹6Ÿ "³|Üñ˜ß0ÿ ªç?ç”^»*7┢¡=™= <Å(ò˜§nïNd sõë|3tÞËÊû¥7,È ¹*€mSüA¯ñõW^yåðm·Ý6·½½ÝR>ïqÇ¡²¶E#GZ¹ Âø#°¨ñllý#"oà;S®ÆØ~÷Á‡BŸPÝ3¸L€,²¨Û#BåÕv…Áçqƒ`1ÛŠÁþ"Øõ™ÛŸ÷„×òåË?»öÚkç5777[y@oy9*_y%—]få6‚ WCo¶ÍÃߎ^Ž#áÝÒqx1²ÏݸmÐ ¨,8ÝÁ'ÔCw€ßïg'z¢C€ tÚ\iÈí’)`%@6N¹Éýz½0@xýúõõãÇÿsCCCƒ•‡÷”–bàš5(½ñF+·A¸†C¡­øËÑKðnûBå¸ ÏÆƒ6`HÙdgLÝ3º?Ãç=Æ"ÌÜùV¶º§@²q¼p¹ÿYooüyzçwŽŒ5j~}}½¥tYžÂB \¾}î¼3‰o‰ "s„bX×ò?XÖôC´F¿Ž+ô”àòþÄ,C_¯;¶E§0€îDÔʘ¬ % ÖM2oÁ•eÛûرlèh Áø¯;v4 >ü¯ûöíÛo驽^TTW£ß}÷Yº ÂMì Ôb~Ãìè\¯wFñü´r3¾Y2Þ¡'“£päÈU&@³«Y+RêˆÕe6ÖèSímä¿aøƒÌ5¼ÿþÖ!C†<¹mÛ¶=ŠgÒÿOBùÌ™Vo#‚p íÑ&<í¿ k›§!“ÇG—yâÆŠ'qeùC(òôqð ŸC‡Ã‡³ÇË–Ž{Æ?«qC Õí2ÀÏüã¶þA2ûg^ÁÆÆÆö¡C‡.{ï½÷¶Yý&úÞ{/*,¼nø‘AØãŸ+1¿a>½¯w^éM¸«²'vèÉâÑ8pà» ó6rQ`¶ƒ@…«ÅDÊ­•ÆR€î:ŒlvÏ×ù¨N¶äã ã@—' ØÞÞÞ1|øðgjkk?4û^yúÜq>õ<…îÜ6C¡CSä_Xxt"6›…(ÂÒq}§bÊ 5Ý÷—ð:œ]^×°oß¾c‚f3oíYè§Â©éj*×STK|,{€ÈðóKAÁp83fÌš5kÖXNš]zà ¸v-<¥¥Vo%‚p QDðú±GðÄÑ+q4¼O:Î ¾×wn´ƒ|§9ö|š ¶gÏà³ 0¾Ÿ•gt;™öW›­¹èŠ^ÆR@Ï@Ý/™ñ‚'N|yÉ’%›­~S”I ˆ\¡>ôªVáýö%Êq'ž‹;+kp~Ùy. ÀÎÎÎÎŽŽÃl ²'|ÙqœÊdþU»Q [`—øx©½K[n¹åµG}t½Õ_Jш¨|õUÊ$HDÖŠuàÅ–ûðTÓ-h‹ÊM)ò”aBÿ™¸iÀbôñV¦õ™,$bá=ÈQ®Î^eØ tÝ‚rˆ~˜¢µU †löÏ.„WV°¯¸¶©S§¾óûßÿ~M$‘¹…„žse$"g¨ Ôàñ†1بQŽûFq~Z¹gW¥å9<ð Ô;Àts 0k¹7™Ç,N@46kÈ䀕`@¾_' ÿ¥‹2– £oöõßýîwÿò—¿|6 É#bP&A‚ r‰¶hV4Ý‚ZîE0ÆO°{éã­Ä,Æ„þ3µ’öX¡Ä[/|¦ãZ[[L€,¢tÀºQVîsHÈt € •Õe€ìU `~öàÚ<òÈö;î¸cEgggÀÊ7B™ ‚È5>h_† U¨ýS9îü²áÎÊœT˜ºÏ?ÝC€ZZZø3xìÆ¸&f Ür°j F°! yø]aô&œA,€Q^´hÑÞ›nºi™`mI‰÷¸ãpÜ«¯R&A‚ r†£‘OñÄÑ«ðÚ±‡ED:nï4Ü6h-¾×÷çZ3w3t·677ógˆì Ÿ@w¦¯"+DAZ€…€9+*˨ëQf@öLvwë‰ÖX³fÍþ+¯¼rISSS«æ÷ ðôïO™ ‚È)¢£öØl“Žó¢£ûþ S­Á@ß©I}MÝC€Ž=ÊiÈOEíVÈ C/ÃMK:^Ñ=:ñ2O€!Bèür@ÜAAÆkóæÍ‡.¾øâÅ_~ùe“•o’2 ‘‹}€ê†*|رB9îäÂÁ¸«²ç•Þdûké&ê|ºxÞf@RæïËj2!¬D˜yDÆŸŸýóÆŸ?ÈðȶòÁÁ÷ß¿aÔ¨Q‹÷ïßÿ¥Þ·Þe$" ÆÚð|ó/°Ò+Ú£ÒqEž>¸²ü!ÜXñ¤¶;ŸE7 ;€Ê{ ®MD²¶Ëu¤MØ<ÌÀŽ€í“‰£áÚØÀ@6&À¸òÛ ãß#víÚÕtÑE-Ù³gÏKß)e$"GÙÙù2oƒÝõ9jß,ŸVnÆÅc,½¿®h8tèÀGýóg¨lLN’V€B$£¤TÆ^æ à=üá@¬'€¢Ã‚â–8Ð:tèÐe[¶l‘Ÿ—)2 ‘‹‹~‰åM7㥖ÿF(Ö)××{<~8`.ëÿÿPè)ÑzoÝ€Ï>ûŒÝ$~@nüUÞœ nŠ00óðcu–d˲-‚¢ @™7 ÐÔÔÔ1lذ•ï¼óÎN«ß0e$"Wy¯}½CŸ(Ç -›‚;mÀ‰…g›¾§®`ïÞ½ªm€¬W@åmÖñ ˜q¥`pÓA@² ?¾¬rÕ˜yøe‘'@äþ„¶öööΑ#G®Ú´iÓÇ:?Ê$HD®ÒÞƒ'Ž^7Úæ"&ͳTœŽÛ½€‘}î†Gažtb"‘H¸¾¾Þp=ö‚Ÿü±}|™G6û7›¤º·N9uÜ.:ÆžàÍ–BLÂèÎ$8nܸÖ¬Yó«ß4e$"W‰ „M­3°°qü‘Ï¥ã|(ÄØ~÷aÊÀÕ¨ð,c!€èóß@egtãÌ&®ª¾Œ‹ƒ´ “`@%eg)Àl9€ÿ£à—Xo€èœÑÎ>“`Í¢E‹^W|ïB(“ A¹Ìþ໘ß0u<£wJÑPü¤rÎ)½>¡O' ½½?ÏþÙ~Y|[•S‚“™÷zTèª4¯@„+Ë<|P 4…0ó L™2åµ9sæl L‚A½b­XÓ<Ïøï@GÔ/Wìé‹«ËÁõA©·Pà)ÖÊ-À$ÌãµAÏ*×¾.Ž€4xì.°ê 0Ê¢ÔÁ²sdG[ƒÓ¦MûÇ<ðe$‚ˆg{ç‹x¼a4öÕÎÒ³J&à§•µøzÑ(í3¸L€fëþüAÑäÒŠÑÏ à€ÎÚl) ™˜Ñ€H°±2Pà>ž6mÚjÊ$HOkô ,k¼ /·ÜpLžg­Ÿ÷Üp÷ˆúD¸Öð8*lxtãD¿Lþ}t—Ì–XÃÏ‹iA£míÚµŸ_yå•K)“ AD"‘X5­ÀâÆëÑ©·ý>GŽQ¥–%úºnŸëp“ÐÿáéŠ]ÃÏ¿øÝ¬80¼¢À@~I@¸E°¶¶öpUUÕRÊ$H!æ³à[˜ß0[:Ÿ³uÿáÇYë à¯"€ìÌ•5KŽ /€îR€l€-ÛìaA¼'@&Œ+ûŠËN|ðÁ £FZràÀÊ$H! 3Ö‚UþÿÄ -¿BX‘O@ÄŒc€eñ]ì’`¾ Jî 1@ E€hŒUo@TP¶#xO@â @6“ ذaËvïÞmÍÏE™ ‚ÈN*<W—?‚Kûýš‰‚ öîÝkxÌl?ÛwÑûd™ú±X,æñxûìÓLž3Žþú¼ ù׿¶rA„k)ðã;%WchÙdœXøvß&VWW×q`·®W’«cïja1 kðUýf"‚º«"ÀîZP‚;©±±Æ {¦¶¶öê .¸ÀÒ¦ÿ¾÷Þ OEü?ù M.j– "S ð}CÊ~ŒsKoê9õÏ.ÇŽkíèèAîö(ó<ë.¨<Õ®^^ÈDL}€ž`ûÍD€¯»Í ²?²XGGGlĈÏ­_¿þ²qãÆ™çÃdèsÇð–—£éG?B,²øHA™Á/Î(ƒ!e“qzñhx”s>}êêêv!ñˆw~ÉW4Û-°W3\ièe¸Ù` fË”ù/‰õ°u»"@w ‡QUUõâêÕ«;'Nœ8Tq_¥7ÜOÿþh¼öZÄÚÛ­ÜJá(eÞ8·ô&œ_öc ð¥ö¸ó`0˜?þëHÌïÂ×c\YA[²ëÿ® ßhó„@™«Eµ^#R{ª€¾. 4ÚŒz˜»òɃT''Mšd?“à+¯P&A‚ \ÉI…çbbù£˜v܇¨ê÷›”ÿööö¶Ûn»íÏûÛßö ×àŸÇ*£/[Ð]ûW¹ÿµp: à€¥¾MÕ/[P- ¤ÊcÆÄ$u±)S¦¼á÷û÷ÜsÏ8+Á’F&Á†K.AôKK; ‚ RN¡§ß)¹ C’ ê3eß¾}Ÿýìg?{fýúõŸ#~Æ{DqfÆß®™éËp…R*t– ’l¿È›¢ò°˜Fìýüç?ÿGSSSçý÷ß¹ÏçÓöÖ™ªªÙ¿_÷6‚ ˆ”1Ðw*Î/û1Î-½1é >Á`0øæ›on™3gÎÛ/¾øâçèò¢†¹+x`Åø›¹þ¥:1Á5@»"Ç@Pg‰v÷‹vÈ‚yt2Jÿ˜¦OŸþ±ßïÌž=ûêÂÂBíß—‘I°¡ª á]»to#‚°MWPßX )»%¥A}<‡j\½zõüãÿyðàÁcˆ_båÏc1Üÿ¢8öT@Q€ þ|Ó—µ¸Jhž ¢þT‰@¼EÐ(³žþyDϨÓ±¹sçîôûýÏ,X°àÚ’’’"ÅsÆadl¸ä„þùOÝÛ‚ ,QæˆsKoIJ[Pá;9-_#Fß{ï½}ýë_?xâ‰'ö¡÷ð56žŠ­‹’¶ñÆ_ä -ÓÊ„€Yà kq•l‹Y="Àð èˆÑóóe¶ß£Š%K–ìkiiyjéÒ¥7ôíÛ·Ôäý{¦;“`Ä ¾ñ†îmA¦œTx.†–MÆ·K®BG{nb‰æææö_|qËÌ™3?Ú²e‹ò$lF@µÈ ÀºÿUg¨\ÿ²:?>kðd ðP ÍÀ7~Œ¬î‘´ñeQy%u/ó2ê¾î—‡)0WãUØý*b®ì«Ø(=ú„U«VÝ8`À€~æ?ž^bh¼öZt®[gå6¢›öìAÁ׿n:î‘#ÀùÜ'"ˆÌÐÔ7'Z:²Ä;wî<¸dÉ’Oy䑯ŒžÝYÅ‹6ï ›–õ°ËÆI®ì(8Ðì+$õÞŽ c× €DE@!€¢ÁƒW®[·îÆã?~€ù§—X(„¦ÿ+WZ¹ ‚p"¨/„6oÞ¼ëá‡þxãÆ_@œtÍ0ÞAæ*Úb-[`ƒÙ¸€sewm©Œ¾Ê‹À—EõŒ~×-°¤y9@µEÐ Up ñþüÑÁVÎ\PEžâƒ>h9rä²7ÞxòÉ'§û¦F&Ay9Ú,°ð8Aä#^øpfI†–MÁiE#ÒÔwðàÁ¦gžyfËÌ™3·>|¸ñû÷ù—* ;+X¯h7€h)À¸ªÿµ‘×¹§«!Ã3pW c"@WÈò_C–?@ô‡¦e«««kºð —ÕÖÖ^Ægœ¤ñ¬]tgô€Ö3´o#"èë=ç•ýƒK„r߉iùÑh4úüã³ |²xñâýèuų}Öhóî{Ù2›‰U4ÓW$šÑ«>£ÍD€{Ýëݸ^Y'øà@V°^v{ AÐCw&Á•Ý™OÕxÖ(“ A<§ Á²)8«ørø<…iù~¿¿ýùçŸßñàƒ~²uëÖVÄjþUÖí/J½Î{øe^Lˆfÿf†žEÈ÷ËîsY!€´ˆ ^$+TK2÷¿!T_ƒÝ«Êz2 >M™ ‚°C‘§ ß-„!e“ñ•‚³ÒöuvìØqhñâÅ[æÎ»§;SŸÈèókô!ÁU´ {±küü)€ª5~3a`f\iðy²F)l9"/ ¨£ËKÀ>Ÿ ¡ª££#FŒxîå—_¾lìØ±Ö3 VT éæ›)“ Aä•_Ç²ÉøÒëPâ韖¯B7nÜýÈ#|¼qãÆÄeÞè‹Öü¶dŒ‘ò7$x/³™?küã¶]+‰QðŸìžÞFDàg•rVX 8Þ‡cãÆ{ÉV&Áë¯ïÊ$xÍ5”I r7£ IDAT/|øFÉÅR69­A}õõõþ§Ÿ~zë¬Y³v|ñÅHLÌ# òã—džvLTÐοD¹d1y1û²PI‰ Ñð³e'Eû^f;L€Á¤I“6=ùä“)S¦ŒÔ|V@Éøñ¨|å0Ñæf+·ár êûWuuõ–%K–ìG¯á•¹úY×¾¨.ŠàsïB×ç ¿¯_tî¿( êŸÕ ?³Ù¿«ÉJØ|›Ž° ÈŸH¨sb  ‘"íùC¼õÖ[ßlnnî¤L‚‘ß8Ô7kÖ¬­Û¶mkA¢Ñçgæ*£¯Z½/;ÃÍøUüðG‹°:ûÝïZ²Vމ€dÎ ÄÞÃðëŠ+¤1øùÏþžßïüö·¿½Œ2 DþàdPߢE‹¶>öØc{:::øµwÙŒ_¶F/rñ‹\û"CÏ—ÙY¾Õ~TnÙ¬?Q²Z®ÆXÞàªD€h™Â*Â?Ôxà㦦¦ÀìÙ³¯¢L‚‘Û8Ô7gΜ-›6m:‚Dc,Z‹AnðE"Aõ2¾F ñF߸‚©Ë"ý­Ùä+« ½Œ¬€ëDoðEm¬`Ï ðAî`ÿ Ù­*ï@lîܹ;›››ƒÕÕÕרÊ$8~Ì'zÏS—~³u~Ñ5™5ÕY½·Ã;€€kEï àãtE€ìÔxO%‹/ÞÛÜܼbéÒ¥×[Î$X[K™ Âe8Ô÷öÛoÿkÁ‚[—.]jõ‰fúF]fôe|¼k?Ì]y÷¾Ì­¯kø­¸úE™µ¹W'²ƒÍB|›¨,ºòeQOÄ׫©/w5’BD¨'{`w[1€Âïÿû_Y½zõ ”IÐ:” ˆpNõ͘1cÛŽ;Z 6ú2¾¬5îì>Ö¸³†?&hg]ù†q­ñ‹ ?ßÁʪ+_Õ{;\dtsNŽ‹ãj&T"€7ü¬(ð!^°"À¸²" ]ŸEèÍ$xe´ "SA}CË¦à„‚o¥íëìØ±ãÐÂ… ·=öØc{:;;=ø¼[^eØEîÕÚ¾(€1®Ìv^Èfü:†?¯Œ?CK,ÆÙD¤j9€_ P- ðË|\‹Î³5*öŸ@ 2 VT ­ºZ÷6‚ l’Á >Ö0ËŒ¹jÖ/3ú¬aggýF™Ÿí‹\ù"#¯;ÛO•ñÏrRhÄèˆÀÜø[@¢ágãXDÏ&ÃL™ö”ëêêš/¼ðÂåÝ™õ½^TÌŸoEe$ˆ4Á >~ ^gÖ¯côyA! äc8;Û—}Ù^~;Ñý"ƒA›é窤îjrZ)l=]"€­³"€¯«v X!V__ëÎ$8‰2 Dfq2¨¯ººz˲eË>GbPŸl]ßX¯WQ4¿,ˆÏˆì ^*ÃϾø5Ýuúñç·Êøg9/mˆ>_W{;"@´$Ànñcwñ¢Á þ5î¿;“à³›7o¾jذagZxß®L‚À×] L‚aSІbHÙä´õ­]»vÇÌ™3uƒúDëúVfû|P_Œéç ¿(xOæÖ×á[fÆ_%X”ýn[ÿòDZ"}¾Î¶ó¿ÔThˆ Q°Ïc\EªV4–­Ç:::b#GŽ|nýúõ—7î»VºÏí·Ã[^N™ ÂNõmß¾ýТE‹Ø >‘ÁV{ÕÉ~¬Ággý1¦Ÿùóëüfn|+ÛøÌ ½ãÏbåóTŠ?GH» +ÌâXÀþ±†¹gcûU‚ ‡p8Œªª*#“àgí2 „Nõ=ôÐC[jkk“ ê“ÍôÙÝ|`oàufû"#/ ì3>ÏøÏB+³}3ã¯òðeSÜjü<@VˆÕ’€ÌýoˆÕ×0þ¡¤Lš4icw&ÁÏÚe$1½A}Sðµ"KÿV–HAPŸÙ¬_´eO´¾ÏoÝS¹ò­Dî';ã7+ƒ+[1þ®5ðfäÒ"q€È—T„Ñå%`ŸO†HñÆàÖ[o}Ãï÷wN:u,e${tõýç—þý}ÿ––¯‘† >¶Ìy~ÖoÔ§šá§ÂðC£ ‚²ª ʪ¶¬!/rÀ–3)xîC‚˜6mÚ{~¿?pÿý÷_J™ B—õ©ùø#yùÙ>oìÙíz²u~ÝÙ>}Ný´7»ÿ<@R"H4ülÙIÀ¾—™± ¡h˜>}ú'ÍÍÍ|ðJÊ$HrêÛ:wîܽ@À,¨OäâÝ# êcûXcoö²;Û‡`L²FßÌØç½ñò\¶Eߦ#ìÂò»tN ”‘0ûgë>úè.¿ßÿÕÕÕ“(“ AÄãDP_ggg¨¦¦f÷œ9s¶ÔÖÖ6ÀÜ€[ êSÍøÙ@>ÙÞ}™a×ÙÂA›Ž‘·côE=¯?@€c"À®À@ä 0 ¿®0ûš ÿP‹/Þç÷ûW.[¶ì:Ê$Hä;NõÍœ9sç‘#G:`?¨OVõ±_CäÒOuP4ÚTuh´‰®²6Ù˜œ%'“ÙÅ™ùv>y(‘4Ȩû˜6>›HˆÅ% b^Å Gý•U«VÝ0`À€¾êO<¹’I’å7. êc£öÍ‚úø€>³ ¾¨ O5×~Úu?ßÅYß/ëãË¢º¬-qPU.l[ºD›N¸¸»Ìÿ¸×yçW¹~ýúŽ?þø õ'ž\È$H ?qIPŸ®‹?A}vfûŒ±âÎOf–oÅàëU{ï€,3¨´ÀáÂå6@ÔÆ.°‡‰òðêœÿ:J>üðÃ#Ý™o L‚D®’ÃA}" s÷ëÿ²Ù>$ý©˜å§Âð›µéÖem‰ƒ²Ìø$„¸@ˆDL¨D€hW€Î)ûw_]]ÿ /|ª¶¶ö:Ê$HäÔ'5ö"#o¶…oWÕEeU›èjÖ¦*[mK”…Æ  %"@6­³;Ø~]÷Ô V__ß:lذ§kkk'R&A"›q*¨ïÀÆI}lPŸÌˆ³ëûºâ SA}ŒáÛduXl]ÍÚø²Nݬ=~P–€€‡E€ŽÀ€÷ð;Xtv¨þáŒ÷dO&ÁÚÚÚ«.¸àÊ$Hdõ}V]]½UÔgæâç€ÌØ;ÔA›®0+«ÚDW+m²1²~öøAYlü¦¸X‰†Ÿ `=› m5ÝÑÑ#F¬éÎ$øÅ{&@™‰LpJÑP -›‚o•\ÒÔ×ÔÔÔþüóϧ3¨OTOwPý*Ÿ*ƒow¦ŸÖY?ýÆ  E‰¶Îо. ´C,Ǫªª^ZµjUç¤I“ηr3e$œ ÈS†³K¯Á²ÉÙÔǹ÷E³~CĘ1²Ù>˜ºL ðc¬Îô­|»Æ^ÇГñ&)€¹±·#DKì?7ˆeðÿ`ü‡®¹æšMO>ùd'e$ÜBeÁéRv‹ÛƒúTe§ƒú€ÄÿïTU$m®4ü@%R$غH¤ê´@68ìó×ã.ËÖcb·Þzë›~¿?0uêÔ1”IÈ êë„ØÈ³Æ[•j7›ƒúDeU›èj¥M6FV—µéôÅÌ!Ão@À"ˆÙö@]A`ÀŠöŸ4Ì=Û¯qtgì¤L‚„“8Ô7þü­Ë—/wSP+tfû´éûT|«@T×5ôdü°ˆ>_O‡P- È ³!T_Ãø ‘2}úôOü~pöìÙWP&A"8Ô·}æÌ™Û¹ >²A}|›îl_døÙ<ÉXlƒÍ6¾¬S7k7ëKœ£Æ `MÈ>_OµäK*Âèò°Ï'ƒ÷ ôÔçλÓï÷,X0‘2 ©Ä© ¾mÛ¶Z¼xq2A}:n+A}üì_dÜ êSµ‰®fmª²Nݬݬ/qp~I&Ä ‚LˆÞ°ë –,Y²Ïï÷?óÔSO]Ó§OÊ$H$…“A}?üð'¯¾úêQÈ·a°ený|ê³rµSÖ©›µ›õ‰oÈãP2 ”`!৪{WUÙì%J äe^ô&2^²äAÆ•Íh”‹Á%=zô «V­º>›3 R2 Ìà’ >vMÞÊѼùÔ§ÛÇ—Íúdmªv³>ñ yfI¤ˆ$Dßf&Œ«U >AÙŠ¥ŽçŸþ —^zéúlÍ$HÀYr,¨/Š®=þfA}¼ Û‚úÌÚTeQÝJ›•þÄòÔÒ@ŠHb9€o•EWpe]DK‘îºÎ±ÁÆs™õÇ}¼ÿþû £Fzª¦¦æú“O>¹R÷a)“`~ádPߌ3¶íܹ³öƒúDíìûˆ‚ø²=¨ï7ëãÛÍúDu³vÝ~ñMyjü)Å…"ÀËGý«D› #hòuÙr víÚÕ4|øð§6oÞ|-e$ œ ê[¸páÖyóæ¹1¨O5ãç_:A}ªº¨¬j]ÍÚø²YŸ¬MÕ®Û/¾) ¿ €ãBÄ|Q+ØstŽ f?ÈŒºôùÀ­Ã† {¦;“àWMÞ;Ê$˜[8Ô·aÆÝsæÌ‘õ±îyÞB¢§ ¾^¬–EuY›ªÝ¬O~ý8H¤‹ÞÀ¶Yü‡ÿu”466Ɔþ›6mº‚2 æyÔǶQPŸ~ݬ]·_|~!$Ò„KD€HÈ„€JˆÒù‡ybÐÖÖ†#F¬]¿~ý¥”I0÷É‚ ¾“ñˆÜý¢ ¾>õ¥n¶¯Ó/¾‰ ¿i$C"@~Y€Æ×bûu<ô>£ªªjÝêÕ«'N¬ù~(“`¶@A}Ôg±ÍJ¿üF2üZH3:^ÞÀǰèìPÍ2Œ÷Œrm˜4iÒÆ… vNž<ù"“÷£düxTnØ€£—_N™]Dõñ^7¿Ê½/vgúÉÌúÍÚø²ºY»n¿ø&2ú–!àÆfŠÒ §Z‰†Ÿ `=› K&S¦Ly³©©)0uêÔÑ–2 ^tet ]A}“ñ¥×RPŸÞl\›ÌØë|]C¯#tË¢º¬MÕnÖ§„ ¿}H8HŠ2 :!Ø:+DõTz2 ~÷»ß]âõz)“`ÐÔw †”MN{Pߊ+¶Îš5kWCCõÙ›íëöñe;u³vÝ~ñMdôS ‡I¡̽ Z`g+lp UøþC.:}úôOššš=ôÐ………¾„w@™ʼn ¾H$}ûí·?«®®Þº|ùòk«A}ü _4ë!ÑèÛ êƒ -Yã¯jS]ÍÚTeQ]Ö¦j×íßD†?¥È)l]$ RuZ (ª5ÙX¶€Ç{lgssspÁ‚WS&Aw‘åA}Q$Š ê“‘Õ­´YéßDF?mȈÙö@]A`ÀŠöƒ(Ì=Ûo& zX²dɾ–––g–-[F™3Œ ƒúd|Ôg¶o§nÖ®Û/¾‰ Ú¡d@F3àM4†oóÚÙ6UÙìe–IOäE—¸4ê…ÌÕx@’=yŽ=ú+«V­º.Ó™ó1ÔwNéu(öôKË×p0¨½Š ~²A}ªLÚÌÊv®vÊ¢º¬MÕnÖ§„ ¿sp9,|Ì‹Í$È‹>{ ›Z¸pðàÁ•ëÖ­»ÎV&Á[nAÇŠVn’/À© ¾Ï?ÿ¼iåÊ•¹ÔA:gûvÚìÖÍÚuûÅ7‘!Ê´àÒ´¦œìr 0{f«ÿØìº)Ä>øàƒ†Q£F­¨©©¹Îr&ÁeËà//§L‚&ôõóÊ~àHPßã?¾uÅŠÙÔI¿îL?YƒoÇØ;1Û×éßD†?£p D 6ú¢:küì{™må á³ìÚµË?|øðÝ™õ-eTâTPßš5k¶Ïš5KÔ§šÅ[™å«‚úbL¿îl_däêãûdý²>¾Ý¬Ïj›•~ñMdô] ‘Ä©¼0ÐváùÝ:'Ê}ðõ´8pàXw&Á«me8Í÷ÞkóÑrƒú.\¸p›… >™‹_åöOeP žÙSPŸµ~ñMdø] —á’$B:ˆ¼†á×:4qpÝ™WmܸñŠaÆaåûþêWðTTäm&Á õ±Axvƒú¢ÜøtõAÐ&3ö:_×Ðëݲ¨.kSµ›õ)!Ãï^H¸Šc,ïÒW‰‘‡BD‰†^t_Ϙ¶¶¶ØÈ‘#×®_¿~‘‘·Ô'ÚÀÏúcL›l¶Ï{ ê£Ù~^CÀ¥¸Pñ_ÔÆŠöœÌ=ì0[ŽíÎ$¸ž2 Šéë=ƒË~ˆÁ¥7;Ô÷9gåVƒú̶ò¹9¨’1|¿êjÖ¦*‹ê²6U»n¿ø&2üY ãbÀ{ø¸]À}þëcdÄ&Mš´‰2 öòÕ¢ 0¤lrºƒúÚÖ¬Y³C3¨O$tfùÔO* ?}".Ç%"@$ dB@%D»t?<¤zS¦Lù{>gt2¨ïÉ'ŸÜöç?ÿ™êmÅS{ ê3oãËvêfíºýâ›Èðg=$²€ ¤!ëã—X :˜H÷C‹G9›6mÚûù–IЉ ¾ŽŽŽPMMMÝÃ?¼åµ×^³Ô'3þV‚úT"@g¶A›ÌØë|]C¯#tË¢º¬MÕnÖ§„ î@ ‹Ð©VÏ`½ÉîP}À²ýqmÓ§OÿÄï÷gÏž=!W3 A}CË&ã´ì êã=¼7"øÝÔgÖg§Ínݬ]·_|ýœ„@¢±, #s㯳ÀÂ~Q\€ñ>ü³©¾~ŒèÃ0sçÎÝÙÜܨ®®Î©L‚ êSéÙIÆCA}ÎÏöuúÅ7‘áÏiHd)š"Ð;50]"€­Ëâql€m/^ü©ßïvùòå“ìdŸMÐ0ö|Jáb£ðàÁƒR‘IÐ à’ >Ùú¾• >‘ÈdPŸª.*Û¹Ú)‹ê²6U»YŸ2üù -ä6³ Êêl;¿`å¼>€-‰Ëaæ (óð㢀û3 zQ€o”\ìHPߊ+¶>øàƒºA}:.þ\;©Ï¬ÏN›ÝºY»n¿ø&2úHä .€xg€aøe1at 3øÞ¸gJ:“à€Ú·èâTPß[o½õÙüùóÙô»ª >QYÕ/ÚÎ禠>+e«Y_6듵©ÚuûÅ7‘á'h ÇHñr[NÅr€*.À‹øøv‰@À.ñªWáÀËjkk'ZÍ$±`ž"óMfKNõ͘1c[]]Ý1˜Gå[ êc÷þ»5¨Ï¬lç*k“‘Õ­´YéßDò„òäIx€ÄY?[vÂ$žàEï¾p3xãgP1|øðU›6mºâ‚ .°”IPÇøË(òôÁÙ¥“œ êÛ‚õé{~L¦‚ú ÷Á¤¬j]ÍÚø²ºY»n¿ø&2ü„ $r›"€oÓ,vbE€q¿•t¬¡áûÊmmm±#F¬yùå—/;vì·5Ÿ×. êãgëa®]ÇØSPŸ} kSµ›õ)!ÃOèBK9ŒÍå¾Íl9À¸Z] P- ø¸2¿,P€ÞÆr€q-‚xIÀèëÙ!°zõê±V3 š1÷ÈpœPx–A}+V¬ØÆõ™­ñçBP?FÔÇ_íÎòi¶Oä4$r—ˆ¶Í+è—‰~» +D1ll€V\ÀÂ… GXÍ$¨¢=Ú„2oêƒÞ ¾Ç|ËÊ•+ q–n'¨OdøYoj†o5¨5¬Ôg­_|}€I@K9ŽCËVâØ¶_ˆ@IPöáËå˜)S¦¼ÑÜÜÜy÷ÝwµHPJ:ŒwPßö3fl¯««3Nê³²¾ŸlPŸÌØ[uóç[PŸªÝ¬O~}"EÈ\ ø:kðÁµ›Ì>›¨Mö!/54S§N}·©©)pÿý÷·’I0ÝlÙ²åàâÅ‹·Ì›7ïSÅI}:ÉwøþTõW Ñè‹„cø6˜”Um¢«Y_¶S7k×íßD†ŸH1´G¸`9€¯ë. ¨^>îÅŸÈ!l¬ÿ³§ö%|Ï=÷|söìÙWdLwvvkjjêzè!6¨Oæê×™íË‚úX:‚úT/X¨‹Êv®vÊ¢º¬MÕnÖ§„ ?‘.Hä‹ãª$È ™`cdÇ¢7>€?6˜Í$8yòä¯UWWO*..¶¿ïÏÝA}[|ðÁ ¨ƒútŒ¿nPŸáMˆ1m²Ù>oìSÔgÇàÛåÓlŸ Hä!.*!À‹Þø³;Øà@‘'@è0ê'NþøãŸ¬X±¢bw¼ì\~+F_äÞw[P_2îýT¹ùS5Û×éßDÈ„ƒÈS²Tð»XÃoô‰vÈvð …zêãÆûʳÏ>{cEEEÊ7ð755µ­]»vÛŒ3¶îÚµëâ º™ñ7‹à× ê‹1cùÙ¾7¿ÙlŸoƒ…²«²¨.kSµ›õÉo¢a"CÈc\.TBÀ'¨Ë–ddzÆ_t^@á!C*×­[wSeeeJBû·nÝZ¿hÑ¢OæÍ›·7ðŸ]—ÍìEÿìØLõ™{+ßÎ,ß®¡'7?‘×ÈsR$Ø:/’¢x3 :0Ȉ àÏ ‰€BEßúÖ·*jjjn:餓ŽWþ„$tõí|øá‡?yõÕW8ç´îl?*gæÞ Ù¾Ù ŠºYÙÎÕNYT—µ©ÚÍú”á'Ü  `\Ue;"@´$ [yx!À‹B§œrJ¿ÚÚÚ|ík_;Iùb8pàÀѧŸ~úã™3gî8räˆÔÇÏÐùY¿hF/óÈŒ>ëÚ§ >yÝJ›•~ñMôAK¸€¬fÞÞàAïìß‹Þݬñ—yâ–  T¶k×®Ÿ 4Hº‰D¢ï¾ûîîùóç´téÒÏ!žËfü2÷¾Y¿jÖô© ?}*C¯küUmª«Y_6듵©ÚuûÅ7Ñ,ábH=¤A°åt‰> ¯‹Žf· ²Þ€bô ò» úöí[üì³ÏŽ7nÜ‚‚Ÿñ †B¡ð¦M›>þÅ/~ñööíÛ >‘ñ•ÍøeF^µ¶ÏÏöEüvƒúÀµëûTüœpó“Ñ'²Dš"P}¾ž ür󮂡W‘'€ì_ß¾}‹,X0* E–-[V÷úë¯7ƒA#hŽ5À¬^dÜùvþì}ݵ}‘›?Â<7¿UcŸªY¿Y_¶S7k×íßD¦D–A€H C"€mã_FŸèÔ@Ѳ€(P÷°KªØödAãÅî6à¿gÞG 7ꢈ}ÙlßìÅ ³Ù>mº®~³²«²¨.kSµ›õ)!ÃOd+” €H@3wÐõ¡éáê`Úb‚2{…¤Mö5¢ˆ7ô´e/âaô|Ý×B®]Tægél !û=€¹7Ü¢-y†‹?†ÞÓøXÏ€hV¯ êã¿G‘á§ >kýâ›Èè9 BH"€oÓ2 B% Ï–#H¬ˆ2÷³Æž÷°žã™Ùï5´¼áÍðE^ÑoÔ)¨OÞ¦j×íßD†ŸÈ!HR"$u"1`|Þ`ôÌÌ•w«³þB$n7d¿/öyD/‘ˆqW>€7ú2c®šíC2žo‡…²«²¨.kSµ›õÉo"£Oä($%.V`Åï à=1®Ý0²Æ=ôÎü}èì~&.2£áîÍöE_ƒ7ÎÔg­_|~"Ç!@˜â #ØÙ= ë 0»ãʬa-@üº?Èl @4sWEîóã:¸÷”½Ø±é0þV®vÊ¢º¬MÕ®Û/¾‰ ?‘'Ð.B›$vðmf»ø«l—€¨Mµe='€¿²kû¬‘eäw#°°†Xeä??޽‚«‹ »(º_%ø~Qµ2ËOÕlßJ›•~ñMôAHä!ä ´É€' UËïŠ×c§IDAT@¯Q6ÞGÀ/eC(°kÿ¼Xá%oœ#\]dôyÃAŸH$ØÝ'3ë7kS•EuY›ª]·_|~"!a‹ e4®fY;;ë7ó ð§ Šfþ² @‘¡¹òYOÑ'2£/º/]_WÈÆÈê²6U»YŸü&úÐ#ä l¢é °ë àQmÔùš,l ñ~ì{{»Çð€¿7`¿žÊ‹Ööù{X1A[2F^dÈÓ5Û·S7k×íßD†Ÿ â ‘iô°eU<€¬læðr}¼@æ%½7Èðšq‘á·;³·Ú¦sµSÕemªvÝ~ñMô!GBHIã`&Aþj&ø:ß&@ü6?Ùr‚Ì»!3êàÚEcdB@ÕfÕÐëÌîS=Û·Òf¥_|}°„)$ˆ”à`&AÙ51 €XÈžQ†®~Ùx'fù4Û'ˆ‡‘2\ Œ«™õñ"€oã×üEb@eUF_Ô¯sµkè3åæ'£O.‚‘R¢6‘Q¶3`”ÙY?{•ý©¾_™´ã‚O‡‘Oµ›Ÿfû‘E RN"€o7+'³4`Ö¦ãò×ù> DÆVÖ'7?Aä1$ˆ´æSÙ2ßfU˜õ‰^Ùs³¨þ±¬^;F^רÓlŸ òDÚH¡àëºKfW³1fmfÏ èJ] jKÖØëÄ-ÈúuÚuûÅ7ÑA¤ DZq@°ådÙ{™=“VfÕé0ðÔGD$ˆ´ã°`ËÉUYö¬ºèκ“õ¨Êvêfíºýâ›èÈ …ái|ݪߊá×y6:³èTÝ{uŸÉ¬Ý¬O~}DÆ @8F’"@ÔnÕhÛYã·3ó÷ÀÞ,9ÙuúdfûVÚ¬ô‹o¢‚È8$GI³àëÉŠݺU’ñ¤ªOÕ¦j×íßD8áHŽcAún÷T ³÷Rµé`gæìÚ=¹ù ‚H€‘R Dív½VútÚeX1ºn1ú:ýâ›èÃ… \ "c¤IˆÚR]×íc±:³¶# ¬´™=“Nâ ôBY "£X@z…€î>ždƒSÑf÷9L!ÃOÙ Â¤È ë³»¦Ÿ*ãÏbg=ûdø ‚ˆƒáÒì µ;eøYìãTµëö‹o¢ ‚È H®"…"@Õg'¨/†_„ÝY;Íö ‚H „ë°!ûÆ;•FŸoç+ÝF‚ú‚èáZÒ ÌúuOùKݺŒ}€ ?Aä$WcSÉ +cREªD•÷J¼‘>"o @diºcìŒaõÎÊx2üAhC€È’€³F>Ò)âo¤~‚ÈkHY‡ƒB ÷ɰû—ô?,~‚ D–’¤èy›¼‡Ñ'"å ²š ž·Ká{Ù%¥ÿdø ‚A€ÈR,zÞ6 ïi–>2úAèðÿ·µNFVšIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/source.svg000066400000000000000000003114431511343406000250140ustar00rootroot00000000000000 image/svg+xml Jakub Steiner Lapo Calamandrei optical media cd dvd Tango Media. Only capable of holding freely licensed content. Explodes in hard drives when trying to store proprietary software. Tango Media. Only capable of holding freely licensed content. Explodes in hard drives when trying to store proprietary software. ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/data/symbolic-source.svg000066400000000000000000000065341511343406000266350ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/decor1.png000066400000000000000000000414221511343406000237420ustar00rootroot00000000000000‰PNG  IHDRZGJL¸bKGDÿ‡Ì¿ pHYs  šœtIMEß7´ðIv IDATxÚìwœÕùÆ¿gæ–Ý…¥,½{/Ø *Ø-kÔ˜fDÓM7þ’¨)šX¢‰bbÔØbÃÞ{WEŠô¾»÷Ny~̹sï.KXÙM<Ï|X¶Ü;3wæ™÷" g÷Xé"%ª³¤=²„©K•| ððíÏ1ÂGÄVÃ:w€PÍ.üŒ=!ÄoÁÓZÜ3køŸÒ´!žÕ‡ÂPdŠžåMfS¤žzÒŸÙ™ž¦É ŠäQJî’G_ ›ÒsÅØÕ÷…ÖßÏ‘ïVµ¤ª ™ÕĕЉ- äÁÏ:ž>«Ò˜Á`®f?㯕 ešV’ÕQöˆ´e\ˆõonçe–’!²´ðˆÈÒŸ½Çþçu»¬@à㥄Ÿ" 4…x—YÊ 0TÑ™.ôbs±5ýècrV1ygùçò#ÐÀÊï y•G‰YÉGÌ&BxD â¶ÚÊQ÷´Er4!Kˆø«þÄÛ„ø6Uš£ˆ¡¼¿ìÆW8Ê©ªðÝ™¥GxˆçYI=1^Å*NjF±;³;››lÅÃR²»C‘˜*^Ñ_¹U¬¤ŠF:SC° ƒÏQüÍT§’Ä‘ö3EÚ2õÞÖx˜!9bB²ˆ<†²v †Ã¹‘&Æ#|VóœþÁ$>^óTƒì0íZ_q0£9’ýºÕ.ñšyŽE2xLÖɼID†®lÅQC> Ìâ^§9̬K”å#ëÿ˜¦Íò¤~Äó©7ž¡/»±ý©¦‘ùÌäÞb¥-^éÇßøœI¬©á.ýh$ƒGðÈSKwzRG5êYÄB–²‚F2–èPÇœÂQ3{­§¨§†¢µ?ÑOñèÄ(º±œyˆF:0€}ØŽ×øÇòÓÁÙÒÿh½¶˜z^Ñ!ä e´·®Ö‰¨â5óg<ªsÕKYm©Ç ˆ7õõʪZ Ð1ú‘îÔÛš?c5EŠˆˆõ,;£Ûõk­áò„²Ê¡¬¶ÑŸµQ´GEbN—§*õPµ:Êê¨:¡œŒÐP]ªßh”¦«¥OÛÿ#BÂ&Ÿ"ZÏkã¶Mµ­×‹#Äë)ß’¶¯.Ò¢± % „öµ ¼¬é-‰˜ñ ”2Bt¨®Ñ4­ªØo™öqú‘ú§NRŸô!É*«}u¿"D`‰ðƒtÏ(£1ú±¶±?ùBµºFÇi’Öö4°œÅ#L\ÆJ ›‡ÛÚÛ¶yaðÒ¸¨Ç|çIŠd ØŠ?²›©jæË—Ü£œ«f÷t1ÿ¤ÈRÍ œÄNÆO­ëŠVD¼§q+o1Е/òmš’dyXGÓ€ÁÐoÒ›ï20ëäÀ:ò5S)™®™|À»Ìa)+)"<òÔÑ—! gMçf[YÅíUH‹ÊW$±Œ(­+ž·$¡?CLB¶PŒÜ¨SóMdJd£Ð²ç^Þki¥×lH`n]r(n¢èc<ûéJŸù¿DÓ–.\ròëÇDä)0ŠkØÑ䉉ÉSv’­‘#æEý€§)’Ãg ?`x®6XŸ:€ðxO÷s93­’»ðsƘ$Y±šé6:q§²•9K7Ø×`O¦ñ!ß §™¤.a¡žçqÞàCæ¥.`âò%EŒG/z³±»©µ¬oP´Ù·5©SŠF—"`35…ÉÌbËh¤d©£ Á¶lA“ÅØGß# ƒŸjöJ#RªÞðòŸòc¦5\á’`4öì+)ÜŽÒ§ëeõ÷ªzØ?ôL‡ÛB:? QšÉwVu< íå ¡!ºRöï ­S±‘œÃTMP÷ô=t‰V!"BÄ;úX"äau’'´™~¬iïh´~®Û²`â-:EÃT­ŒUäÆîËTÖ³òÇê ô½­€’ )¿0´s#*SºjEû]À¢±÷éÚUÝeä û¡¼=Z^õÖôMQLœ¾7ùÌaúµ¼7pXšœsÜ‚T*ëù¨Ë£uXÚÊaªÀ9ºƒùß5­x]”f­’wdyHßd*a ³ù‡îã 6¥2íք٨Ȇ5ð¸~Íb _â—çu¾ÌdzÃfb oÑ}Œb››<†%#/²œ]x›»ù€úÔ²úÖÎf¨¢†œÍ°5Ðh§ë@Ö~דcø[§±â$™\iëÊ6)9ƒU¼ªÛy˜iÉb0ôa0ƒÌ@:cèH‘å,`>³x—éÍœÆ~&I{7RE¢Pç-élmM¤É'AÜâoZx•±v÷¿*äUŠÎNÑÁ|ÀžÜëxÍ’¬Y{9 ä)çIÎt >'òÛ«OºN?f9Çp­©nUõyHLh$k)æ³t ×P´¤:œËd¨®xT’3(’#ÆãmMäzB–¥„ÍcèÄlÆÖ ¡µTã#"V0—YLãM¦3ÛÒ6CÈ@Žã,67¥‡3\Ë'H®Æâ±Üw=/²Œ "¢ Û°+û0”!¦*j+É·pâÜñ/ñïÓ•¯q Éâq›þÅtBªèÏÆ(ã§wcCåA) nþƒk鯉 ü/ yEVD\m´¬®Wy ŠÒÀQeØ«ñª¶ªRF§kÁD1UCd”QV?Thõum}UÜ윮Q×tˆýœfª4dFMDJÌ nÖiê¯Z}ð”Q•Fé Ý 7µÌÆ=J¡®Ø~^!|SWéxõ’‘§¬ŒÐ]­åö(Qúž¸Bˆ¹º\;)«¬{êWzQË+®gå@ÚÿD€˜¡¿k¼¾®ÇôÕ ùòí¹еZi%نʃx-b ¶"/®xm`ÅDÔî‚ë|AhoÒ Žê ´­>VluVYó,ÉDHHÌâ‘(#”Õ絤.¹1W*#dÔYw©5'Ú ¬š“£Ô#žÒÖ2Bd´Þ—Òã'gÕÈjnѪQgåõäk¨¾¨Û´pBq ÅQL©¦ß™¬ŸiKû°fd4^SÕü†—BgbŽ®ÕvB9yBÝt¦îÓ‚‰%B—c¿aÅ#[IŠäqXÍ#Ú[ÕBÆêëäü{ëY©ÙµXß­tæVñ±æh–fjºfèÍÒlÍŸ±4»šB3ƒ’7úï mœ’6fÁđ֑8Mq“|™(a…¥=Cž¯5[}õj&X—g/ÍUk„~¡Â‚'7º1ýÛ‹ÚÃ’ ¢yŠí-‰ xL‡¨c…£•ÑnúÞQyOq…m‰›ü6¹EsôGí „rB[éUZó’ͬçoÚÝÆŠÑ@}Woª1%âšÎmØ‚½ÓGï\¡ž®.BFyuê¤gÕXáþ®ï¶xä;š¤+õC®C4Z£4\CÔ_}ÕO5XÃ4J;hÑqúª¾§?éf=­÷´hlã“¥S¼¦Ö£¾JÅŠÛU²aú›q­ê4J_ÔešªJ¿z¶v²þó¥¶1®¸q¥}´æ¦¼­ýä[’¯åv“u²êlLÀ—QµÒÍš?£%oZˆ‡t±NÑ1:E¿ÖR³1$9³ú¹zÛ ³~¡å«hd’T•Ýñ@}Ko)Þ€á»dóßÑ0eÔMc´·ªd4Jãu³Â&QšxwÇM¥äërÞЭú‘ŽÑ6꣜Œ}”MjÇ}{³ö/ETŒ:«¶Ñú¦.×Cš¡ú4v5¹{a“¯ÑZ`”ʨäUõ#äF#ml/Æ$u°èߪ<åDD7XÌŸq¯žÓ<5T„Â’“ ¹EÕ22ÚV*`e“A²òR­ºÉÓµ»|!_£ô¤„øP?ÑÀ”Ê(«ƒu¯V®EA7©_âB‡h®µfQÅ€-Ä žÑòlÈê⊫ð’ÎT•=^O©×´áV$9öì¾:kŒŽTÐÉš?£2$Ö4@Õ|DËxEÓÙÚS}•mr¬ê´™¶Õ¾:@GèX­ñ:Bƒäiíªí5\ƒÔWÕê¾ÃX¢ŸFëlýU¯ji¶|ÿKæ§©„Xó.©{Nwè&ý[Ó”x+õ-dD7JÈ+ñÇÿ©ÓhħЇØÝ”r$Il9¥ ¶Ö+ƒ4°Ló™Á‡,¦žåÎs°žÆàs-'™›Ô‹-©3™&Y¥Ri÷º-Ót*39†siê¹SWð ig¾ÎÁ&ÒYÍK- \® ˆñéF†Å¸™L³,RhS' üAÿÇ >ǯØÖÄdøH禆Z>Ç7ÙÛ$—äSlŠ|U×§•rp8÷ãñþlj›Du’X€W‘=ôsô2ñ23YF£˜øtd0CÅPúÓ—®äoÌŸTƒoç ùPWñW°™Y©+YÊB³ˆù™Ç 6NÒ™-ɾìÌ@SEKÓF[º{–i&/ñ 9ÎbÏ\— 2¸Q¢%c#nS­PFõ´¢fI‡²ƒ±:}ïl=¥‹ôy U'U¥ÚòPÜ œPFjÑØåi+§gÕhݧ䅫Zm•^׊oédå„õô³®«µp‚hH‡¥–-í{ÚÚ™»hOUk7ÍÕÊŠq$´…B‰³¹ŠIú–f[ÑsvµJ·J»èN-Yz_qƒmmL‘³•µ¥ECå)¯C´½ŒÐEª´hA‘±4ûº®Ö±ê«¼ô jõÕ¾:_7é5-Ù`KƒÊÒ/q;ë¼4{˜ŽP±ÂMŒ‰)°ŠÅ#§èa]¦/k/ ².¢§Œ†éPýF¯hű‡âZB˜eüNCõ-©K®W´ñäA¥Ëð¤: ¡*ý;Äj¶Ñ†mD=èí *ëýëûæ”S­^Öü[ÈÈW?½«Ë…|eU«ãõœ"û¡„*„Ck¶eüZƒ­&C¨·.Ô‡*ç’âµÈƒÐºt;Û_¢SÔKÖx=¤æ ±|ÑÉð¦NWV¨Jhˆ~®YŠšDŠäÙ'×ðBakᾤ>Bu+_ž¶Ò,5½7Éÿ‹Æ> ßè`«º“à^Gí£óu›¦T&ÅÍ>{¡É£ñ :êÅMÞÊí­¼u 䔨›–s«öWë³';è¥Ýtš.ÑízNÓ4]Ó5†¸Ò:'K<¯okKùÖ*IË(ZQßšÓ˜§óÕÇz½È×öºV+*êm£ôR¯mE®×X]¤¯(#_»éÏÚJFU§ Y`,²Þø]­Œ<»A+í#Ú ü†·D­•üTƒÕCÇhºÎʨZuªRV¯ª`÷½xä=úžvRmúöŒ†ëD]«÷Ußâç +"Ðq“4Lâ&ݤCÕUYõQm©okššÖŸ-Äx[Ò j#á›ëkzD«[4:Q³1ïZyÚzŠu’¢ú®xFéEM‚\!âEWÕ†žŒ:j¬~¯ç´Âždd­U„xV”ÚQó$м£Sm¸È×Ùé^wð¼À?µ­µ0F¨¯¾¡¹Óõ/-œÐÜ/-¶¨Å*ö’¯¬Õ.òU«k4\H‡bYÛ"м§3ÔÕŽô}(!ÞÕà *â¬Á'ªÇMÔýûš¢1wØGÒúŠ–f#N¸Kgi{Í<[²nÖÌ4ñÑ4žPù@ÄMŽS°wyÑØs­ é¨*kvFéf‘ŽÖH…„MÔtéºNÇh°ê¢}tE‹e÷aúÀ„ˆóÕ]Ú€¤E+ê‚Jjäu²æO*Ÿ@òÁÿ¨¡öožóµú‚ÞT@#sTßdˆ(?—«ÙÓºfw§úxiö·ByÚ\o©é- ×ÐEóg\iÕpâ%Ó%ZI„˜¥Ñv¨ÜCO[REÖ¢V¦O#BKäYÚÁÊ“ÄJ\¡~ò…V}ÙW1Q;*o§ñ ÓÅ69ñ}KŸ±zZk0ÆMrùÍÓ6q Š6¶V)Iœ¦Äáü¦1 <¬#í=y:H÷ª!½…ûuªK}÷QºX3ÔPá¾Ä©õŒ›D.ÖœbY¾b+˜©ÛuŽöR]zld4D'ê:ͨ(Ú 7P;Ç©Ãú¸ú Õé§ÚMym§±òÕC[ ¡Æõ²´AEÅÈ’ºçõ¯ª±îdeäk”~¨¹*Wåiã‘vÍ‹;YýdäË×ÖzNb9ÿgçôÒ¯Ô€xEýdä)¯Õܲ”ÄßÚ[0¾¢2!"à8;Hݬd`mZÆ÷~`÷ŽÏûSÍU˜N¬,‰™FÄêkot/£—Õ4RUØ™dð{B; ×—U£Z}YË˸IcÕÁÆ Œ¶Ò¯­0Š×HW6p©¥"i¨ÎÓãZRµ(¢&€AéV3CwëBdE V’e4P§ë¯zWeǰø‰+¯JE–«xH5Y7«‡Ð:P¨FWëwúŽžRiÎúöVlVúX*ü¬gþŒ—u›~§ŸéB]¡§µpB`“¸!Z£,r#$Â&ócoTG+vÕë ˆø«†ªNÿRbwþa§²tÒ£R“Ê©Ê<ÚõÖi§¡Ü"nµîÀ7TÎØ4Øâ˜K5Ä*­dÿ'êe­n2ÈEi$µH‘W5ÎFnÑ@}]/Ûš‚ ‰kÖ˜Vž­þ:L}T§‹TdŠ.±Ñßäé¯ïiŠÊY¿‚½2«Ó‹^àªNVoúªÑÞº@÷jºVÚk­AÚr¸ém=¡+t®öQoù2ÊÈ—¯¬ŒŒFè ݤZQQ®Ùܛ׳èdÍèpÄL|ÜJ»Êé=-EÄ×§ô±iT™ ɈSv¾ÖrE6˜´•OW^ò_(k©0BO¨ñ‚žPiPø­Õ]=5Wq3ýV>ñû¬>­¥Ù8­‘ùP}U%´J0ñ¢Î׈ŠÚÒ*í«[UhrÑ‹–Jå3®gÁÄK5$MgvÓqúKš·*?EÄ ®Ò©ú¼nÖ?u‚z+ŸfØúéËzUa…óÔ<¤UŸ><÷êhuJcF5 }ôeýF7ê!=£×õ¶¦èM=¯Gu¯&êb}CŸ×®ê¯š4Í’µßu×Î:_hÁÄÆ\»¸Âå‹6˜®aEB¸TïÊ–.¦‘‡uª†¦uf¥T‹Q^µêª®ªSwuUGùòšL©Äþ¦V[êt]©—TO¥|*gäZêmi㊆ŸÚ«Ô]¾Pw[­µzðŽ×p4+ïy˜+ƒfÑãp=£ÚP8Qä—–tYUé0½`hHÀ9V<잯ÅÏYécMQ7;Cw®‚&zôKBF½5K¯h_uKªäë.º\óÔzÙž„éÔÔ­¢‡QF}´FëP®íì^&W©€o”¾«×Ôz¤ÒË~K×êp°j¸\µZ9ë«V“£V©·vÓ™ú“ž³á´M½M³Nh^ÈÓ) š¹Ží¥|½æª…ä‰ñX¨óÌ@ý€YDLâ×·j|Ь´sS}rìœÕʦœÉψÌVdnÌ1rød¨Ã'¦ÀR"^b5Ñ•]9‰}ègJm”×]Ì–´úôcöç1ÝÏÝÌc!ból#’Ø–1šŠ‰=øû1Žî&ŸN"\÷ñüŠWmeFr*è &3•iÌc5«mwHÙ¢Ã.øTSG†1ŠŒ¤«)Í»m‹››¿ÍxxÈ|DÌ®|¿ÝÍÂý èfê\Žâó¦.ä> rtçÎb ó5] ÄìÄÃö$]K ämen2cõyud3ãSM#Ë4•'YÂE¦¿Ô:¡û2“€F0†1ìbj[ìñ²®V#É* bš^àA^â# ÒÕóµ«y²ôaG`7›”yjý³]:§Òò$¥Ê×U,ÖR–±ŠÔy:QCG:Ò.¦ƒ! ³F“ŒM;É59úò¬ÔÚN禮ë[/K›L"¾óêÛiZÆs¼Âdf±šQühB‡Ëj푺™ÑÚš­9€á3» ÍÙ2âòڋ뾄ÆvKÉZê 7Ãù õ.o1•Ù¬d5õˆ,éKO¶`£èfü´¬Ú€m‘O«ìޱïò‘-ŠˆÉЙΦiKèä*5Ýc¶ Ý7=IŒíˆS›œZùéÛ)i=Mø9–ós|}ÏœkÆêÜÎ<ŠÀT`€m,´‚eôc%³UC–ø¬¢H#óYÉf3‡˜ÃjV¥ºXui×ËLºBCŽ?™ª”æØ.!>¹uŸ&½>!Â#CÓ›}XN0!ºÔÌÌî”_’·-Aâ&ÝÊ“f^+oXrœRüœ] ¤ÜMÀ·Qò}I&(%D2†KéM¿„T”®Qݬ öu«ÏFîTÖnÿ%MeNÑ75PF»«ÀÊØºÛ{3I#ÔOÝÕS}Ô]5ªQ¦bÚ©‡íi¨NÐ\Å\$O¨¿‰Ó~%'gýæ…Óh`cÅœ·–Ó’Q“TêšžqØ ·¯²^"¨ˆ@F-–“k­5¸måô‘­h¿­N׳iH‘;ˆðˆØ‰#ÇÅÖT1—2AÿäVìG7–ð4ãÀRæy"Ât š’“”£†^Œ`G¶a úšVy:ÚÀ”,®G(³×…¬®«šÙ^ì°_iá<Éc¬,/d"Û‚iÝ–/éh¬J~¥‰› ¸%)[Kk*Ú%ÖvÓÛÚ,àÑ‘ö½¾åzʃ•z,‡Ñé~ϧ èk¾ÃJj¨2Ûk`x”E†˜‘ZIL‘<>UäèHêHO†ÒŸát¿±ËIž]a1ưð©¥³<ãQ•.¿”¨Ô<µ‚²¥¥KÊ.WÜĹ0©²L~S•v¸ 1Óý&í¡þ³›šIµpi¸-?Í],Ïž_e¯Â²bo Òå‰×hcú_KZg˜@'Æ‘± /ËÏh-!5ìÍ$|"^ãáK½ìoL<Šä©¡ÉÑÝ”‚g!«#|<–¢+¥%™¼táû’oëÙ߯ÛQ)“ÓTØÂæ¶±¥Ÿ3-ìÅoõÅôš½ÃTœIåÿ¦ÉQÌ:šÁmJBxmx™´b* Ãô›iZ´4«8”?°˜ˆ€ßsàÈþfužLÅDçbÛÇ!¶ƒdb«ê©Á#²Ë‰¸å™?«X¯;ñ†MlM¡-=!eŽ Ä üb Ķ‹u)Á—Ðÿ&ðWžÂ#$´ž»X¨˜~lÁ.Ö²z‘K¨¡N,× IDATÑÒߤjÑ᳇õ²´õÌÄ'"fXEßÚ¦¶|Îæ>>®¢§¾n:Z÷'N±'º/i4‘±Ø,0ÀÜ$ÑÏ$nŠgV!ªpkÒ8¬i—j±çƒÖ2Múù‡D–ÆI`Y¶Óy‹.]Æd­$ƒ¡ÝèAOSeõa#>Yë–ùîî9Ò® HÂ\ÝÖjïr@Ìæ=]‰¡H#—ò§ë ú™ÈzÅaêûä€ fL2…W˜Ã Ò€G@Cžî Ö¶ìÏè\— ªIÉÁ‘¶!¯²§ëµ¨y}KEÃÏÍJý >1Ïð2›s€ /ýÉœ×ý2ì’Ë>†×õ'žä"›ëJb— @@Óy„ëR<‰föÚ@5И®wîð™Ãúd"ÞT[ºv¿þSw­ÄéZÅEéü¦¤ÜÍW7ÒnzY1gʤHÿn*2dغýröÌSFûi’JsÂv›±q[;ʈu¤†…@h¿®ùæ|j¼ øžÙNá!VÚÄb–Ò™Ž±+iÉÑHd¨aéEO ]¨g) ˜Ë–Oò6¿Ði&›VŒ98yðQM'«)ç·"?1cÍîÙgŠwó1Ãèv^†Fb šê“‚ñÝɲ#Û²5ƒèIw“IŒKÖýú€IÜÅtV‹9Ÿ¬N5Y§j?³X¯zÚ‡éQ"à4®6­ç{ÈkÛzް»Øe3ßçu™V<ßV¥&á-Cž\ÒórÔ‘%)^Y>ö1^e*+ðmLibO0ÆüŠn€x„;Tí,ÎgÞúYå]©#Äg“Z‘—Š,]=[ÑuÇ`™VâQ¤‡msý}ƒ§U.íÃ:²nör¸›‚»{Ž´­À 1ûZIñó×)‡3xé÷¤00±¸sX€iÙøîËÕ4,P½´v8ŠjŠÀ[,”»}Ž´­°´y´–ð žiEô@xdðÓéˆ""` ènmh2á&?® hà#b(àa0dÉ„Éj<RM굂òI}ÖtÞÇFÐeªR²`7#à&žSÀ'cõ.6žû0 ˆ›3ÀÝ=GÚÖ¡œÍHëÑÿ†©V}zëq°‡)àcØÝêÞò¼Ó¡f\±ågÌ’!¢džXŒÈñªî°ôÞ®®Ü‘vÝð‰É2ØœCðyŸßRl•ž-ÙZX6rÉŸ£ÓÖeqq}0„<ÎyLTSšÃ3M?æ@Tqˆ+˜ùìBëÙü"IÎ.cœí[£ëÔØêBÁq»:ÊÚA 'Ä4_ô¨ËmïÚŒöÐ?´¤®H±‚t@Úkð \:ó3»m@?Ó¤Ràyõ³Í>‡éÍV¯RàtÛ)û\•—Š+Zë®äÌ´ÿLm¥Óu¡¾¬}Ô9mÆ9L/ÈU8ҮǪS±]ÆîrÛ¨®k4Ò *Ú… ­=¡22ê¬ÇÔÒþ#ÄQ±Die¥*¡¡ºm=:Ôºí3NZUÔ^‰Å#·ë¹ Ÿ«±Éz)a“¸¢Šféãí®ײµXóFÄ .QïtÇŒí^-4Z÷©õ+¸Í‘6mŸ4†{WÛÚeE;ën•'Ú(m¾Q¹ŒoÌ]ꪜPµnPK{ì 1«xY§hË ;›ÑHýD5Y¼ÂmŸÅm½ŠÀã&3 Àç^§C¸m iµÜ3ÆOß½dÂ1—>ÀÜjjZ˜6RšL‘ô횦ÉÌ`Æn7v;ɳ ZÑËËÁEÒÅ(¢4–ðÛt©Ï±šcWµ +VWPÅ2?±+t²Ë‹®­Ýd\ÑX³²9g®±·ãF”nkgò äPÓY·Ë8UF¨“Ð9V§6• ¥¡ü»ÊLVg)h±ÏlÔlažh™¾eZ»[çH»ÑU,Á›øú{ÈÈÈSN´ ½•×/ÙÄWµŒPN[ÛU×¾X[Cz¤$W¬È¤ ü8MëH»žkO*:V¿¢¡öÏuº[•=¯K+F}¬CíÊc]uÇXEk„Κ¯KØt I·¹9b-”È$_ƒô'ChW?Hj\w0;Ùdì &ðºbâ´ 0iÛq÷bˆ©â[i"ëLµ”U6-f™½&S}ׂÎÕügød)áS$)ÌÎدÄÞtÂ#d&ç°@õxvrbÈùºÁVœÌy&p¤søô¢Qšz­¬<(¦j²ôû—5J“tnš·:M‹G–Þ¿`â×äÛE;OLïÚ¹íSÓ´±u·b›˜ ÒÕfJ5˸G;ë0Õ³4{¤ÍaÕè"%˨/{’<;J³UJh=W©q›ÛZ\Hp+ æKë^Zü.KñÉÓ“E40ÉÌ`_® ‡É0CÇñ >PÅß9Â,˜ñ¥!ÑHDžã¸˜¾&Y7Ë£j×ÖÈáÓK.$kb…üK{('„zk3% ÔùºC›@Ïk˜­¢×ÔÈQ¶Ìå+úPå Wô^nsÛ' y•Èu…zÈSVh?í§œ­ïú¶Ê Ô„üC]lËš­)ª^úeZ¥©¢»ønû4HQZÜCô±Õ¬£u”‘'dtꉚ;âÂkK«¹U7ÚÚ×°bÝÂÈ•ºíÓ²´åæqÔM#Ô[ç©VÆ:\¨NO§àÍS-çdKÚ]«8µ©N¸m“$Ê ¿ý–‹È0šWi@4’!K–Ü“N<Ì>«Èr!{SE=?e²Jµ\ç@8|úÉ…R)"À¦Ž™ôçM":2€Àö/uíjdŽŽÓ·ÔËüœ~4óø.‹&B¥+688|ê1l í­ˆ+8,>>=ˆÁ6HZ®/ó ×p¶†ð}ª1„ÜÇ5ã#²6­ëàð)“Ö³+!€Ç’‘ÓèÈlM 1ƒ8€œÏ½€x9Õˆf.çIyœ©‡5AO©ôªFþ¬ÎÊ åu¥ 6ûOuTVžÐoåB\nÛD!¯ -ý.rŒPµ²ÊÈ×*Uµ&}ÁfÂ2ú¶Š¶< À—mÌv˜^“»ØnÛ!/‘!´kx|‘j >lÙa"Vñ#¦á‡óC“µê2.`x2A‘+mmnâŽEàVwø´¢I ùŸ½ÆŽ"2ÐößJzt_§Ç˜Q\@G°]»#²ô7ßGä0ÜÊ£*õ]ŒÒÞ³YÓ–khu»œŸhˆzéWy®&ks!”ÓuªÌ}%SdV°ŸÍ}A+­ p3iÝö©iÚ¸bvV`'‡¿«wTš ›üå+BFY¯‚vXîq¯:åT£I*×2¸¤®Û>Mkm² |B`¸ÙÂø@l³\¯ë@ôá|2Vø„-:ö7c"õ\ÏjJM=Ýz‹Ÿ’¦ ­„Hܧ„¸ICä€<>°‰ÜãÙÁ”OʱíSÅiÔ>÷ó¦ !¸YbŸi}ÛþÈØà‘Gdñž'"à ÎÀ'oI^´v:c©¹Çf{“!b·X[ëj>Ò†x–¶Ér Ykw!‹îäCÒfRõiÒ«‡I‹_ù7ÓãÉ@E¯ƒä§(=Äçn݆xÇ[LÉáÓÓ¶üâD¹¾¦wð€}ØÂ”^¤ôŽðm"¦óq‡Úß>†ÈZyáàð©“¶¤FK¤}†ÅÄÀ8:RZµ1kwáÓHÒ²ÓÃã ºð(ó„¥²ƒÃ& mL)dåQä ¦{ ´ŸLBGÙ&H ëÊm9f`˜Ã˶©’‹8lÒ–¥,ÒøÀv 3JI>E<Ûä÷¡¯®ïFÁ}Þ¦€i6ie— M0ƒ‰0lOÆ–‹ÇÄäˆYAÃÐ%g| ÎZméþIƒ:‡ ÃzùC¦ÉÿïÒT±=Y<’E™ŸÑm70L_bþÈÝŠˆðˆ1T3«˜ƒ+Ltؤ޶¿×2 1þÕ¾¥¬G PÅGlÁ~þåg•V(÷èeëqÛ(ƒƒÃ&pÄLú]#KmðલÎ=†Ý©¦ÇèÇÞå©«þ©›´’úÙÃÍw1Z‡MGÚu}Âì*b ËYF”&F™kØŸŸûÙƒN<ÂLÎäAå én£K8pØT¤5•Ô­M¶KøØF ð˜®`gN¥! YÌp^ä!¸alÞ 0kYsÁÁa#Gʤñ®ÉbÞa °øâð†alOÌ<æ0”è,&"CÞîÁMitØÄŽXB<ï…d¹jž¤ÞRùõï¼EHÀdÐ@‘ Kžx(M)ø”3h›@ÓÀà-ɵ¼ÄB%%2¥Þ‰±nÌ'™Í°3`ìdHœ ‘98l2K›”wÀvBÜd+mwxe[KÅŸ¼@öÂ#f>"¦ŽÒd›„´¥¹ µx@Nâjž@·®`gòÄìÌÇÌàt¶7Ë ,qɇM=Hìh déAˆa1ãÙ‚³yBØÞÜó‡z2Œ{È“á.0>ð1Uô%©SppøÔ£¥ôBB·¾@Ž9ô5—è NäÎæÀZt˯‰ÛrNjWM_pµmBZc‹¾;O=áñ*¯ì˜H¸æØðÈp}ŒësàÐn,m2ØûAO Û1„À+ºš€€ø¼Il«+qh¤•-ôaö!ÆpïÉ#Ã|]Âx ã<ÛÜ­±àÐ.Hë¥_sœ@±Ûˆ[¸ŸóØÖ$«8ܵvh?уÄñÚ'·-àq _~O¢˜ã91 T¹kíÐH[ý Ð%8˜©<¶cÄ`+¾K'O<Í#EgiÚ!i£´ƒâ+ºƒ˜?s<½€ wº¸¬C{$­oÛ+Ç\ÂGøäXºdK3ˆ¸—ÉN8´GyPÄ&értá;ô¬_ #+¸ì\㪼Ú isÄ4ò–Sä<ö51;²ÿb®b|b ‘«òrh¤'ôoBöà4 1½Ìqä€wyÂÎÊ®…²C;!­ˆ‰¸‘•tãÛô1 ¶·Ìaô#þE‘-•ɹkíÐ>HëñŒ>ÇA&)?̃Ía@ÈLV’Ì­uh¤õ€˜Go¾A5`ˆ0ÄÀ ts?Y;—ÌÁ¡hÚ7õ >ÇÚV²}º"¶2»p?³µÑä³ƒÃÆ÷3‡®œb‹c "Âç–CÉo1Ùj_´uhÒ Òž³!°täÄÃv&³ó|ûÊÃè¬æ.{7sÁ¡MHkš½ñ…)oÓ™ÏããSê”X²¹=ÌX^b–dWttphy tµ˜I¬bWö2AÅ ¥ÜWGP…á-^ųKà98´ iKË|À¢Oâq8ù ;\ê‡Û-‰¡È“ö@޶mæˆkW§ yŸîìd‰ˆ(5¦/5®ïYw01³xlœª]‡MLZ¯‚´¯³š­ØÜVÕ’ZÙŸ£–˜iL»ÏÅhÚ0zPþþm`ojˆì´›rÿoìja[² Pϳôrh;yÛþ²†yˆ€È"NêÅ2ri‡ZðE[¶XŽ4$ý²¸…EÚ4z5Œb% _Î"<ÛñÀµm?ËòÀØÕoÌLGZ‡6!­iÁnÔ3Gì*a‰¥QZZAQòdwrqZ‡6ŠˆÈVìFÀl"r`‹e’öGÆ–'f1Á-+rKÜÅvh#yP²³b˜Ù‹‡ðFÀ§@Ѫ×d=›ƒG㱫1tq%àmCڤʫT5›á‹¼Á<‰*`9 ´Xˆ ‘%ge€e4 z9Ò:´•¥ Ó¯"f3”'1,ºåÏ:X»³;çM_ør–wtŽ¾ê­¸8d@׊V÷ŸúDÛKš —4FÈØ_¯©Ú]È—ÑŠø»òBTô ä6·•¶OÔŒ ‘Ì\}ÉÚ,å»/ó 5 fË©¡idèF_\×D‡vAZhà2,d;°„¼ÅP:уÉ, Çpj˜K‘áô0‘‹8´ÒÆ|@x›y e7DȇL"²œÏræ[â9qàÐ^H»\àQ` xa>Ã8Ÿ/˜óÔHGv$Æs“ÈÚiûšÍô"1%ªé@gú±G±­Y–}C¶s”uh?¤ 9“ûX†G€40šÝ9“"Þ,¾Ø’Áâÿ8ÙÜÁ¡õø„À3ìm~D"ªlº' `ø<˲ì“6ùpphsKk1L0ÃuoЃ£ùªz:°pâ=@G¶¯upØ80Ÿ4Sâc(Pd¹r3k†ÖãcyQ°-˜j2àT­CûдHQK­I~JÚ*Ãõ¬&Ã8jS»ìàÐæš¶Hˆ0ÔÙBÑRvžÆPÍÖ»Ú‡vAÚœÆX|[¶˜³¤½™b”‰­ÓæàÐ.¢ÉÄ›1Šd ‰ñX Û0xOÞ®lãrbí‚´†R3û¬s‘Áñ<;²÷Ll}WäÐ9´GlMGÄ4rBN¤ûй]¹ŒC»°´kÊC–Iz˜m8:]ÇÑ©Z‡vJÚDµÖó<à4ú™Ê¿¸—C;$m¢^ï×3ˆQmeAi}G‡vii=VñgVsm¶-L6‡vGÚ¸_O£9Î5J»Ï88´CÒæX4á|N¤‰I"¹Iÿ/ç†9l,|¢‚aˆ1Ïö¨½N_§}¹#WäÝÕuøTð‰gã&«åFdˆX>ò Ôp]wiÚ©GëzMчZÎ VQCìÒ  Ÿ°?mÌLíË~É7LÒé9ÈB<úÓ‘«¨á0Î<¯Ëež³´ Ÿ°˰„e„ô!dÙÊtÔ†áeDŽ"Ï3åÒßOê:Õ5Uvhò –âÓ lgÚ×5x8’jŠ€áF®›bpÓÆÚEôÀ°œFòt#éL›áN"à-VsPC ü“zW_ëÐH+DdÈÒÀ=J‘ >0˜=iÀ#ÏÇ̔Ӵí‚´†Iè« 0…i$óp#|žàp<Ä®TQíâ´íC”þÏe.«èCŽ"ÓéK-"Çxò.zàÐH ·=h“ÙbÕdéÂïÙ‡"Ð@‘Ë9Š~ÆÅiÚIô  h°Ù¯CÌשa³C-«¨Ça3ãZÐ9´M ÉRüÿöÎæ5®*ŒÃÏ{îÜiØ4©`@‰5iK‰šB¥Fðƒ"XÄÔ’…ÑnEp§¸Ó•âBüÜvÑ âTŒ ZZ1•RƒÅZ­ØÔ5mLó1÷㸸gƱۦö üžE!Ì@xòÎï¾çœ÷°DÔ¹‰Wí=–™Føž<[iè·´ ÐKÏ%  d‘ãv’ ç6>¥ d/F¢e\G¦õ 0€q0}4)ø 9ËÆ}ì›ð”š9#âÖØdýxæÛÓk$ää%3¬ÐË+ Q8eÚ[3á°MÅ5<²Ìoò¨U#’4&I¬׸¶Z° ˜ãoúÈHqä°%ÿ«ìâY„aè²7XÚj£÷ÝÀ/,ø>KiRÏÙS©e}”í,›èH¹ˆ%Ó£ô3Ïž¨±FI¶ #ÁAØë¥>­ˆ@Új³á¶ƒ%N…›r—©VÉòp#n“jÿ—­ˆBÚOIƒÝÀ1OO´†ê”\¡ ¦á"–xžH9ÎEï0, £UÎ-u"LÄ)m+ $8b 3œ˜mݘ«:+"•6i‹»Åö“sˆ%u DÜÒºv!a’^>⼯.-Õ=±Æöä•TL®‹IDATÜo{˜ãCÊPiUkE”ÒþûHæHx’ò‡÷á~r!"”Ö:^(aßÄœàÔ©]Pi+o>2EÊA.§hƒŒˆYÚÎ[¦ØÁ7|ÑÔ5£"bi-<Žy<Ž[í ®ð69©º"ÞJÛêó4Ûùœ£^˸"JiýUâÔÙfû¹Ä»êˆë†­÷‡ø*§ýãäLs—Ð ›UwE„݃jŠâFFì1~çã i½#ù ´Õ‹õr€‡˜?Û¹ãVˆ(¥…’ · ¾ãØp¥kÑñ &DdÒz)ž¦ð|a(ˆVZ Š–<øóÓ\ô@‹$iE¤ñ µÈpËÈ$ç˜ UV«c"âî ÕÖóu΄aH…­ˆEÚ¢ý݇+B0F¸ÓÔXjxLõVÄ muêvcþlF~0`ƒ,iûM´ëKD ­ÇX#ç¯á)k8Yˆ 9­)4Ön| qƒ3­‡k¾ea´ N‰'%§™þÆ%„Ú«:+¢Ö(q”¤ç™›MÈ1PãhóWÆÃqòªÖªé%¢¨´I¨¶9Ûy‹,L¬…sþuvrO8ôèÃʘH MÆN¾æ5¿Œ£à”™“<àµÞÄ+ ˆuãš¶&¶ÎUßûÙÌŸ±ÆK°;»;åœëÜÏußÏ]Œppøï‚çNƒ#­ƒƒ#­ƒƒ#­ƒ#­ƒƒ#­ƒƒ#­ƒ#­ƒƒ#­ƒƒ#­ƒ#­ƒƒ#­ƒƒ#­ƒ#­ƒƒ#­ƒƒ#­ƒ#­ƒƒ#­ƒƒ#­ƒƒ#­ƒ#­ƒC9â²åHëðßa #b !`ˆ:ô¹+!wø8ì®×¡7„ƒÃV’QÓÌYZ‡­j[…:Ü2:Kë°•4mXF±¼³´Â"²@@ÖYZ‡Î¸W¨ZFèžµwz:ʶ a†ˆkõS*ø YÞæ*Ði¦¤t·,šàäC‡9^%*ÆüY_æ¾ÉN&K#¿Ôdng{ãrNÓ:t9)‹,Ñ)ng¨‰€¯ë Ž7ÂwšÖ¡sÀ â Þâ› 5àaÈr³Èàa`‹÷Çi: ] 1 ^eæB Fdˆ8f"°"BŽ´CÕ å±Áä‚ >=§ïID"Œ³´#và[[ë”e‰‰© ¤vn† ò@¼…´u¤uè@;PÃRV«H±ˆ,YúöGZ‡NàˆÉ&"V² ˜c-/ø–Ò&øŽ´C ɘaG <‰±ZÜÁ4s¤uèP{›w Cyesb f‹/GZ‡­„„š‰ZígŽäm^æY‰ GZ‡ÎJÚR¬ö( wÒ„!Øâh#­ÃVS´ØMZì;ww&óª ë’À:¿D0@ßá§ÓÀߨŠ1GZ‡N) `mîÑôç1樹ÃiæHëÐÄ5` cÌÉ|À_ɱaŠŒË=pè”ð8•<Ìû*ØP˜Ö“Ž´Î1;ÐÆ,n'S権Cn‡­"2œKîc±Š› †Žh’äHë°•àçöf&w–Ѭ#"¶Ž´[I¾A÷àlîd儎Üs¤u؊ąϰÓxtrT«•#­C猃¡·9›&î!"î° GZ‡­=-®9ž<Ë¿”±EÆ•Û8tÖègó™ã¨çÁ²Þ‰±#­Cgµµ 9»r:f¾ŠÑWBîЩI+`1ã˜ÏóÄ–®N8tZWÌ#©Îí9ý"¤`+v3.÷À¡sÚÙbÕ­áHºó,sU”±#­CgE‘œ;™}YÅÊ3ni:]ô @ÒI6BÔpð4M6ßËs¤uèLÑ‚ÐþŸ#²5c!â*y…6‚àšu8tÒz€ÈàQ@ðññÈbÅ–2•˜׬ᓨWˆÈaÈQêZÓÏìCÀ‹’œèHëÐA6ħ " &´š¶ ƒ!f_à5lÇZGZ‡N€ IQcðÈ“ªmÎÁXº2“y¶pÚ#­C)Z‘5ÆDˆ5Ôe=*ƒÏ@úRÇô(¹q¤uèÛwFx¼¡‹u¸Ž+ü^Å8Bô4Ûï`¶8IÑdrè„dh¦Ÿ›õCâó ]õY㑺1xìf®³´@ÑfOèJRM/ !“Sñ1;³iÀíˆ9tÄø¬žð}ê©b"C†ˆ¤)O_ u¬‘Ó´†G'¿‚Èp–b|r¬µ*vb5«]j¢Cç€O„˜‚‡Ï,"T±+¯ª[ÅÐCõà¶q:‹8h`6†*vf0ŽjNâÿi ¢+9Ö8MëÐ9 `¶BD5]©GÀ`ºÒÈõ<ª`¨¢Šº-¦ y9tL#])°Ž%äXÇ;ú” ñ)°„ =¨ÝbMkäηC ÂàáS uZÃËü™œÁUÇôzL\¢?²OŽé1Ýs¤uèh¤(³¶4$B<®ï±+×Ðߪg8–ûLÅG*:$zÖÄä¬X*Èq‚yù\ûšO#©`Ksœ¦uèxVÙšô{¥jw¨ù•."Ç šØÇRÜßâ×rpè`+Á<Àcs 7RÏ`Fá :µí(‘ãDVã1‚QÆs…Wã ᓳÅ6½ˆÙÊÊäHë°U`Z8N1ÿ¤ž,'!Œ+ltèœâ ™ÒÑ ,Ó ìÃXf‹;8Ò:lE>•ÀóLÅç$’dñеútèœðÁæÑ®};}8’*2liÏDGZ‡­ÙÖõ¯M{ q8c;à¹Ýæ‚ÃVrÄ2Dø„ˆ?±Žžœ×A„s–Öa« ´ú5Ã‹š‚ØŸ#LÑ{Ž´DhàêÉòYª,•ã-~nGZ‡­„dîø?õã™`«q·¼¸Ó´[Id€zþÄZ<.¥†¤Å}q>¹³´P< 'ñ8#ÇDeöÕtÈs;8t8ò4eo¥‘*Î¥vzb{c Úb[ë,­CAv{6¶ÿVp{áy ûó™+‹öÑÃØ‰¹N8t$ à‘µ¢Kt;Y.¢÷u…}%GZ‡³´ÅæÉÉ×wó"p LG«P§i:Œ´&%”an£Š/ÐÕF œ¥uètðˆ)ν÷3 Ãx&˜ÒäGZ‡N'JdZ¤[˜ ©Þ 4s¤uè 7¬H]Ÿ˜ûy‹ Gp´ q”Ø8Ò:l”¶V̹ŸóéFf‹§†9Ò:l%Äv"n<7ìuböãP@$}¼ & XZîÊm:‰–L Ës1âúš 9B<²HjÄÜæ‚C'RµÓôb8gØÇ’… ³†‚#­Cç m£}&Ä 0 isdIÒ‘­Ë9Ò:l{$*5¤žÉxtá<+BbÖ±zΪǷd·ðµÜŽ˜CŠƒ˜ézŸ{3â¶ t!àÝÏr²xÚ³8Ö›k»Ewˆ;ÜÑGŒÈóCe…~¦â#ßTÎþB¥POMTlÒþÃɇ’I÷®g ¨e"À°PY||šñ©ãÇ<§p £N8t<ð€yzÃŽìšóySð4‹XCM`ݱ5ü‘ƒ¦uè–ÖóûÑ-ø£®e†ÈÆe=’hîlk q¤uè–6ÆãuÖQÉ~Ü¡+h²ìÅP2æ1‡Uä˜î[˜ŠàHëЪö] Ýù0Œ±,çVоŒc ÓˆÙ~‹)GZ‡¢¬ÏR½GŽ4òúRÅS4RÉxža60€>,b_ª¶ðµ\ôÀ¡ƒH ‹YIȪhÄ#Ïtñù{Ù™7KYHûãf:<"ÒLÌXF0±G_||`–yGZ‡ÎáŠ- ‰ ±£9–$üS\MÏ´´<àH~Ç3¼¦JGZ‡Îak?² $æêŸ‘q\Ä-Œ2ßxýó eûr·ß³—Ù—›ÈƒíVÛæžµnûÑs¸X¨·Þ–( V^ÜDòÕêድ@uv³w±×dmÉV®³´„ˆ¥ªèd ©½©È"zÌéeúšî@3†f7þ–ö¯ìö¯“Û„´uˆ.TÞÛÞ´I-Cä¨ *ˆ#yžY*–B¶}§Á‘Ö¡ƒP¨mº‘=ÝÃ’tî¾íîeˆma0Y^ûSC[{{9Ò:tb‚×ò@Î0c;~|;O,![è÷z5/—ÙÙ¶¶òp¤uè €—†%5·²iŠtþŽ>ží€Ðg¯nL£±Ýôs¤uè Ò&ê5ÆÇPÚœ”1欥M¾ÏR Ki˜ÙGÃÁ&ÞâWr¤uè G,iäá1М Àxg4‘Ý9›J¼-çìHëÐAHö¾ Øî\'RƒÏ:îÀ°lÕÏ©£Àám°­ìi:Æšcñ)¼«žµ"¶ã*<„‡ÚܽˑÖác@† ¥Ü…Çð8‰= 6yÆw¤uè|‡ç2ÜÇk.ç+¶œtŽ´[†êàTr„Lçi²|÷˜¦D¶`Ëž[îü:lKk˜££˜ Áæ’h …³´[ÕÒ®¡·9Ž 9^àŸÊãXÊŽ´?ÓdI ˆ,ŵ޴„¦Ådî¸O×s;›C0DLaº â¥ÃCi¶1B|Šól|ÞÕOhàæë *Å<ŠWu!/‡N€Œ­Oȳ–«y¨ÅçÐ×GãsuÙÒozŽ´ÍéW·ë.<ªø_Fš>{D ¼É³¿ƒ^ɑ֡ƒPaµê›šHDĉœŽœL yî¤@1ýÛ%;tÄvJX#™EÌö\E?3Òœ€ðx–J’˧uè ðHÚxÞ§;É’åbö4‰~Íp UÀ2$²„u¤uè$¶–h"!1ûrÑ=¤S÷|}1†'X3:©%“#­Ã¶@ëu—5ü†71x|Þ§—º&öÙë$|BþÍkÓÚ×SƑ֡ [^“̶Oë6„á,7Å–ÊÉoN? “·0“Ö‘Öa‹PÅœŒlnæ¯,úòE;¤(bv7"ÄdÉ¥&:lCÊÆ”ŠÁ=^ÔýœÁn&Ûb¡œLXÈ [ì†9Ò:´[cS`bbòüžµDlÇÅø”ú GÌ '&` ¡“ÛÎÖ€ÇóšLp£ŒOSÚ)1&ÆÃ£9ˆx•ÅŠi¶•<lZ÷Zn "Ï@ÎG@•Õº¥1¢Ž£'0¶Øs¤uØ3Ï =C|š= ×û„xdH‚\»ÑŸF^vòÀaÛ‘ÖXåø3«ñ©â<Š=g}k_Mj—û˜ÃˆðxŠÕsi¶"<" À,=…!â v¾Œmí¹>ųìG%1 yk˜#­Ã6Ò´²Óžæ=„8Þ§oÊÉ ñ êyÑɇmhæï áPûøÆòf}`°ÙƒÇ+49Ò:l „ÖÚ¾«ɇ1Ò„›¤”GL"|Þe±i¶–µI†OSOˆáð´ïì¦ã°û‘#`)³œ¥uøøQÜÀ]Ë3d€!ì‰ð‰  Òò÷=`G†¯;Ò:|üðIv¼>ÐÛ„ÀX¶7I¯.a6bk“$ñîfÀð¶#­Ã¶>0•OQ‰€ m3—èÞ–›+‹OÄ V\Qì ˜äå:Ò:| °ne,"DeÝc¨^ćZyµh¶CF#<–³rbñYÚ>7ãN¾Cûmm3ÿq?¯ó' 7ÝTAžöYŠÏå4­ÃÇ¢h ó) `Hšì})÷=9„WYD=3éóóQæs“¹µ\Åb ¢,NŸ¥í• Ž´í$m ,¶Íú1¿Ð£„ä9ŽY,£x„ã¾1U 672“Ûè…Ȱœ ¥Ÿqч1°†ÈП©º€Áôçßxäø7—±ò5€ýÍÅL¢ˆ©' ½ÕbŽ´íÔ´`†ˆ®xÄ<ÏŒd9Qš8cx“7öŒ³0¼Ä4XÒÊ‘ÖáãÔ´¢@ŒÁCÀ¿¥+‰éfI›T/øÄ@³7õ€G@\«ÔsŽ˜ÃÇbi“tïäkCÌ2 '!9ª€®Å²dØ…Ýž³šƒhDD¼o)~Ð6¸—Ã Øø(O„O/`7š˜Ã^À¦r4'³’ÓèõÍb¿ÄQTP@¼WJ­èÚôr–Ö¡ò@ÈVÝÖ! §QÅ‘ìÃ{ô¢ñgþÍejJÓúS @SOiFøô5;h&Ky—±¶]–&j¸Äœq±÷¤7§+ÆZá,Si*Ù©ÌʪÔuòÀ¡»„¿^µ²í™*æHëÐN„d 0¶ƒ<š»*G¶ÕrB®lZB>SÏ1£ØÃ´”±#­ÃÇ… †C x¼Å“§éç#’n_²„ÜÅJ<à3TZòÉv ÷RÉÙ‘֡Ѥx‡ú™ãíd…Û¨îSjÕ‘¡@ÒŽÃsu7b†r¢¥g©v! ²v×'"ÞL$Ö‘Ö¡š¶¨F³œB|Bžã_³±4M(˜³äÍñ'æâs#±òÂ'²ød›ÞG›}m‡vÇ2Ĉ]Í" ž[m/™ ž]ä­fxCwЇˉ‰È“EDT!²r ˜‹q¤uØ:(Ž….œG59à1þ)/ýyÆöP ¹–%à$v7† ;´i¦Þ)q=;POŽ´[Ç KÜ.ƒoN €G×Ѐ!¶š7 jeø› @ìÈe4SÌQ€‰:˜£ù‰Ö⓱.YÄfƒ`r‡;ÚqÄÈj×äߨVFBVÞ>!DÄË##”ÓD Q°·@; !O—iÅ„âãaúì›:ÜéwG»Ž0¥ld¿¿DÈÈh¤f«`‰ Öp²/t”êˆíßļ œ|!£*= "YƒÍ’Öɇv¡Úòì÷—2ƒx_Ø®³1>?ÑC@Ä~LWëd%» D²TÒÄßl¢¸ÈؙӴ[=–°»¹„,ãeð ¸E¿!$Kw®d7ãÛŒ®õ5=¥** Ø,“OHdcNÓºãc8"–M:ÎjÔ=4K!wª—ŒŒÐW”Gˆ¿h{¨)ê!Oè0Uj'ÍS" 6'œ¦uG‡͈j€ýöÔÀË꣌ý®ÎÒ1b†† ¡>ºGµB®¾ÚC+GGezÙiZ‡­Ž b2_$IF¼Ÿ?«?Ga€c¹–`-ø3óññhäm²€¡–uŒ vzl7$üÍÈGZ‡ARµàsÑmÇA4ñSær£¹ˆ£øÝ @ ౜ˆˆ˜€;iÀÐ §¶ºöËÈo‡uÈÞÑq, ’fàÏ 4ºÛD˜oé[õlø@/fò%b.µAƒx3¶ÔYZ‡’ÅÿÇšïSM3/ð#ºQìÇQC@@H%†*Æñ"!ßæ«i¢Ìæ ©#­C;-*ÄéÌ„bibwë>iþ×þÖ_ù­ >Is Æ™½m‘Mq¯ð!³XIÝø•Ó´[†lÆl2| ×é*¾Á|}…É ×p—B"«X"ªØµØ"‰C©ãE²ˆ>|×>o´yZºP;Úwénòõ|}A•Bè$53UÃä ¡zYÉo5‘ç]¥!2ò…vP!”ÓþºW!áfc´²=ÈÚŒ˜ MTYaa±¾ËÝäñ©$`ÍœÝÍuúšY\ÆÝnBVë2ža8‡2‚*z³Œ<=Ù‰½{õ\U’›<î,­;¶ÂfBL#B| “„P…<}V+&ˆ˜?UµªÔ‰Zmäxí­GT—¦Å$vº@€ˆˆ‰M©q;bîØ*Y^K»•£ÏVFÈ—¯Ë´l’ÒÇ?oÝè+z\côš ùôY –¸ÅÇË3Ç6u¸8­C;£¥’įè$ÉàpƒÉØFTó¡Nã%"<º±ýø›Ét ÒáÏrD„TØG£´4ÒE:œ¸Y&ê¯$µçr­É¤ýdª‰ék~Ã02Ĭå9 YB²d Áþ9"|*ˆÊ¦˜;MëŽV„eYUQº(GëýVôµ ¨§Œ<¡ãô¡Â4–PüyÌêµ2\¯«ô“¼ý*jóûv—î«Iôº .£XV"ˆ˜¦ x‰™ÚE9!£]õ†Â‰RÏo•“'#£ýµH²îV‘¾›/¯q¤uG™­Ì·ˆ”çÆ–—ߨ5l&àbe…g ðÀpÆ2˜4>äbm˜ ÓÈiúsוú$¾žŠ²(Û:…¹ÄTPÅmk’^2Øíݸmgq>¹qÖÄZ¨h´­00Bhg§×´.Ý:ˆ6º„ÿUUB9õÔƒŠ[HŒÈþEK™ð°ºË2ÚM3% ¬­œ±©…M¼­o2Çø»³;£èǼÊÔ!àf éjXB|LªAd Žg?‘³ûT-}®/D»ñ¦3ñ3öÒ>Æ# C›g‰9›óI=ò|ÚÚ=t¸žÐZDž«jo×þVãVèz5µX웹üŠqBžºê~©•Ë{ˆhæU[Ë~ŒM)e8yàŽÍȃÛSYði½gëbo®÷uŠ*…Œê-•öÍŠ¼ž³ÚtŸ2mÚ:I’ç|¡ŒŒ²ú½’­¶:b.÷àŠ€GiÆÛóCF/ítØì`&rÄnJE’í* /ZÉp4=¦·>Å‘ã«ìHü†yÊØN‰­‡#í'«õ†%áIŒ3LZxX…b¾Gw<Ädæ¨õHf$¼DÒùˆ4%¼5iãI—ïÑæk¶ítn„Í%|;Ò:±÷©ÀPÅrÖòˆm?­>eÎ óx™R…¬ÁP7z³#;àµrk ™Pž¸i§s$`ð¸©*Îop¤uØ –“#@ta šË¨•ÁÇÐ8‘j„Ï+‡x$˜7mGO£VÚYcStì2º!b–r?¡~çÐ:dˆñèFO TZ[êQ$aŒe3 0›Å,°Ù_#©²Ý»Õ ÒFøvªB†ƒÍx2@Äý,RÁ‘Ö¡5èAXCCY¤4°ÿ&ê³N ¬¦~BÍá1Ÿ¥¶ô5\dcºÓx‚r¤uØ<0Œ˜˜&^³#CCDSÖ.nGÐL~2©&õXªøø„Ä¢f [ IDAT;R)ùzó´ÏnÖºÿƒ¼›BîÐô1»9šx€¼]ÀeÝ#¹XEPqL”jÚˆ…€¡†AÄv¬‡gG†ød0Ä›™¸ÐωÁÏ0WÎÒ:´OàyR`m¨¬;†Uµ|ªÊöˆåäˆéF“<^œƒ+K]¯Ñq4]‰È°ŠWœ¥uh š8ÉŽVò-¦ší̃Ï'FÔ0šqJ÷ÇBøx¬¢@½0x¶ú ZÜ$)Ñ´‚´»›I2^m³éð‰D_e*K€Ù\Æ%ºè˜^å©ÀÐD¥µ•]yñŒìcI·‘5šÏ蜺5SAµt#Ïõµ bÃÃÓZByT²;S1Ë&Œ·nþ“Zl#Ä­êf3h»iw}_/iI‹ŠÚˆ<‹4U×uª†i°žQ=» ¡³²üŠ}Ò§¬Ò(]¢G´:Ûšl„˜_*+„vѹÔD‡VXº€,ç˜@ße%¢žÿð×3ˆêKOª©C,c)kXH#B*ÉÒ4© ¨$dåÄYxv·+`3¸# 2a³ú "C?«ž×ÒääÃæ‘%Àp‘¢Ÿóy<깟gøª.7Õ$³Æ3]ü3@÷mdsÄ6ŸF²dhâÓæÎ¹×2Ž^€ÈáÛªáãâÛ%y'. /ùs|’|Þæá+Ÿâqîçrv¤‚˜,¬åÛ|Qk-åEÅ&²¸*1`o€¶ÀUã~bÑ2Í¥.ûbáŸ¼É g{2†1sû‡…:ùÀW¹ÚˆŒíî³HOp /C\Ê/L“±„˜g5<ÐgÕ†¨—“Ÿ`Uaðˆ¨¤Gp¬9–f–i9+Y‹éFozÐûÊÌõ=‚äoB26¼… ÅÈÚÉæ|Ñï¸<à÷ŒÔe ›ˆ VÚ–öTµí­;?ú“\B^*) laqàrÒf®æi¶Ô¢(f®¶·Í;KQ† m¸QÏÏT-OžÐvšªM•ÓDˆkä ùÚCk\å‚CëM–!¤ìö«!c‡xøÀÍ:šñœÅB‰˜,!!¡õø…‡ˆÈY›+ ¤š¯™KìÞØÜh76fçÅ,< bÕÎsh#VlŠ”¡’F»`cÛ%:ôUf²>ÆXzeÈs Ÿç:N·d4xx[©ëß³¯MA|iZg'Û¬åsÞ¶”Þ­Ž˜Ó´Ÿ`kRï½:]t#›¨æá³}š(“%v4·!Æ#O†¥*°Žµ4’'G Œ`°ù2çQ æCá[Å( ›‰Ècts2ó„b“Ž=hÃøÉŽ¾¨-•¿){DiNéÿؽägby©³¹¸©¿ÞëF6Я· Æ,ÅRÒ×ßü¯ÛÏ`¬[–ÐQ@3«1@w²6,à³jÒŠsÞãæ°Œ¬¢uhÆ#O}˜ÌWî1ñU"à9¾Lõt[¯ówÈdÖ0€ñmìåÕ)IkZh—L[[9tX@(I1vñ#¥¡ZT5™ô÷½”~~5D¦§9!P‘ä1Aês{ˆf*Ó›Â+#¥¬-ž+ÙË¿ùóU ‡¬gŸ4¡óf*ñì»X£z" '`XÇbÍä-^gKi¤Þ&²´Ï¥˜Î\1‡M|C†©ÌÕ€1WMÅ™lg’‰ 1k'Ô•¼Ê¼t‡¬H×ä<å€j²DÄTÐ…Œæ²Ĭd#¦Ïä/ÜÀIº„Ñ&Yuþ>ù |"²œÔæ«Û©H«2*xDøt%B¶'ÿÇ"eÊ¥RgÊ([üIi}ˆí‰•ý͸U7 ÖÚÛ À·ÒÂÃÃ#"O¾6xMÃü+³×u·¯U,ô-ͽäþ(£P ‹GdÇsxé;ÏZ‹»Ž&ÀЕ˜<¯0—bµnWº0ˆíÄ`úÒ~T’£+542؆ҟ…DxÌápvä%ðkîæd}‰LÄb"rŒeü•m”€ÎÒ–¨àÓDŸ°l¹ý8o ?]pË¥@‘¼QJc –85!>žíþZ´Ð­IŠ.Õ ”Šªc"Vj3˜É2³†CõÄ.»1˜ÑìÂNô1|{Ù}Šsj7'<[̘!&´¶®@Ýœ÷†=ÅÛÔp£InÛáÓõʪ‰Ð…!ŒeO>EF˜˜.VM{öSÆÖÔ@LjH€,F9 ,åw<Ä•ú\îË&Òu¬álz_×Ö V¦óXÙ–¶+Æ'$Ÿí´£AYÝ<²R@„dm(¾‰:­dëhd-y šºÒƒžô2]Ó¥.gíŸiå»76½ÄØ@ÑÀ<½ÌS¼Îòö½ÄÖj'7LÛ±·Žb_F˜„âk/M+Îw±7 Ôóª¦0…4’e+•µTªª®;bâéÄhz˜JšˆxOëØÏ˜ÔYÎ’§Y{t5UJ$^>'³‚;YAXÂ×xºð#¾g†êNn«Ý¹ZO§©„,Öµ·öÕ©ú›–ÎÙ6Í݋̈́똫Éúƒ¾¬c´««—zȳ 1=yò•U Ò^:K?Òýš­(Ýqjmkö¸,˵™t“ÎRŸ²Ö›žýyòí×¾}]5BWjŠÂ²­Ö¾^Œø@ÓÑê™~"ÔE¯êMõ”‘¯¯)Ù)k°ŸiÙ¤ÏjõÔîš¡òO”}☰/õy%-ðgëR ´3ÐMR¶ò_×€.n‘pž<Û‚×ÓÍÒ¶xO«j_Ò ºHû©¿*-QŠm‡½¿jì£É‚QúŒnÖÛ*m—¶¾mp©ú¦ÆØôhRz&ßÕhw}FÇi¼vÕedÊ:x÷ÒYú‡š[ÝY;9ãKt½ö±ÏŸü›U/¢×µ@ýe„.PPÖ~.`±† ¡^š¦¸EkºÈ8@¬Î~ʾ¯Ë• j¯èxU*+dÔMÿ§dæcóÖëšXüPº Å‘¥‰Të7Ò×£äG=iªÔTõòÕے㇊íÎx{gO•,^\¶û§Ã-¢²OÕÈ¿u£Î×Îê&#/¥ ©-òÕU=Õ[µê©žê¦ŠõÈ•®ÏéI5§v(.{¥Ï—½˜t‰Ù¿÷…ŒëP×vªT•ÎÔßÕ@È:–_1COh¢NÓPeíYòÔ]èm…i®@”V (mu¬´ññÊÑ7ioÛ<9úê$ýQ﨎˜åWì"„R}‹AL«jw³¤{Q-¯y\viœý_S¾ì×q½j­=¯Ö×”Oßcœ>C¡ãH›/·ÓTÖ2*»ÏÔâñ ‰²¹ço¶y‡2òT¡2Bݨ"ebE´¿Ä¤”RºÙŠC†–MzBWioõ¶ô̦2 Zƒµ¯NÑ—tµ&éQýS/ë-MÓ»ú^Ôݦ_ê¬íT.è¨F'ëQ§q5®g‚²E:ä KX”ªP©;u—NÑ(ÖNúƒÖRš!SºõèO:]½TeŸz˜&j٤ƲO/Kx‰Ò³}I›}ú2¥«ôªJ‹u3‡ Uj æ+Nß}ÌêìxÛ»v²ŠD‹[¬”11‹Õ×®×(y½€gõŠD3Ïj”=?YýDQ:c§ôŽÃŽ“ -›ÒÚ!>*{ÛÚÖ¸ÕYG¥á÷ ùÚWc…|í¬¹Úø4ÁÖÁs ‹·HˆXËÝ¡ 5JFFYùò•‘‘¯þ:X_Ñïô¬ÞÕªÚŸ‘âRÏl=ª¯ë U§Ê³FŸÓëʧ‹hƒ½U*5 Ä4}KƒSíZ¡ƒt­¦©ÀOU«:^ƒu©{~šË(XH öš¾¨!– £7T(’T~åD¯élÕ¤"'§aš¨wUº’«ú%yBžîQD`Ç„ä9ÆfgýEñzç¡Ä„ÚçÏèv¯i­†ëVEüGûZñÐU·©PfÜZ3й â .“ˆ€åW¼ ßé{ú‘~¥ûôš–ÎiL‰·øÛB+nˆdÉz^ßЯt“ª…ŽÒ8¡>ºKïh’¦h=9Ñ;Y…²ÞÖ3u«Î׫V=kyéÓúžÖ5”Ù€ Å,ò‹Uþü«jŸÑ•ž>ßPM´ö6Ø@U.Ð/4ÖªaO]4Aw¨±†KÔMÕºD#…öÒ³*Ø¿ojq—–ç×t¹ú yò4P¿S2 ®¼ržÅú¡¶K:£AúŽæ©°ÞµwY‰rº‚òé!Oר¥Y.nS…}ö×%šø™ú ¡Þú¹Ö ^Ò.òåËhÞцƥƒH«2¥$ë»#_õQ•2BÕ¥3ô½¬UµÅ‘oƒ_X@4s‚ŒÐÎê#_´»*´Ÿ~¨Z¡AzFq‹y)í®™|ž9ºEgk˜½ ½ju .×ýš«µé¥7Pl-On\¶â”obŽ®ÖÛ3¯éVÝåÓgmâQ}:}í*¨'•غ&¾lÐÏÛÎÙ•ºØæ¶Æ”ÆÖ·ûò¼ŽOªKµbBñæ ìû¼_û(#¬’­Ò…š¡BYïòr¾¶—/_µzI¥1÷1ß¶’é*Ïh¼Þ:ò¡î:]÷+`¡.UEªøOÓŠ B«‘£­Hùz¤—Ü×8-°µa™U ëʬo/¤£>ÆkDD=×jD:êÓh¸nÔÒ9Í˜Ž–®óÛÚQž2B×hu¶È‡•“'t€6*BY¤fÞÒYê–Š¤ºL‹TZkèSV’eý… U>P›½ïˆ ´ƒ¦*Nª–—h닪 ¡^:^×ë…­ !׫& 3힣=}gƒÅ¨mÂ`¡îÓEiéc”‘§ÑºXè9]®¾BèÕ•5ª(y²ñzv5.s:âkQØâ\‰PÇÔGÇjžuvžÕ‘ª²Ÿl{ýT˯(¿#æj°|¡=t“ŒrV@x©Uµåg Ü6]³ä•ébå´‹îP#1ÏêpU§1n:G器Ø7§—™„âñ_[©‘ѯµrtòÓ·ÔOžÐH-›´PÕQzë®ãE]¬ÞöûBÃõ[åÓÛ=ù¬7ØŸÕèÅ4Ʋy{Û®°Qo«fŠ—qc”œ­ßé`k%¶×©ºE³•oq_†xó‘½ îÒûa*ÕÕj¯¯hÅ„„Nùؽ–Ñ㨅›"æê.«]ÓUjW]¬µüŠˆÕÙ/¤;NY= ˜<Óô~Âô›ºƒ² ]À“š)!æëª±ÑÜžºPï©°ÁУ%„Fêê&_ûè8eåë@­Û„¦/lðÉ—_q¯fK,Ö—4°lgm7Ý©Í˵¼}? \šNqüœÕ¿K´§PF]ô/ƒUQꪭå%ýZÔÕFcŒªuŽ^-*ÅcžÆØkòM•nô ãH[²¨žnVË%Ú¨Fmà)]¦ívãp©ô®š620XOÊÏÒ×´³k€²ê©ãtGY¸©hÝãºscr¦‘÷u³ÎÖH»T&íöÒ·ôˆVŽ.ŽzCYUªÖº“j¶NUm¯¦Aõ°¤-©ÛÐÞ’õüUcmœ £ñzЖôEe–;@£JÕﵟ|eôýTô6Ô‹ÊÎnµÜ¬=¬¼BY ÐUZ¢ •æ))n¬ã¾óµ³¾¦—%εD¾QbéœÙš­YzI÷ëZ}^ûÙ8Aq{¤‹Ó=Z“~¶ò•¬™sì2AkÊvÖ:Œ´¥“1DçJéXõæ, ±tÎ-:ņÍÑ@­ïéq}¨‚ !•ö†ò6ï@4³rô»š® 4Ò.ªqÙœ«"Yã.•yVg_Ñõ:IÛ§¾»§^Ú__×Z6©8Ü2¹ÀϨ‹ÐöÚ^¾ÐÞú?+Núéi‹¢Ãñz·ñë:KUÊ)+4L¿Ô²I¥¹ …ï-þ©ªÒU:Nß’¯Œ|¦7–³íøÅéþ[DÀK:]56r›D'[M¶Ò1NŒ \­þé6Ëp½ ›ìJqžø“ªŸjT¥\ÙˆRÏÊà ºE«³-ãOå{s¿QVÈ×vzO­ÝílsÉqˆ¸ZÃu¿Šòãþ|œð“%ýM]«ã´ýè]´£NÑ/5E ¬˜ßЂ4#bžPWýCQ‹%1¿Þi/iªuLÓ}ºJ««½ƒꯣõK=aC-ëoS,ÐXyò5AµBt$è{j½s°©å:J÷­~¬avmVçë-EénÕú1 õ¦èý^ýtžŽµ?Þ[¯jÓ–?L½‚1_ßSû£¬Ðöú…êÚô êÓsñ’ÎP7eå ]¯™$_F;iéœ×ÔM9ëš%YF¨Rãt¹žRcºÝß\& cû>c²»rÝõœÔÂ#è@G,Ù}þކëWª³Ö6ÞÄe‹Ö ­åuýRÇi„2VCVi¨Ô%ºNOjšVŽ^G¾Ìµ )p‚Ž×ê¬lð)l±‡ÑÄÊÑSu‡®Ò!˜ngV¨BušnÒ´:µp—‚”Râ§BF{èXUÈÓpU)kãœíi VŽþ»öQ¥Vì«G¬cú¾ªÇµÎnÆ4¦—²øwõ,Ö~ªÒÚÇjÃ]ôž6µ7¥ì˯¸É:œFY¡œÎÕÛÏê? Z¢²®Ì|D4ó/]©±òt¶VL8ʆñþª€ãÒ¬ŒJÕh¸NÑOõ¼>Hש†®ÉùA]•ê¦ûTrd?z%hC[$¥EP—}¡pŽbo†ÑÃTl¤ÀcÃ,ÒÈÖ!-пy†é¼Ë;ãÄPA èÏP†Ò›^ô¡'ݨ ›™­ËØ›KjrÄøˆˆFò“òç¬f10‡iÌeëlS`¨¤ÃØ‹CÙ‹A&©ŠÓôê$wµ¼¢ž/èb&å¡4¿Õçh±&ÉkoèV]ªñd•§Iÿ¤‹ª4PC5R{h_“§¡:Açèd¦t¸ÑnÚ!è’.ƒu€.ÕŸõº] Ãõâ ¦ðˆ‰Y:ç\¡Z¨#Õ=ÍÕúԎĹòcª.²Á´Œ*u‘þ­’v½ÚjmOGéEÏŽÖ;ÓÍ,¶â yOƒtÇ&-mH=êh{N’<±!úæKˆç4F¾¯Oi¶Z£Ñƒ‚¥<ÊSOÀ|í&#£*Ý­0õ6 i<|‰^Ò£Z:§|9J·÷Kgá!ed„ºèqÅi6n†¼‚”²Ew)lá m,Ÿ`ýpT¼žÓQ ‘9š¢ëõe ]5@ÝíæÖH4Y¦,kÕ—I%¿QN´«NÕÿÓ=zÓzãñ 1ÚÈþ^ñ$‡Ü¥s4FF•:HGª—22¡*´ PÛœ°·õU ±ßVê(=®æ²ç XÃOìgEýõcÍQܱ,Fæé:O§ê<]­)›Ü9Z:ç.}ZUö¡Z«wl.lÌÎH©|¨MŽÙÜ'X?ePe»yb¢ î• ä O×uúQ­nV9õÃf¤ßøƒ½!ûhªÂV¦ÍwªþRͬ˜ðž^Ð]ºAßÒÿêt©ý5Nc4BÛkˆi k˜FjŒÆëX¯ïêF=®6ìÝVZ£ÿRPW›ÛC#ÕWè+RYœµtᢲƒ–tŽÒ@Î[ú¦†X’ OéÏjLíc\¸»ÛÀ§ßÚý¢õôÖßÄ(Š˜¡_i?{ƒ'·rW«§['5"f‰Žµío]ºâJÒrEÊ·êì-ÖöÕ®PCjA?ÐÞv—ëB5·pã£2[ú,Ÿ·±†ÑZ6)NÏlüßAÚh½]ý䣿i`uv霴@ó4G³5W ´Hj]zjÛç*åËþö_i@§hÇQ•ÒS6²±±¬®ò䛈˜ -F™¬‹ÔKÈSNhwݬERY–@K‰2]çÈ(cÉ´³~¤wR÷/Nݲxƒ™ä±åWܧÿÑð´ð&£îªÖQº[ 4¯—ø-Þ×Á2ê"d´‹žW1G6_fQ›Û™~ЮÝhãÇ«jO±ëâáZ9ºAÖËü‹ÒØÁ‡ÚM¨‹ÐZÛbñ¿ÆÒUgù^~yZd¼‰´ò¸Ý;WÅ܉›µ ùò…jõ =­/êýMs¬Å R1QØèk¯áUýL¨‹¯¬²ÚK×k±”zC{!Öp“F¥)çFýt†þ ·ìêQ^Ù¥‰Ÿu¼¥¿êBQ¥2ip¯›ëóºKk[Xó"u ˆ¹:Âf žú£¢n¤·fó!ѱßUV Ót‰e“η Ncõ†Ê½òÔŨìüý%MXºIQúóͽv§iªn´^_¶^ô£Ë®ÛW©—u„‰˜¦‡yƒh&ÜÊ)&&àú«Ù‘ÃÙ›·õùlKß:iPÔÌ\ÍáY^á-êð1„ô`ÎãÓÇôz,ÚäüÂÐFN|Äûº‰»Y`ad Ììʆ0| MÔ³œ¹¼Ílf²ÙݤiFO2œÇgÙÙÄxÈÙ¶ñõÕ=š¨b¾®à!²@Ž‹¸Š!¶XÜ'" (൪>6¤‰ t/Ýù!盦I_=çv"ÄÜÂA&O…}ÂØwQ~6bÖf/¼Àv<ÎSÞê#+—;W'p{'mp™µÊ™hùX"vRl\[±ÊPE3•–ÎOëVÞàC†²CèG_º“cb ˜Ç|æ±ÄN])cGp2ãLW{[{X©E7‚¤G@œ† ÞÖÍÜË2°´Å~UI•½ôi¶ý]|ÛqP@5Ûs<;ó*ݹrLít‘ç}MfÇpº #ûD¬¹â;o¶-˜ÄÁ|ClÈ̓²&!C˜§ïr g›·ôM¦£ù5GšÒ­R|ÞòžàI›«õ-2ÄùüÆT¤ç¥ÃB^uîGטÅ- ÎÛ+ ÙSj™?[°É˜ÒYꯌ*¬z¬(ËýOþí­}õ%MÖŠ ÁÛ+áŸmÃƈ€wõ³£¼Hœ!Á$ ÕSFU¡ót·–M ¹O?Öx͘¥ïk!O5zÒ–¨iöë:®µåéI-Áš®– î­ ó5¥yb7Ú ]O{è ›ÛP°Ï—…ÂJî¯xÜQ½¡–›ÿ%ò ¼`©ayC¢u¢Q«š­}´<Ë:v•·g‹ɦ°\3y“,¤ŽU@•ô`Cˆ™®$3Ë[t¶Qñ†ÍŸ ¶VqéLZËÕó’žàY>d©m|§«±í3ˆ¡ìÆ!ìGã·ªß2”¼À »vdùÿí[ˆUUÆkïs›qÎÄHÞJ¥1oi£,B¢”2† ³¨ÀР¢ÂÞ„0+1"A(A_*+Œ@¥ K+ŠDGœ&3Óf¬œÇqÎmŸ½ÿ=ìµ/GEç¼4㸾órÎY°f¾½Îý/ß÷,›U«|È7œãqÖ©1úÌÛ#k8JP5ò‹iRÕ©½¸ $•Ö³—)îc=w)‹’VŠ—ü½øa`‘Còi]=áAàeˆ¸Eÿä+ ¸U¯@#Bn¢%#µ“àgJ*ªgAhpf©Í÷äN§ÒNZ¶¬¥9­˜4‘ÿÝxU‰ ÅÃ`Ïê¡Ó~NIÇ8Áiz)â¡H‘¥™ÎM4r³ÊTìÿ9Ͼ …Š˜Ì;üË{t"5lgaè©xJ6ð)}þâsx‚e4){ˆÂ›.-²•mäq€žb5M±ª–¯Ì(XzÿÁ. ì——i%‰CŠ|Âå…j‘‹ÃU\믨ÿ¢ÀgéÞÚ3³ŸüeÿvË“²E²ah¡d®¬•E19%¯‰¦è—]r¿$c}Æ“d¹l“öŠùØ‹+¢Âyþ”-Ò,õáÊSåý0±wDÖHKØÔíèôV­9³øm¹! )‡¥Úâ¡Ç}]<ÎS¾@êãâ¶ûY²A6Ê4AñŒ•:A,©“'±ä9ñ(ÅêQÂ96éöxt¶Ø’&Y*ïÊv9*}ÉEÝ…Wb®ößd§¬‘ezž×o-/O˯zPÜá{™-I™ «d¯tµW,uÊfY #r™"‡$Wu¦Ýøˆ]•¸T84È+ò«¸ÃüÀß ’A1‰ë°é£sx¬å Äì9jµt·ïhüˆ?è ³¾¥h= hã¦gÙIDATŒãzjEž^º9ÃE< …G™ ±‚%*žûVVЩƒ£,s˜G#ȧƒös:ô_°˜Ï:¨DÕt†´#žž•×ÍËÅî_Ér¹f¦RƒK/9Nr”Vú(c3—¹EEÒžÄ.Ic÷õìäg-œ Ü0 .HxŒc"ó ÷¨1šè¿Ë[|Ø”Qº×+Â!E‰i²žÙ*ÞÿgH; ÏÒË¡D’<+d.BIirô“¡@–:–²’yª€^üd¿ŠeOË/¤…6ò$MQÒê¹¾­H–ù,âA¦ªTìAr±)b‡lb?ƒ±LÄVpI0›Y© ÊÔ\¢ÕÒö ­Viæ$6 ›ÉL!‹ÅÜÁŒÙi5µ8 MM"±~ŸþÿH'G8Éqº8K?„4iêi`"Ó¹›YŒW© µòDØ'[ MÏ«{7~Ítà`ãX”iàN–ò(Uô°xU–‰ iG|pÔ›ô÷É üž’u¸”øœÇ”K*ÌÅÕÈçÁ Ï]+¶^ÂØb/Ý¡H0æ‘ú]IýùÈÈÄüµ‹¤ÂÔ_Žn9È!:è&G-)&3—{™¥R±ÆoÐ71í¨¢¬ò9ìÙ ?Éë $)3ØÆ­*Pþö]{ܘKŽ_L–XAÄŸ‚HÆèìU™ðLNê,¶„9iW{dDqj‹2™Üþº6‘Ju¿+†´£ž6$l:d7ŸÑF泊%jtíÕvÔÀÑÆJ6ñ 5¿¨\S+CZƒ+"(HGn<Ž6fC+CZƒ!„þUÊw½qØÙ:Ž—†´C¼¸E­éÁ{‡DE'«!­ÁÌ5¸¸$Qa›6TŸ 5¤5øßB„²6¿‹K¯!­Áˆ#,:ó*º[À&Hù›˜ÖÀ`˜a™?!­!­!­!­!­!­!­!­A5øavÿJ¯­¶bIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/default_cursor.png000066400000000000000000000023441511343406000256060ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±ÁIDATX…í–MHleÇãÕqÒÔãÇuC/w5ó–HÌF)h«mZ¨\*E®TJ7 éê®4R[J$ˆ„¢¡ÈPùhŽ‚(i äLjÂWf’=ç<-fôZ׺sT¬Exx7/¼?ž¯ÿ ÿë‘WÿÍ÷£u]÷777¿Äw +"üÅÅÅà廆ˆ—ü~¿¯  àmî8ñ""íííâ÷ûÅçóåææ¾‚0Ý@yy¹I ŸÏwh·Û1·V*u]g~~§Ó‰ÅbI\ZZúÞf³=^º)DXš¦¡ª*“““TUUk]]]ui€å&†TUebb‚ºº:EÉðz½ß6 úºaˆÈ€ªª¸\.HNN~¸¿¿ÿ-ðÊu!§˪ª2>>Nkk+V«5wooo°f£×PU•ááaÚÚÚHKKËßÙÙùH5 ah¡\100@gg'éé鎯€ûF \nÈóèï璘¯»ÝþÞÚÚÚ—@ „!€¿6ãåèééapp¬¬¬÷WVV¾ÂðN¿êñó¬tww3<077'º®Ëììì ð1PpttäÙÚÚEQ$55UZZZDUU©¬¬¬ 8~·òm‹?ïæ©©©%àCà<::úXÓ4©¨¨¤¤$ÉÌÌ”ããcY^^ž^#¸„n`~~þG  ÈâNâ÷û÷666$11Q²³³åððPÖ××AÞJbwww¿Þ²yö-7Q.—ëñÙÙ™looK ““½´´´%t×°5_¥( ‘ ÃÅð纚€ø‘‘‘O<Ï/n·Ûíp8>Þ%èaõÀ‹MGI=t^Ö=‚%¹OðƒzüøõŠû†ÂQÏf^ Åùâúïëš`Gþ™´IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/demo-3.18.ui000066400000000000000000000322711511343406000237330ustar00rootroot00000000000000 John Doe 25 This is the John Doe row Mary Unknown 50 This is the Mary Unknown row Builder demo gtk3-demo 250 440 Builder 1 vertical 1 The menubar 1 _File 1 1 _New 1 1 _Open 1 1 _Save 1 1 Save _As 1 1 1 _Quit 1 win.quit 1 _Edit 1 1 _Copy 1 1 _Cut 1 1 _Paste 1 1 _Help 1 1 _Help 1 win.help 1 _About 1 win.about 0 1 The toolbar 1 New Create a new file document-new 1 Open Open a file document-open 1 Save Save a file document-save 1 1 1 Copy Copy selected object into the clipboard edit-copy 1 Cut Cut selected object into the clipboard edit-cut 1 Paste Paste object from the clipboard edit-paste 0 1 in 1 1 liststore1 3 Name list A list of person with name, surname and age columns Name 0 Surname 1 Age 2 2 1 1 3 0 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/demo.gresource.xml000066400000000000000000000164271511343406000255310ustar00rootroot00000000000000 main.ui appmenu.ui demo.ui demo-3.18.ui css_accordion.css reset.css css_basics.css reset.css css_blendmodes.css blendmodes.ui blends.png ducky.png cmy.jpg css_multiplebgs.css brick.png brick2.png cssview.css reset.css theming.ui css_pixbufs.css cssview.css reset.css background.jpg apple-red.png gnome-applets.png gnome-calendar.png gnome-foot.png gnome-gmush.png gnome-gimp.png gnome-gsame.png gnu-keys.png css_shadows.css cssview.css reset.css alias_cursor.png all_scroll_cursor.png cell_cursor.png col_resize_cursor.png context_menu_cursor.png copy_cursor.png crosshair_cursor.png default_cursor.png e_resize_cursor.png ew_resize_cursor.png grabbing_cursor.png grab_cursor.png hand_cursor.png help_cursor.png move_cursor.png ne_resize_cursor.png nesw_resize_cursor.png no_drop_cursor.png none_cursor.png not_allowed_cursor.png n_resize_cursor.png ns_resize_cursor.png nw_resize_cursor.png nwse_resize_cursor.png pointer_cursor.png progress_cursor.png row_resize_cursor.png se_resize_cursor.png s_resize_cursor.png sw_resize_cursor.png text_cursor.png vertical_text_cursor.png wait_cursor.png w_resize_cursor.png zoom_in_cursor.png zoom_out_cursor.png fishbowl.ui gnome-fs-directory.png gnome-fs-regular.png stack.ui shortcuts.ui shortcuts-builder.ui shortcuts-gedit.ui shortcuts-clocks.ui shortcuts-boxes.ui revealer.ui alphatest.png floppybuddy.gif apple-red.png background.jpg gnome-applets.png gnome-calendar.png gnome-foot.png gnome-gmush.png gnome-gimp.png gnome-gsame.png gnu-keys.png floppybuddy.gif listbox.ui messages.txt apple-red.png popover.ui popover-3.18.ui glarea-gl.fs.glsl glarea-gl.vs.glsl glarea-gles.fs.glsl glarea-gles.vs.glsl font-features.ui spinbutton.ui filtermodel.ui decor1.png decor2.png markup.txt scale.ui modelbutton.ui ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/demo.ui000066400000000000000000000323031511343406000233400ustar00rootroot00000000000000 John Doe 25 This is the John Doe row Mary Unknown 50 This is the Mary Unknown row Builder demo gtk3-demo 250 440 Builder 1 vertical 1 The menubar 1 _File 1 1 _New 1 1 _Open 1 1 _Save 1 1 Save _As 1 1 1 _Quit 1 win.quit 1 _Edit 1 1 _Copy 1 1 _Cut 1 1 _Paste 1 1 _Help 1 1 _Help 1 win.help 1 _About 1 win.about 0 1 The toolbar 1 New Create a new file document-new 1 Open Open a file document-open 1 Save Save a file document-save 1 1 1 Copy Copy selected object into the clipboard edit-copy 1 Cut Cut selected object into the clipboard edit-cut 1 Paste Paste object from the clipboard edit-paste 0 1 in 1 1 liststore1 3 Name list A list of person with name, surname and age columns Name 0 Surname 1 Age 2 2 1 1 3 0 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/dialog.rb000066400000000000000000000102631511343406000236420ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Dialogs and Message Boxes Dialog widgets are used to pop up a transient window for user feedback. =end class DialogDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Dialogs and Message Boxes" frame = Gtk::Frame.new("Dialogs") frame.margin = 8 @window.add(frame) vbox = Gtk::Box.new(:vertical, 8) vbox.margin = 8 frame.add(vbox) # Standard message dialog hbox = Gtk::Box.new(:horizontal, 8) vbox.pack_start(hbox, :expand => false, :fill => false, :padding => 0) button = initialize_standard_message_button hbox.pack_start(button, :expand => false, :fill => false, :padding => 0) vbox.pack_start(Gtk::Separator.new(:horizontal), :expand => false, :fill => false, :padding => 0) # Interactive dialog hbox = Gtk::Box.new(:horizontal, 8) vbox.pack_start(hbox, :expand => false, :fill => false, :padding => 0) vbox2 = Gtk::Box.new(:vertical, 0) hbox.pack_start(vbox2, :expand => false, :fill => false, :padding => 0) button = initialize_interactive_message_button vbox2.pack_start(button, :expand => false, :fill => false, :padding => 0) table, @entry1, @entry2 = initialize_grid_with_entries hbox.pack_start(table, :expand => false, :fill => false, :padding => 0) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_standard_message_button button = Gtk::Button.new(:label => "_Message Dialog", :use_underline => true) @counter = 0 button.signal_connect "clicked" do show_standard_message_dialog end button end def initialize_interactive_message_button button = Gtk::Button.new(:label => "_Interactive Dialog", :use_underline => true) button.signal_connect "clicked" do show_interactive_message_dialog end button end def show_standard_message_dialog dialog = Gtk::MessageDialog.new(:parent => @window, :flags => [:modal, :destroy_with_parent], :type => :info, :buttons => :ok_cancel, :message => <<-MESSAGE) This message has been popped up the following number of times: MESSAGE dialog.secondary_text = @counter.to_s dialog.run dialog.destroy @counter += 1 end def show_interactive_message_dialog dialog = Gtk::Dialog.new(:parent => @window, :title => "Interactive Dialog", :flags => [:modal, :destroy_with_parent], :buttons => [["_OK", :ok], ["_Cancel", :cancel]]) content_area = dialog.content_area hbox = initialize_interactive_dialog_interface content_area.pack_start(hbox) response = dialog.run if response == :ok @entry1.text = @dialog_entry1.text @entry2.text = @dialog_entry2.text end dialog.destroy end def initialize_interactive_dialog_interface hbox = Gtk::Box.new(:horizontal, 8) image = Gtk::Image.new(:icon_name => "dialog-question", :size => :dialog) hbox.pack_start(image) table, @dialog_entry1, @dialog_entry2 = initialize_grid_with_entries hbox.pack_start(table, :expand => false, :fill => false, :padding => 0) hbox.show_all hbox end def initialize_grid_with_entries table = Gtk::Grid.new table.row_spacing = 4 table.column_spacing = 4 label = Gtk::Label.new("_Entry 1", :use_underline => true) table.attach(label, 0, 0, 1, 1) entry1 = Gtk::Entry.new table.attach(entry1, 1, 0, 1, 1) label.set_mnemonic_widget(entry1) label = Gtk::Label.new("E_ntry 2", :use_underline => true) table.attach(label, 0, 1, 1, 1) entry2 = Gtk::Entry.new table.attach(entry2, 1, 1, 1, 1) label.set_mnemonic_widget(entry2) [table, entry1, entry2] end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/drawingarea.rb000066400000000000000000000112511511343406000246650ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Drawing Area GtkDrawingArea is a blank area where you can draw custom displays of various kinds. This demo has two drawing areas. The checkerboard area shows how you can just draw something; all you have to do is write a signal handler for "draw", as shown here. The "scribble" area is a bit more advanced, and shows how to handle events such as button presses and mouse motion. Click the mouse and drag in the scribble area to draw squiggles. Resize the window to clear the area. =end class DrawingareaDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Drawing Area" initialize_vbox create_the_checkerboard_area create_the_scribble_area end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_vbox @vbox = Gtk::Box.new(:vertical, 8) @vbox.margin = 16 @window.add(@vbox) end def create_da_in_frame(text) label = Gtk::Label.new label.set_markup(text, :use_underline => true) @vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) frame = Gtk::Frame.new frame.shadow_type = :in @vbox.pack_start(frame, :expand => true, :fill => true, :padding => 0) da = Gtk::DrawingArea.new da.set_size_request(100, 100) frame.add(da) da end def checkerboard_draw(da, cr) check_size = 10 spacing = 2 # At the start of a draw handler, a clip region has been set on # the Cairo context, and the contents have been cleared to the # widget's background color. The docs for # gdk_window_begin_paint_region() give more details on how this # works. ycount = 0 xcount = 0 i = spacing while i < da.allocated_width j = spacing ycount = xcount % 2 # start with even/odd depending on row while j < da.allocated_height if ycount % 2 == 0 cr.set_source_rgb(0.45777, 0, 0.45777) else cr.set_source_rgb(1, 1, 1) end # if we are outside the clip, this will do nothing cr.rectangle(i, j, check_size, check_size) cr.fill j += check_size + spacing ycount += 1 end i += check_size + spacing xcount += 1 end end def create_the_checkerboard_area da = create_da_in_frame("Checkerboard pattern") da.signal_connect "draw" do |widget, cr| checkerboard_draw(widget, cr) end end def scribble_configure_event(da) @surface.destroy if @surface @surface = da.window.create_similar_surface(Cairo::CONTENT_COLOR, da.allocated_width, da.allocated_height) # initialize the surface to white cr = Cairo::Context.new(@surface) cr.set_source_rgb(1, 1, 1) cr.paint cr.destroy # we have handled the configure event, no need to further processing true end def scribble_draw(cr) # Redraw the screen from the surface cr.set_source(@surface, 0, 0) cr.paint false end def draw_brush(widget, x, y) cr = Cairo::Context.new(@surface) cr.rectangle(x - 3, y - 3, 6, 6) cr.fill cr.destroy widget.queue_draw_area(x - 3, y - 3, 6, 6) end def scribble_button_press_event(da, event) return false unless @surface draw_brush(da, event.x, event.y) if event.button == Gdk::BUTTON_PRIMARY true end def scribble_motion_notify_event(da, event) return false unless @surface _window, x, y, state = event.window.get_device_position(event.device) if (state & Gdk::EventMask::BUTTON_PRESS_MASK.to_i).nonzero? draw_brush(da, x, y) end true end def create_the_scribble_area da = create_da_in_frame("Scribble area") da.signal_connect "draw" do |_widget, cr| scribble_draw(cr) end da.signal_connect "configure-event" do |widget| scribble_configure_event(widget) end da.signal_connect "motion-notify-event" do |widget, event| scribble_motion_notify_event(widget, event) end da.signal_connect "button-press-event" do |widget, event| scribble_button_press_event(widget, event) end # da.events |= (Gdk::EventMask::LEAVE_NOTIFY_MASK | # Gdk::EventMask::BUTTON_PRESS_MASK | # Gdk::EventMask::POINTER_MOTION_MASK | # Gdk::EventMask::POINTER_MOTION_HINT_MASK) da.add_events([:leave_notify_mask, :button_press_mask, :pointer_motion_mask, :pointer_motion_hint_mask]) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/ducky.png000066400000000000000000007453421511343406000237200ustar00rootroot00000000000000‰PNG  IHDRé‚´Ç pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÀ IDATxÚìýy¸m[Z†¿ãc̹ÖÚ{Ÿsn[·.·Ê} R^K,A±D‚…PF#»¤5QQ£¢?›$装Gý™ÄŸ $Ø‚J«€E[ EµTQU÷VwOݾ=ÝÞ{­5çÍïïýÖ˜·$D#`5s<Ϲçܽ×^k®9×žßøÞïm\­ËZÖÇê*ØÞxuxþö´}òž}ºv{'!awëRÊÛ ¤HIUªøâ•còñ¶kÝñÉy‘ãóÕú%×âñˉ\Ö²–õQ¹Âr –õѼr¶Ï¼éžáù·½r¼þŽÏ/}ÉÅG^š®¿ïåâ§.€:µµà4GÀ€w<àV€Ï@€”¸0ÀPqÕ;ÀE V`} Ä+«ý˜xÐ…_öÈ]ÿɯxW8zùûú+§WWwüêGº~³\e-kY¿¤Ë-ô²>zÚbàìê¿ú´óg~ø7íÿW_rö̃”˜F _ãt<úK€÷€ T`Ê@\«# íç€ @¾Ðÿ_]|”PЭµð×=€ Ø_è×¼×b}q({ »ì ®Â"@åÊÕ_øoV/ú‚מ¼ô èÒ½/+Ë…[Ö²–µée}üÕäa[|ççnŸøæ×ÜúðO|^>Ka2á4x`µ\LX_ò”-°ê @ °@»éqÒ¿Ý^‹n8²$ì®# “BåµÊä@¤èz L@0F N’>®NÀ~ìàæˆ«WN€õ•»ž»íßýoû”¯ü¶Ë÷ýÚ§–+»¬e-k)ÒËú˜\OþÔ=·ÞÿO×ùcÿð5ûgÏSâ„SD-¼]§“x>jq• 2 ˆ¢³Ë€ý™ê€2Ù%¥njФêã'Ó ¯—²¾Vñ@ÍÚyç ô@U‹¸ïµXƒvïûLÀþi`\y‡«ñ8zñ§|àŽOûCï¶—ÿ¡ïXo./}YËZÖR¤—õÑ»Î>ü=¯xê_ÿçöO½þUØ9á´»ˆÓ‚º>RØZ²Î“è×ó ±‚Ó™øœ¡Jѯ¹¨Pt) w£ãèN€Â.X"& ý»B»oàŠnPõOr:çö5P.€êõX;réÑã£úTì´ÛßU\Ý Àå{î¸vÇ+ÿä7]yà«ÿÑÑÉR°—µ¬e-EzYÿ±W¶W¿ýsž|÷ßþê³Ç^ÿªšPqº^i‘`¥ÅÓ¯é€t ¯Å¯Ž<“vÍ@·R²W Àõç¢ÅiÇ,N¦Œ@è´ûÐ9í¬“|Æ‘³é ” gñõ„Ï‹ÂÞÉÝ1w:ÿ®^;jétv³þ<Òw)@ ·cÆ=0ŒÀ”pµX¿ôS>pׯúë_s×§ù;üò)YÖ²–µéeýR®[ÿà7ú¿îìÃ?ýkÊ à4ka^y/» d( Û‰6 à€+í¤#ô1-Ò(€K춃ßBêVìµ J¯u-ÀXØ…"PtÏnšÏ=%´±*lž¢~/:픃hÇ﫾fÍ@‰ºi@ÐGPÏõ¹s֟˺çÀî8ßâªl€Ë¯øÃ÷ôsÿ—¿¶9ºkùà,kYËZŠô²~qÖþù‡V7Þý?~ݵ‡¾ã+Æçßãtu‰2 [!pڵʄ y-¸]eñ”}íŸXªŽ^‹x.@,Jö*ˆ˜v@ØhçƒÇt„c}þ’t E=³ã átÈ@-¨ÝJŸwI:‹®EŸ:À}_™ïAªBãƒI¿Àù6ÈYÁE`òÀîy`¸ÀÕä£OýüûäßøÍ¯9¹ýtù0-kYËZŠô²~aÖó?ûw¾ôúûþü_Ý?~vqËZÖ²–"½¬ÿÇuñôU<÷–/ÿî‹ÇÞùŠP×ã4¬µøºªÅªó@,ÈÒt—ý^;[µƒMÐÓ ,'ëÂk§ì Eµé cW9íœ+´-{-KP9Tð€ëõá5ëϧ¢_/Y‹ö´×Ç„žW½H/úüû j­E&8툧¤.ðqlxÜd‰WQfw×Ah¶²×çr+…ˇЉnVÄéϤªñN;ìó=°»†«ñ%§W_ñ»^ûëK‹Yʲ–µée-ëçXãùÓxâ'~Û?Þ¾÷ ¯Š+ ;Æi쵘HÖ˜£vÏ 5g‘¶›nCç®^ Ye1FÕ"æ¡…Q¿–v:ƒ®«&Ïš.´Ó=hœÎ‰ÑkXð ´;uv±.ã€[œA»A‰^™Å[‚`VþÝD%˜9j¥‘hAÊãOU!}W´ˆ;è¦Áñß6‡¯9iµÝI;õ:ê÷SÖ A)À´UÿÖu@nÇÕõÿÙ}Úþë?ºåó¸¬e-EzYË‚ŽGä‹þÞ÷üðoò¸íœvÌ`·ì‹^ ÛhQ”NݽÒ9ÐãN5ξÓB¹ö O£c'Úa–Ôº|IeqÏÚu ÖN€tCÉea¥Å:Wí\Ýš²'ʨJÑâ]²vïBÒXIÚ ç¤d¶B"YˆÀT„^YÀKÖÇW§ßÈ{ZŠB;ðÂb]©¯hq§ÇYƒvþ¸eO¬h²>§Ë$¤ñ…‡¬¨ƒû”gŸÆÕ쀗}á_ù‹÷Þ_ø'˧sYËZŠô²>×Óoý3ìÉ×ý?2péœv+e7§ª³œó²ó,[À¯•¹œ²Î\KÅaŽì ]/»Å=°?6·ÑŠ“…_ töªN‹­ÉV^;jœ…ÈF;ß¼Õè¿CÏcÈ,ØHA!lgqÕ?…Eüÿœ¿Q‚Z/PQ¯á¼½VÝ äIŸs¿Õ¢í;‹°ø(€s:¦U}>ñÀD"[ù=ѹywIçë5+Ô>Ày¦gqµ»·?ý÷¾çÓ.rZ>©ËZÖR¤—õ ´ÎŸ}ëþÀg½¹^ÖÇ8••v˜â G’«’úa—,íI·J§¡¯ZdØåf¨~xL+ g§ha,dfKQ8\¼2¦ÅÓEŒè¡Lü;Ï:SvÒ‘] %ýy 4;Éüvîf|Ï.<u§ÇP¡…k! ðIMJŒñ\é½í-£Ùi± I‰a¡h±q¢Å9G툽ÓVT&;|€…?P_ì+ ¿ÓM€Í‡MªåWªÍvuưŽ$Ÿ‘ÐùøLSϹ´ç¦"ÐÐ$—ÆÚö'”M±{öQ våLº4l2×혪Óã¨N7;’µ£¶z屿BwµÀ £o¸Ósž7©á‹_‘¾â¦¤Ž.ã´÷8}÷ßÿ/ÿÙCÿü¿þºå½¬e-ô²>NÖ‡¾÷W×þêÛ^y|Nƒh1ê;-<™…Ñ3 *¬Zq«œ!GGæuü%#»Ú¬Ýi…ú^àßÔÌ>¬mJ°Ìþ³tÍRSÌΓÉSˆ8X€U4m¶~‚õ/ Ø€Ó7m M=r`ÂUõXÒÀÙoVG0ƒ—+È:ô\H§Œõ´U;ÒZµ›î:}Þi¢ÞzàËq<0e ”=ßÓy¶¹—I¯Ç<1¬ÃÛ&'*¢°ßjŽvÔÜ%2V3±È§A_󱫸ú¢Oû´÷¼ò¼û·,Ÿîe-k)ÒËú]éâ&ÞÿÏ®<ìGàè N‹¤'ÜksßÊŽµî”ÄV,Äd'{K—ò:êu®AÇ®(|½Â»B÷-8Î~…nb^‰hsèR´+. ³è(½2ÛM$FAÄÒ ‹4j›i§tì\‘µÈBPíq„Ò½0 ƒ›0᪞i|(üNÃ;|`Ú»÷œÉ ß)‹k-ú©0Çš ]‡4»í‘–¥•iŒññ‚×ð:&…ŒäeŸ§‘_ëõØ÷ãêúàÿÝÅý¾ß,öe-k)ÒËúXZ7?ôÓw?ùC¿öM]ô§~EëËÒÌ7$rg†ìòbÏ—Ñ’«R¦„ª×ùõ¡«ŽÚ9"°ðvüYûÚNÙÙÑ+¼-_‡O©ì8ƒõº'ÑÊÓÖÓñxÙÅJß2£-kºà:Ýh€þ0(\íY°+‹máØA7®*Ü>MD’>_¥»N$¯ K,ÞãŽoØ ¸¹},Hƒ´îÝ,I½gpˆo²­DB›Ëº°÷V(#póY\~õäþÍ/Y>ôËZÖÇÁZfÒŸëÆÃßüê«ÿü×¾iÓãtu§>j!ë£vaµ0èbdá$ ¹²€êšÝ$‹£Ð˜œ§:§ÚwZd 8VZx£¦I‹pbÀF×kçh4è&„¦Ml=îµ —ªsrTêuðÌdh‡«ú=ñúúÂÙs%BÀÚ­³ì»`P/ ~sb~5мÿߘؔ]e²ÊÝŠ1º–ì°Q¨Zb{!á<:±Øz§û‡uóÖ,øD'œÓ.ßotƒ"nJÀâï+°¹„Óè7ÿ—>|öá·Ý¾|ò—µ¬¥H/ë£|]{è¯}å#ßûûÿÁm·á4ž¨dH8ëM[²¶«äèµØ oŸŒÒrĈG±¬ÛN^ ŸwZ˜aæ$•šáҘ᎒*LúúE';C9{…ËëŽE‘qS>4Ƹ£vásÁØÛYŸ³ºYñN$d•Ö! ¯Ô–°%^gíÞ1ýjϪí {gz“Óý¬z ;RRY úwÚê±û•þuØ– 0œñX#k?=Ç 7:yÐY÷˜ô:nŒ*ô\“evÔ;3¸AµÜ'GÀ¥ÛqÚõ8}Ã×ÿê·ž?ü£/[~–µ¬¥H/ë£t=ó¦¿ôUOÿðŸÿ«—;œö—¶îVz³÷,g›AwúõÐÓÿš\Šv‘~Ò¿ÚÑ]Vù’}]hÏY­ îfóՙĨÒb³°#g³Þì7YÙÕ®c.„Ô#‹”ý™ôõ*´à—ýì$vè`A·îÕd[N «;â A}ÁaèkVÂú™Mm³éÙ¬9˜Ï75â.(´Ó9°=S(»M¨Ü@ä‰Ò3GbXdtgÑB=•Æ÷‘†,¼Žžìr“ÇÅ#àè.œþôÿ÷Õ¯}þýK¡^Ö²–"½¬ºõÔ[ÿìyæGÿÊ_Üátu…©Lk;°:~ÝÙŒ•3YâÕ¬8¯¹Z÷I'²Lx8Zü&¯Å'8íP‹™‹ìÙeJ›W[×]v³t+„yS¯xZ®øXûY“ŒÑG»ÐòÓŠ3À 8£æ§]X@Ël®.•ÔÔqw„§‹=¾k& ‰‚¬’ܬT…çKjçªÀɽÜTõøö4‰F`s ‹ÇȬk¾¶÷z¼Y›²¸gºŸå¬ã!`½.ŸÝ Nßú÷^ýÚ‹G_wßò±¬e-EzY-ú ö<óãßð5'·átu‰E„7xa÷Z÷ÚÕ N¨f4¤ƒB¨˜´XZAFd]Lê…]\sá‚§î˜3d—hÀ‘¨¶–8PkœSû – EZÞá Ä¬4´®ÙU ŸqÃ0é×5ÙÖm'vâvœìnS¦K™h·Z¼Âù…±‘…Å[P¨ùú®·75RC {5YI£Þ@ßq™tDP@+ÕNçû=©¶}&e(ŒÝ›ÏwV'$âÑÒ´ëôµ…&'…V¤Ô´;àè¸t§?þM¿á'o>òîãå7cYËZŠô²þ#¯gßö?ÿ¾ë¯ÿ†¯¹ëvœÊ%ÞÈY,œ…^•8¹-à-X&2£ýZ;è”U6å’™âfŽ`$49’Å|`7xHÖÀ,V"C2èÞ•'G¯Å%qƒPAi“%YvÉ>Õ.ÓQ¬cGKïÈÙw¦‰Å8Šhw?ÝP­°‘ÂòN¾0Ú±sFáñ2b´æ,`a·í¨XºyVžf¿i3ßõë™ìí±¨Ûš/76Ö²¥þ8Xiw }÷¯{ãÑ8í»(7)9ÌÚmŽ ¯ Y*¯Þ=øL3~qâü´Á´ØÊ4ÓøŠÐr3kgW¬ÃµàŠÂ::ðõ™¡ +î½v”•p¸ô³®1f÷º±(,Èž3ç¤õTƒ2z¾$Éq.‘µ=j7 §šec_£oóe“[#¼ñÿ§I72!fóå5O¾WÖ¶³óÄ ŽtJÔÃF ¿c¢–ë¨ïž¡5´_Da‘w¡Ç„©]†@8Œ7j·lzöJ<_èÈ!îÇú¾.ߎӋ'n\yë·¼ú›—ßše-k)ÒËú%Zïÿ?.?ì2°ºƒ…*G'”y-®•Ä®UÑY¨@»¿Z8 Z(…† ½¼áhµ(;0øbͮٵà‰H³Ž2ͺh¯]¼ÐØDgY÷3‚fö›ÐŽCK®:TâˆØ€–]Óx›ßv!kfDà  cñgÑ-4LØýúæ¥-ì¶-~2eýªvô2}ÕŸ«`¬¦uæu6»æñ;¾çH·ÎÂÿ8r¤6rš½ÝqTv½‹³2s+ÈèTç™ Öè P– Zg‚˜ï{^‚Ó§ßñ£Ÿÿþý§þøò›³¬e-EzY¿Èë‘ïü´ °¾§uÒN±f`<ÓyqMÚY¹ ]W&ÙQû¨… ÏÚ}ÎdÍ+Æ;™Á>’Q¨f2“uÙÒµQ1(«’•nÍEàÕèÃ-òÞ[Hž „r¬!fýi$·^ŸÓ˜âešÁÛ‰6Ÿ Ýèš?ä­Ìnܤf¨M¢U²Î  ihpÒq“ÀB\†t0\CDç×µ¨©É´gÖ´¹¸ íP©}î(:ñ’˜Mvô¡è´Á vìôG*Ï£¥h%#1§Û²³Ç—“>Ç¥»qú³ßùMÿýµ‡~â¥Ëoв–µéeý"­'~âüÙ›½÷Õ=š=°?cÑšu²ŽsZ·§)Lj©°•ÌxFzJ`àLã°Ø0)ç(0‰Å’:hI8ä4#µ¹éÁN-Ô£dV[Ê–1¨K$šÅ_hæ‘XŒÙÌYfÇï´8Öï•r1P>OÉ­(w‘–àcWœ;snï©cN{Õ‘#pÁÀ‰ï³Ò”¤&uPÛŸ7MsuŠFôÆÒ>bÚXi¿˜‰£‚€¹¼Íв45¨éhˆR3»è‘¯kf4ŒEU®Ám÷âôßüŸþ¸²þ–µ¬e-EzY¿ ëìýßþ9Ͻéÿï®| NÔ×Ò£šl‰& ~Öñ‰ÌQ69¹fùÏžŽ_ŽQ–‘]xf„£€^˜=§n§L tÑržÅªÒ¥×NÝ ï"ü7(:wýD–9¡ap>l£ÆH=ÉW æ0ŸììÆ™Šå¥Íuíq›Ww†xXúUI„ì¶¢_yѨÎê€rAtaEX}ì §kyÖÓNÃ7ò¤ÿΓû¾´b¯'@_3pãb$3 Áå¦å6—²õéΑñ£žÜ<é5°ªÀæD“¸^÷M/{ýòÛ´¬e-EzY¿«~ÏWþÓ“cœ:PWl]¥Ó ó“=oþrD÷/ºvì&%Ò®³Ó¹´xvoÔìÂB+ªB´]Ç‚Î"i]k¡#‡Yg– `£îc޶••2¥BØ!rv×EÚ÷JÖB^ MÛqY´cö,î³î;ïøXÃwBÐb)‘ZBV4\!|*m&/£nx:‹ï´ügÚJͶ ÇØPÏóîf›Ù4ØC¨ M¤h¡>lXÀ×K:Gv]IznjÑ®8h°=¡vïõ8º#n°@n7IßÃJ€+wâôÆû¿÷¡øÿü·Ë/Õ²–µéeý­‡ÿÅK~Ò¯ÕÖ3ÒqJ¨ùõ¢…';úcC eÚñ{ôßöÐ×¢7ÿq`l%¥PšÐÜ£P¯[3€•ê˜ PæÄ•9ÓQY@::Œ±ûçÎ(@9ÓâœÂ*ÍS„áæLV¬ƒŒÚáƒ=Y—nsÛ^=Ñ7»p6nŒspãàÌâsVà@/ò À¾(¤YôS¦3´Sœ~àûþ×?·{æaùÍZÖ²–"½¬ÿÀõÌ›ÿÄŸ:»úØ}«cœ&-YÔäæˆÉIÃ*(iòÿßi‘ ìòjb·Ýë\Ó‘©íÌŒ]r¥YHX‘Í͇ž¬×n¼’-„ƒM†UÐæÕB/¸…F0æ±òõJOƒ•ÚØââYœ-‹™âœiGjÅØ7nñ4Ké 9³¸ðÄ‚-•³|FsZt¦å‹2×]¢ÌÙ6ž02#&¿ŸÓÌl…¨A±÷z¬t¤'rËîÆ@ëÏŽóý‰.eÜ@¥Ú®ùÊëü<3Þ3pä!ô·9»‹ZЊ68KËÀz ßÓ7ý­_û¦å·kYËZŠô²þÖÅ“o¼÷É×ÿ­¯'8íû&£rÃt9S&œí‰è8» Œd´Èĵ͒ª¹‹†¥ÐgšÄ+ñ3w,ËGö-Å dd"/Éî+~;ͬ=™beÅ܈ZabqX$— ݾrjÁ‰V˜¡S–³ÍÉe¥-Hü’UÓ´™.b‹€èq‘³v^¥¢ÅÞb.c;‡!0eìDÖŠ ãŒÛ¯pÈ¢¶ß<±Í gÖŽÅW,ý+´´+áÆCHZƒ×Í‘C“qÕA!páæ"q–^ "ú†ÌpeÝ+Ó_.n\»ý}ÿâOþÉå·lYËúèZ‹ãØÇÐzðﻇë€ÓKw*+Ø‘°ä×ÀX›Y„ÙЬ –ŸŒÚæ¦6³, 0ÛË ½™;ƒˆÉâ. o¹È‡"šèPfµˆµÂMÐH¥°p µÂUL›Û ú0 ¦YÈa>ŒfSz0N!œ-#¥LœqW¹¼çãÉ^²ÒeFsÆ.§ŽZYÉâv µ'[zDì‰XL79{æÌÂúÞÙC³õô¶áq*ýнvÃã…Bã•#‰‘ijŽE¶ Mn„7'tbóº±ãL ]Ù|×6iÐkq±®?Ž«¿ákæW^º÷·–ß¶e-k餗õï±ýž/þ»õ9àÒmzéöåÙ½®Öœß’´$Î=­KµhGÖr¥Q‡7² 2*ád3ÉÍ}K<»Ø¤9ä m>ÌuÍ‘ë9é×BÇÂÊ,åb;ëÚÑ:XƒÇ¥´xL·âÆÖMB¸0g5ÛT„fT‚B¹Öì\2­GQš‘øÈ9îÄî™Ò³ƒ>›Ü$€6§Ú½Û1¤Ü’+KÊÀž0¾k]tÌ æyrܸ¤¤ìöBýv!¼o¹!£Yœ-˜mü06·²‘d³p¬Ð¸w­@ÃéÇ£ˆ¢ ñ6œ¾ãŸ|îÂö^Ö²–"½¬Ÿuþáïü¬ó‡ð‹Ž_‚SgæÆB^k§™’vY±”™s\›ë:›M®É„ÇQoö(qÌ g±®™0µ¬µãu`„×¢sH™âÏJ$;šBÌ!,µFÛ,;Zð†-x–de‘“™[ArUYÐÕŠ§káuFú*´(5¨ØŒYÜšEzLâ[Íöxž+s FäJ«Š¢Økñ휾ÿD?qÄfûYlžNvº|väæT†ðG@\¡0ï±!žP·Ê8”ÐfPy™Ô´h…ÀCæ,Ý1ÞÒó\V+±HÖ'À­?öãßøÛ–ßºe-ë£c-p÷GùªÞ󿹇OŽq×Zœ|zi§'ª Z€S`‡<Ýš°6;2#$™”ÉõìfÅR+®%7ã€ð6!nK¸§…S:cîÊÀ‚sBírž=wÔ®4mg³^ ?ý¸áIÍ9¬@¥H%¶®ÜôÕ™ÙÂAô€õy %fË4;¿Œt“BÊÏè3.ÐøÊœþˆ²§¡1Ëã;ƒ(œîÈ`¯¹I˪٫&†ƒxú—G=á˜ÚmQb—Ø© Ê3žóÑ+#ÜG=öý¨0»ãõw®ï u¦§NY¯SÊ*£+U7f±Wûž#‰óÀþ®þ–oÈ÷K¿ìá—µ¬¥“^ÖÏ»®~ÇçþãB§0—[ŽráÍÙ cG­48sX<*tþYÀY2=±ÇÜ ò4(¼kiRÿm{þYjÖH–Yi–à¨EC´ÂJmH-ÎÑ :Šv¡™¦æÝmsï‘Çiµ{ÜrÎÎe ûHûY·Ê†Ø¬ÛÈcÕfÖ¾ùjWþ \G sfV8&ü?]´Lmdn"b û¨ÒŠjá|_:žvÌèØÁ3§º;æùæ9mYÅ [ø\àF@(ƒ+P—1‹Ðì#›s2Í?vº¹³Í‰ã>°}¾õ±æƒßö[ÿöòÛ·¬e-EzY?Ϻùà·|þÙÕ׿궗â4Ò¬b}¢Å:Û µPó8Oíu~Òt™*Naß$úw —Gu'3rzÂÙ6“¦þ¹ä–xu€nY …ìçÐÂM-V1Ñ¥ëûŠ>Öâ…]3˜Ðå-½IXl:eQO,XÂÈL+®tNmá6ë^éy0›S“?UKÈ’…窛–š›Õ¨ãóûªP±Ò¨åžâÔt·m¹Ò€{¢A‹0R³ìè+>½›Í¨©Å.ôñN³”°è[‡ìw|ëÌë®}›kOÒ9çÑY ~ ºñHFèËŠœi-ô-bÔæö›8¹ §Wßü½_º{æ}Ýò[¸¬e-EzYÿ7ë±~Í7÷·©í'¶8$%¸N¡ma’óÚ O{e{ËH2ë”%™i£é­Ãž˜Äd…’P.@ MLìq[Ó>WJƒŽÙµ9í2ÓŽ~Û̪6bèA]¤¥B!k†!t«ž…fPxÛfã‡ç1§±Ô:}°ø';O¡uè©×H'3{ùÜrª]-U­8SQ"ݸçûäyñ«&½‚£åç^ÏS­,‚$ì§sk¿Ç!Å+Uιk;f“º Ã5ºÀMƒP˽fÙi’ÖÈçõà‚vææažl#QI–#ïé¯î\ÓYƒ9ã9“Ž$Nßö-_ùíËoá²–µéeýë‘ïýõÿØ Àº£Ï3ó”]iÆ$…‘•óX´X¸5 ¢&²‰k¤%¤AÌ^‹FM”a¦S¦TU»jGó Ëž.ìˆ1²kžù‡MÓ)[7î‚“y}cãh]´€ÏA65˜*Uf]sÙŽf5ëq×¢E`÷¹Á!ž²°ƒvDŸ_"åX4>ñ¾Áý®PÓÌb Úw¢2]lÏb\jžö”MõÔ(»Ö{jÏSmðõ!}“Œñ¸bRÙž0ûŤöÜÒ¨s®#½Ôw|LÔ R\iѯt=&L´%‹¯_ëu ¢]v¡çùÁ±6€ÈB©šZ˜n(êô8’0fÁÅS§è‡x^c’ê$6H?¦™Z¡AÙFÞËt%sÇ}ƒhCÑ`ŒÊŽÙfÖ¡hç(–@Å›¿ï[Q®4A±XL±(ÉÔ`q1ïoƒ–…†*„¢î`©ù€¼7½ÜÒ–0>­*€áL»ÓÄùñ´çq÷êƒ]fq•>Xã:"3Oo¡‹Xá&Âà{¤Öýº¨›‡ý-=&9Ñïå±!µ=£*áô¼U†kxF?PŠåÉ4O$mõf>â•È5Žè'+2ò…³fß6=¾£¼Žç_zÕ¾kܼÇÅ6qQ_×`uDKPàê¤ú¾eUWǺÓßÓ÷~ÿï_ºée-k)ÒËš.Å͇þõoîÀ©/ª‰FB£Ð™r!‹9Õ¦…vœoirj³ãNaÑR[êS!Ëcò ƒ%(¨n–’”ˆf.d‡ÒÄ™ëŠEÑHc ï‚n3»sGYP׺‰0f³ÉÆ|Ô)ÓL‡ç¤l¨B¢ÃØ4´øK¬3Ž3mBÿYÙAY8—õÆŒg¤åô9+»ç´Óó¹¿Eaâ”-ެÅÐqƒRØ¡ËHøš3ua€‡#ÙMœæMGÏ„³Ò")½o—ëTʶ<7#i§,s+ÃÄ©G]TVøÄDèÙÑ›¶¼£q›×ÍàÉpóÝOÞóüC¯ý”å7tYËZŠô'ôzâ‡~Ë÷öQáZçiA¹Ò›µåÇ5‹æ¨³êx¬ÿ_F@ö” ‰ÂÉèØI²S4ùN½y‰ÕÖáò/Ä™­évÇC©M‚UмÀ­¨Ël+œõJ˜êMÚe0»u¥À±Îy}Ïbq…]-£=]²ªk+OžJ¹0'[ô¼HÖÍB¡—uô禤çÊ ê–ni+knX¸¡p€6œÝJß¼¶³†©¹¼¨CŒ­H„²é—Šž+èݦ͞û#}yj$³'?\!|MßuG_¨õ–8sŽËä+Œ”êíÚ»Ø6C-ê ?+訥vNßýÏþØ¢›^Ö²–"ý‰»Î®þèËn=ô®Ïˆ—qjáyMûOÂ’Ó¨7õ:ªþ5Ò@¤ÒðÂÑÉÊ-pžãªg§µHôàî–Χ…„±Bæ¶±›}h¬fGF7RKˆ:ä3ÓìÄ‘etå­‚– ê‡+MüŠ‘—£Îw݆ŇzfÏÚ’·Â¬õ7Ol’èb§`$ïagÎi3g»™]w&dެïQ 0œsþ+´Øœ´£v”5íE»Ô®£Ù@ MQÐizŸƒŒï>(a Q7V{iùÓ®6#g˜Q ®< ÑŒilÐøÁHŵ3ß+Q9Û”»ZÃFæp‡ª¦&yâç(—^Ôá™÷=øÀµ¼ñÞå7uYËZŠô'äzæõ_õ÷úÛp7œu@ÝêMuŸ¨—í´ødX0i‡¸ò*sBà‚Í´þ,Ž…m× å°a‹­µ¶æã-þ‚aÙaÖëøº–”Åe&¡ ‰oÁi‘2æxg<*<8«=h¡½ê±Íæ#ÝdÑ,¬Iv ªU.4P1Ö¸£³Z‰`æ¶Å|ìÌs=9%-¾Õëße ¾yâ!Óúô‚Že„ÿÓÄL†¡EO‚ä·j¦2µy¨§I7#‘ ”ÆJONQ…@YWÝÊH" Q j`$¥>Ǥ—ÔâIátÞc3P æºÆçEj®g>6DFtWpú¡×þÉoZ~S—µ¬¥H­ó'_wßþ¹½,nšOöŠ,]3ð}sýò*šH(³ÎHÎIÐ@>×¹£¥HY@0KB2ÈÚœ¼XÔ#ÉF…I[…7pñZ¸K×$M†Që ŠewgÌïƒ}(­3nñœ=ƒÝ¯£ƒW!,^ Å؉’šÊˆ–œ5Ï æŒ>íÉ<§ÁHžô}õ5oÝåDoñlÞØ^ÑŠñL7GÞœ¾&2Ä 0miÄ‚¶ ‰Òü²=7Cà¬Üєʼnndj×ÒÇ`_c×?Ž@Ììg^UL<·n¢ï67M9óºšŒŽ²<ós?de—ÆÆŸöúw¦}¨Š¦ÀQ¾GVáq¯Ð]6—;<ñ–Ÿþ5ûg>–ߨe-k)ÒŸPë‰úß¾ÞàÔæ§ŽQ„ž]—°Pz¢ÙB<°:!#¹ò>=h§%쀓u Yf)Sà ™'F­ØeJh&#‡d)B²‡Y);¸BèÔ¯ZŒ¤ó ß`H”X™^tè’®Á°NhT’›´K¸é8h²ÝìßÜxš‹xzlר ç”ôØÌª…Ö£`w ZV…€³&‹˜,zރׯYª—+3TM ¬¸¬nã\Ò¸Èâ c`ö£$¯‰EWÒ½­ˆÎ¿zöN!í°¢mÔÙxåfjÙ]s¦"MÝÖlÖú>K¥"€7…Á*Bf}%áÐ÷#rÅéCßÿ§ÿÆò»¬e-Eúf=ñÆ{·O?qoèèŒÉ§£‰F×r!Ú%*®´ÀÕ fÈ,4)j! Ò:X ¤¨fBíÁT¤¶›¸cÁÁ€ƒŒG8§EÑÍØM X@:jo}®ã T!ëyò–æâåÛoÈ4*Ñ®ºVÄ‹ŠpyMÉV"„Ì¥9ƒ•¬ ·f¤%ô1>söÍĬîè¯è9Î¥ûVŒÓ0#Ûψb §x¥D%ò|£ÄY´ýò#Ò1¼ò} µÒB½ttG6l+®þÐ7|Åò›»¬e-Eúã~mŸ~puöá¾,Òo:X­”œ'Þý³cºaÙÈÂNÔ“-C {µ®Ó.|“êÀ`o¤2©d§X¦,3ÝJZbSXkBQýôA¦5×/“he(+òV”Ó °˜n—Q”F ª$ÉÔŽY¨ýFÖMAìôÜS¹RnÌhûùºã¹2RS¹™vJÞ*t(Cæy«Ín4%k˹v4é”àÏPÑK%‰žêŽ´LYšyˆËd믈TÔV Mº†N7`iäø¬³Ä Ìd®a$Üå­ê¾+õꎨÀ8%ñÜ082ýy.“S$¦P €Ž¤µQUw\Áé{~ð/ý/Ëoï²–µéûuýô﬎pÚQV §»TMMVµf1‡V¬Ë¨… Pó\¼zQ»7S•&…³žw ÒœÅ6 …›ƒÄ9dÀYšY÷‘£ãž³ð¾ŸuÚüzÇî߯ ¶o‹d——Lí¸V—í±[‚7–µ¬¥H\¯´ÛáÚÏþȫחõ¦î3»AI8§ ìZ€†cÚ’‡ÞhÅ B!Õ`shÎ3€î²ÞŒ]à|—›Mö)0;I4ËOëˆmþZH޲€ cZ _ÛlF͒ңɭÚºu´ÂÏ×5òRb!gwW,ʱçq8eò«Êbe¾ˆº³YhÄAŠÔ7ßk@»M—›_u2×/ÎÅ…D3gžæ¢Öšètäà|cÞ{óÄfjÅ´‹7V¸#aLìë,ø`Gèg¡8-ŒÑ7ÁŽúh òp DŠùÞãl·´}åhÃRµÌq-Sƒ`˜ÏRϼkNg99 ¥¬£†{½Áéƒÿæë¿fù-^Ö²–"ýq»žç×þK.F9BèGÝ¥×¢íEoÚS¦ê ¬^s¤JÖY1ýÈÊr>dJ¬€¦}’ö·’-;b*K™5{d‡"#»V8š6¹²Ë­`´"áÝdr*‹Ÿ\á0 ?ha §uÕ•p³Í0cO{v÷A7Î5H¼z-.RÖa]«±•K3|)™(!q‹ x$>WÇ 7ÝŠLëc`}…ïiÔã2GM Ïý̲Ôs®ï}ÛÈ!š)Úf©ã¬zºàuýÙùÙ8åx}ÜŠpº1ê鯞 /8[fx†Åm N"7E4g™¸ÙO€çÃ|¼½è¥ÛœÏ½çG^=ž=¿ü"/kYK‘þø\×~æë¿&œà´‹Ô¬†æ–ØÕL½+YÀÓ}¼©Å•#ÞØI*rœŸÚ¼:t,¾y¦MfD£‘ÁŠÐDÚ-•yM¦°¸–6•·MÇúÖuW2ÅõÖej¾¥gY/d‹ç¬Û²§-ŸÚµ B25õÁ•„i§EvdàF©-c:'JÃ@æuV8|Ø©ùKe¡>XëFFö¤¿”f azà¼c‡¸'c›žÐHðH£üªT¬f¾B8Ö ðÂW"ÍI8-4f±`ް"óyÔ×1³“B÷57Îâgä®B µ¯ Ä fÙÑÇÛ1_9x58Iœ‘ûÈÇqN.+%‚uG@¼ÄØs^f¾æN5ÊÁ¿ÀVu­Ï‡Ú±ú=G3”0ÍÎ;Ã1Œ$†Ô´ÔÕ (o)\‰èG0bZÖ÷/U¯ÛAïmÒ7ŽE<Éc7–™½o0yâÆè )Ïú™Yáô‰7üÿþàòÛ¼¬e-EúãnÝø™¿ôWº5NCÏù3e<`we³Dï”=ÈŒFlÍB2¦¬ (V„I9«´Î90nRxc68¹˜£•ÉwÌÁ‹6œÙ QZqZD¢3Ù¡tñÜÐË»r“ªŽD5ƒõÄ1sÁrͤcܳXs`v¡Bˆ»ìõ}ûªÅÔŒ?ÀcpFj3/rš˜Ô©%B 3œÝÃœ× fOCî’†–8’«rh#Gƽï4ÔBB¡î*ÜTE@âJ»bgLr’‘>‘iîD¯cÙÙ£ÉÀŠÅ]B7qã žß!jÑ,$ösjxÝ4¢1˜¥• À…¾F®@š¹—Õ¢Á* –ÞΨE;zyo eG›ŒÀµw}×g-¿ÑËZÖR¤?nVÞ?‡Ý“ïúŒ°¦Î­pÂÈ94Ç~=Î:0‰„@û–ö$”ÐÄ©‘´¨%…Ô WÑ.4—ÁX õÐ>UÊß:ôý9˜'6Éi@Ó\‡Õ,ØÁµï‹ž´¤+̤E©…OKs2i•Y‰R3L.d¾Þ#¥QhD³àšSY%Ã= œqÓ°Ä2¯cÐMLˆ×su™ð}äæÃlN¹ ©ülHÖkÝ8¯ŸOŸµP ejñð̃ïøÌt¾È–µ¬¥H¼@ÝïúÛ_×8õ¼à8ÿäýÒ®HÙ²Ó"â½Î¯=ó‰M‹ìg¯IÉSBØÜË ÊÚå4שê›Ç‚/,û¹$K2È«}?i· BÔ|~‹4ËÉØ˜ßžŒ`ù´ÀR¡,ÄÃqqxœk3XçÛ¼ÖÎÏøFw­ÀxÉL³–t®$;x$g™¤¸Õì*ŽØ½O€;b¹A#+Q¨9Ï ç É ª’È åYB/íñg5™;g¢Õë¦kä|؉^ÞÉãÛy¸F ‘Ú6@A´(›Ì öÞ¹I°à”ÉæØ<éÉÉkU I‚BîY”Ùùzã ¥Ž#’Jy›ËúÜ{º˜Eêø?ô£í-¿ÙËZÖR¤?æ×Ù{ÿågN;j_….U+•dðVÎ[ÍÖ²H&êŽYÌG…4Ól>"g²4Ÿ°®ØÔN6¯tf—)@9p1ƒiÓÌ¢“ÎXâ5ÉfÏ’i BøZ:-èæ+I;-)3 3*á »X÷F¦ºmó©¶¹8¼˜”šFÛ ñê€éí<-zÔ¢‘/LŽ# \üeunóúg†®Œë<èš«v™–VX+¡~×üÃShsvP×|ï”7Áû=ÍQ<¥_<§Ž)^™Œó”h®²êi°RI\sÜ8yÎó »v“I¥ÜÆ)޾Ýû[M"oZö8cˆ• ¯ƒ&úw§D‰Nt#’Ø\ÆéÃoø`ùí^Ö²–"ý±u¿û/ÿaSôMfSi¦á:’ŠßÂrBé%<Ó…wš£WbQµBœÊ¬¤–´¦t˜Á­•óʾAœ‡µÍƒÉh.t(+ìJÍ/I^ó³Ìb 1mÞ-±‘ Jj¡ïéÒÈR©´°ìI^ëf]}iP»#Û¸ŒÀp¦ÐâOTš: ^áì™;ÇNµ’ˆç:šu˜,Œï›>Oº¡áeó9h1¬„œ+)t{#2a†0âØ]s¶û6f¶«ât ‘ØKÔ×7ɘ±÷ KÌ{z½â¤0·]¿Â.Û׿÷n±–ŸôÌd,4‹Ó‰F,•]w í²¥Ç}‡Ý³×¯Üxø÷.¿áËZÖR¤?fWMÛçÞúʸ6Q;®Ý _=a_²}kÒκæ¡FÞÍÜÂÎ Ý@{°”%?óÑž1«°uU¨µÌ<¼í“QÎÛã¬á:d@Íb´L¡m1“M–TXLE•?tuÒt¿b‰^$o™|ÉÂ!ŠEAB7®Ã9ß+=µã —è{Î41鲿{‹3ÛœÓr¢g5Ï{=ÀBm(‡túÞÓDÂØÑ„¦'JôvQ‹]Ù“àFëN°#‡¥ø¥EM*c*+€‘É^:©AßëXUÓ šÞxnÎ2ƒT î^_VxÚAËI‹ç´d°ùë;ãÐý.Ñm ¢÷ž<ˆà!kœ^ý‘¿²È–µ¬¥Hì®ïúk¿k:çX¶èl²Ð6r,ÍC¹’åÐ|£½Cjæè8{5]-Ã- g‘ÉØùZFôÁÈÄ<ͼ‚žÙº›h°·ó3kËÄ*³ã´ò J¨ÙÚqs)K”O±Šzéi«f¥;™1¹-21më*e ÉÂ6“©\t^Þ±{ŽGú˜šÌÊ1û¹dr:&<1Hìø‹ãûtL~µÓ¶È8BØkñÎì>Çü¿PU ~æ¹Ï„ò1hYÜ]¯ÏÙ3ËhÊÈÙ²×N?ܬ˜1 3´Ñ‘=ö9q¶A¤®¼4Pˆ?sÃähâ9nØžk×Hô37;‹»ÌPgÂý ðø[¾ÿ7/¿åËZÖR¤?f×õ÷þÍ?q´ÁiÇŒÚ^Ϥ$Îáµ¥‘P+‹W  ¼ÑÃdOtë‹BÕçŒqæ4•8뮳bèZVå [k£‡Kcaƒz™¦„€ƒkŒAnøl&nI]6wvPAKÑR™MMƒ–BtLàŠBÈm¹4_p˯6f4,kd’·"7UÂîÕ ó{iz˜ùÌ÷å¡lð¸QB^'³Àa)3´ºQó<ÞZ*Yáå`ü¦ï[´“ïcÛ yè˜ÄH}‰²¶ÂJg ôÐ<ËYÿ¶ÁÑÏe@¸½ÃzËgåÝÍå~YËZŠôÇÖºõð7ý÷ÕãÔ‘¹lîR•Ež.SÔ»¬låiÆÝ¬(î ýÒQ ŽäDÙО…yË¥‰L`´.ôÐEš\p&+/Ìm.íæ °0qQ&í´Åò¬}ëºÍ;Ú,F«YšÒåËI{-xʘØeJÕŒBˆ#}Á)Ér+%SÕ^Ï[¥†·ºTTvœ…f]ééß-Œ€tt&s66:-²ÙfËìŠCßøvÞ¢;“ÎŒÑ.6ô˜8Zð½JƵãUTK]Ñl_sjšêDûRW™çô†©ù½O™vßEaó@2ÚDWµƒ¼o¼€êØÕe¨;váàfɦÜ<”AŸ¿P+ŽÈÍUm! S‘+ðá×ÿ_¹üÆ/kYK‘þ˜YóïÝŒ×I„Ê„5cKí.3´Cœ8ÓìVÚ]u^o¶QXz‘vJXJæ:5 ư"vX0ÒÔ4»àÒ¬,{¸$v±L©ª„xó®yA›Ù†šÐµ+‰œ+ÛLUZ'ŽÚ`éŒ]õ¨ïC8×L;}BÕ5jqs4Q±˜F!lk! Öٚݧ3*ºC‹žª3ˆÞ eóçq`žâŽÖ]§ä.³ã´ ÌÄÃ0ž«|+`×™[X¯Úmµø¥¤›uTò\ž€aK™—o³b)m³a)`öÞ;úCÎ7‹¼müªq&…þÇJ2¡éÓPuþlsKs@¼ÖfϘԾkþí¾Ò®´V¤èOpúáŸú[_½üÖ/kYK‘þ˜Y×ßó×ÿŒ+8]Ê£ Ðîê„lè e {P_Y´Ù;úIçI‹;B³˜„k‰NBOè2iÇì¸ („(]™ùyûá‹7}K¬²0 HëÆ¥k’ÖQÂ$Eà`’ªÀº‚Êùnô=e³eD¹PBXe—ZB+èè3ÝH]&7sà§ çË™Ä,kæ³3ã#¹‘°åØ=#„ØéT¨[–yw³ë4 ­G+¼ÅºEZj–èF¨Tª6BÐAž\xc‡¾F°4&ÂÐ’õëÆÒFjÖžfŠß:êC´å ³ËC0W`!ÇÙ7ŸsºÅP¾uî¦*®cXÇ‚Ü!£šÝXL¶eŒi¡æÙwm\PfÝu­m“R a¬r™³È};6›£—™:&‹ÍÞ¨X"˜4«LG–bRº±AÕ%ÓØmÔ÷Z“:ÆU:©yÎwk& MÏí‘‚AîiÐY¼@—ø¾2Èì={:‘MçzÝÃJ¿?‰vÖ!~'Dí©“6ggÖx´ØËÔ6àlÞ“àGˆßÆÚmO¥ ÞæñÄÛ¿ù5Ëoÿ²–µé¨ûOGàÔψY.)ñIæzièM[Žx“&!ËäSa£óàîH4jÑ?öR´;S‹¥Dæ¶À‹J7­šZÆ0,Tƒó`̼½«#dm3îÒ ] û¸Za5KPJ¨ÌCü0ï®-~ѳ»,“¦E™Ü*q¾,S+t–¤å¥«ÍhˆÌ:_7é,;•F®³Íˆ™¦ ´kD9ÓŸKjçÌ9¦ŽÙ¬žóá)5í³1Çó–› >ÆdL…yáF¢sQÇyRÚrÂ…HD•FÆ+LžÏø³º5Ï!Éu“ñ²vùшbƆ'l²èÉ ·]ê– ZpÍrTƒê)ͳ™wð@ŸÐb,tïýê·Ý­.{Ǖ尬e-Eú£zíû'¿k}»Þ¤óDw¨®™<5˜7OÚÝ ©LÈĹ`Ñ|gG‡+¡W·³HG›!QËò”koæ\Û:Q+pÔ7[ „?j­ÔV­+­µÁ¯– }ðž½§ƒ<Ì ¢ÂÚÞ,`©çöö}s‹Ðô3§Š\uÃájÁÑIgÞþÝ_¶Ü–µ¬¥HÔ®çÞôGÿŽ?©Z0Í\¬+Ýš¬{ì7ìHWÀÈNÍ9í² }º…]x´0§ŽF#áϱuç‰t( êÛÜÙqã˜Ò„Òì8EfÒŸá4´ÈœËšäIL‡\›<¬ÈÌåÊR§ÌåŒF,µÎ‚3ÈÏ{Bß,ö ;šde*›½)fzmÔ-ßç¨çºä†(Ø"ogv&x‰¬°ûô¡uðR+ßgT²"”½èÆMÍAµo×Y:…™e¥×%ˆš•¤‹¦S6f=È:/™ç"Í‚VÂíýl,t^ƒÂ×H u9ÌêmtÂsÓ“Œ8íí(th«n*LŽ <Ïyà{ ¶¯r Iˆ+ݨø ìû“u¸±»vëÒöÑ7᫚ –µ¬¥HÔ­g~ú/ü¡óG^÷¹Ñ¤H \ÍÍjªšTU†vS,Žr%(ŒY¡20ƒWë BNž Âáx!è’ÞpÍ:’Í›yÌwÚE—]3ß0Oho²YX&« Qš®Îг´úá“•¡ÍºUôíÃgÞÐì\ÍŸÜ´Ï/ˆÀtìÔ ®6ö6MB:~c€[`ˆÕöÍ!ͽP7n0˸Îí½wqƒÓc݈t’µƒ/œ§‹×k'Ô,g²àƒÓ¿%\U®j Aaç+ôU/˜ýܹ1)Üð¤ÂbM9zíŒÍT Õ½¾µ‘$2Gx;x ðütäMLŠÚ³9å&ÁyÝ$L¥q*4z% åïÒ^σàô}?ùwþèr7XÖ²–"ýÑU ßú—Ï3?õWÿ¼ïpjE@Vzã.A¡ënEòc÷f¬ÛJi–Íj=å5 0¨Ü3,Âíu–8íÎõ ¡‹sr,|;}îÕ±ÊÅYHFi(Lúµ[çÂã7¸^fÖV¬Ý,ßzß$\ub.1¡âRHÌb^6f~ÛŽÒ/›Ë®ú~16&·tÜô8}ß&U*±Åd/Ô–|ŽI7&ÁØÒ¹ÍòaN`ûöÿ¦-7YÓÁδ4ˆ?p#áÑ‚RëÂ]+Üž’èûmA"ûƧ6­ ’— ò¬.è\x8søœ„®ôe Ã.zT6›ˆgü%kYËZŠôGÏzúµ¿á[o½÷¾f}ùÎSÇ0 ÌÐnzyT“õäÚH9Þ¤Dœ_æ¬ØdD¥‘Ý å3°¹1Tc~ØÕQ†$4D¡+•ǬS6"‹úÁ%,5²LŽ5Îf£Öa².d/Ôd{‹'kÜÜÈâQèfV Ø¥›üÉ\À ã ]¦åù &¶˜F>×! ĺx’ð,ÙËfè ¡ÈágÁ0§£\f;»iëÄG`°ø”{Ûrª;j‘Á„¯<6ŸvéIÖª-då #ÏS>V…’¢¨‚ÍÓ¨óe JGýIn1¦SÑÏ驵 úÆ×}3+ñ†šðÜ8Æt†ª~ß~ž˜EÉW`uT“˜™í}FÊuu;†'ž½óüC?ùÒåΰ¬e-Eú?úzä?ûŸ]\}Ýçzÿ’W >¿Â!qªÊÎ`:è:Òx£V]NCc[­£x¢Ý“¹}:y™-èDØ8ó„ QZa@RVrˆœ£I£Ê¨PfAƒž öÅj–Kmø¬Ð¨CšV[f^eÆv¶‹Aoôeß²¡ÁÂv×°µuøÅ´Î&éúÈ ˆ8䱌lh¼ÀÔ`jŒ,ξçÂëTÆÖÉbh3g±‚¾gFµÓ9q¥LNØa:Å y#Ž` õÙfäЙr#”÷„“‹¾§LVº¥V£f#k2ÂSÕ™²Ûs~L¢NM›ŽD_xž¯Ø‘è˜F’¡cg_ÇÃWÎÉ…F&Ü@傉ÿŽœ[¯{GtÁÔáô‘w|ÇW,w‡e-k)ÒÿQ×ã?ö;ÿ×ÝÃoù,åÓOs~B‰4ÂÎ z3͵é´ó™èN•ÊŒÁ,%FŒbÁ*I¦ÖŒêÂÌU‹Ým0ÔÔæÕ‡ „ÒÈHBsBó‡œhi…Û•–«ŒŽ3TvÀF#r<Ó³àäU–œ5+¨µjpÆá{lÞA¹˜iœ}O–v7ëò}ëÚ­;o´uÆLî9?îhH‚¦ Ã*œ(ìØx˜W7QÄ pž_(‡«E ¥AÇ☃}Ñ´ä™D:›KÕnÝuúÞ­W-BTwO#_§¶Í‘‘ü€€Ókïh¸R…¾àe6>àëߢ'“Ø ×'Ê©Œô¤Ì°“ÈA9€: wÀ~ /9ÝÒœ+¨ã3U§ÞùÝ_¾Ü!–µ¬¥HÿG[ϼýÛ·ÇWÄ#Z}‡Þ]Gî´@w¥,ÔÖ:jWÖÎƒÞ ;º~­ÅrŸõû±gRm&ýF™ÂŽ]bß79Wžše'ŠžB=WØèÖ²]3oþÎäE2ƒÃ­°Î?-2+òçh3i·´G«"ÒnêÂ×sÐã4³˜ƒYiÝ{™›­˜Éf…ïÑ…FdÿH’ÐS;˜ÔËž«Î‚47,ì)³pƒ:ñ!ó˜Ù™±«8e»=çïdbw=°:fÁâ{KYçÅ™àÈÚ—B!· Q&ɯ‹3• Ñ¤ž¹˜ÛÜÔŒ4¶€”¹½ª1Ù£è¦%38£L 7MºaÌÌÉ69¸ gÏ+Ôp;ÊÞ¢×?æ·îÉWN<†§½oûä»/ïe-k)Ò¿ôëìɇVϼþOÿ“;pÚu/C¸¸Žj^ÒìxÌìÁ¡ig«P#7y½9Nfi #$e›l*S2%j :Ò¡*7‚Z%c<Ìæ¾ÕH[±ÁíÞ,9ÇF²¢]¤%[^ÏŠhÑæþÜDPtCa8­“’hA‰ÐkÂèÍâÛóT†Y8ƒªÙA²—+íTÍC¼°˜‚YÑ……·„f«iùÚFZK¥Ù>ü†"ìZ§[2€5aãIåEÆpv“†‚6-´ -×™<‚4jä¨uéÅæ¼³b'3C—RÕU‹±p蜾¦–A* O;>Öë¦Æ£ÅrÆžt§,k#Æ™¹Š/m¼á¼vÄ)ëq„ÚTaoÇÜíDö¼˜ ŒkŽiηÏ Žj¸Ñsè©VIô:òÜl&²ÃkJ¸ÆcoþÖß»Ü1–µ¬¥Hÿ’®Gð7|kyN™­ÓðbÔ¼ƒ—§PG-Īc.ì îMïGx;ï•ü±âZÇmr“|H\ûæÕ]AÂÚô)U޾ÞÔ0Wΰmya÷kÿˆš4pÎèËûL3Z± ‚A½¨³èM“”¥‘2½ÎKâ†&0öD9nè,¾T '× NZŒ'Ž2»Ð̯˜g¶›Y Úf))¼žÎHÊódYwÔ–8¢¨•9Ñ<¾Ð7’`…j¦3 ò œàêL¿½nãÇñˆÏ| n€²ÆªšŸø™Ë@©_gòR½…"[ˆžyç¿øÒåα¬e-EúæNϾþ5ß¼:Æ©¿0kª¨õCÈ¡AćBE—&1ÉÑÔŠKᬹpž˜Î9sìhÝh7wÓ‰g•leµ°ÌÎóØ5YqÊø-44™\s;c„Cúðë¾½—C´.׊ûŽ?ïg…™ u¡–»Ì£.§fža20MʬÓ÷³®×2­ÝlÚÜYÊìûö5º‚¥‰ç9·Ð ˜<Ç#3f¼£II™Ü`1‹DI¦–/ûŽZvý%n HL³†½tíØ¹žÝs.ŒµÜê±ú qx™)‹ÍŸ8‡ž¡ž>ÚuÏÍ:ѯºêBî&MÌÂ^ÏuÎê0&ÔKgvÕ¤ƒ÷ÐáhF<$ÌåÐÑõmTSUt§¿ã_üËÝcYËZŠô/úzüµ¿þŸútÇLÂ16(ÓÅAûÛ±ÈÙŒ3 yC‹´â5ï\£Á U¸‘­@w* Ý˜QÕÿ¹Ò$£í´aÒ‰¤//ú2´.ŠB¡16Og°³,©…J^]øaZš´IÊfI‘ÉO-Pk´Y,¬‹›eR‹ý0¡óxÂ9=s‹Nhñ…Åÿ`$ÍsSeæ Vš)G¥y%£D*±î©ÝfbX’¯7%…3{u£3ÞDËÜNz¬Ái‘s$s%¾×1· Z :ΚþØàw!ÌŸ Ðm€¸V;q9»Bì#MWŒËPÒŒìjá Kç¢o"8fá ~Ö‚Sîf \ˆM*Xñ{Óö—ÆÐ· r1J®(®C8¹ ×~ÓçFËZÖ²–"ý‹±.ýO»øà?ÇGœ:ß² €;C xC­ôZ–L ÞÌ£ÞØÆ¡Å :ÓÚnôß¹0¶07²NeǜʗÓV§sì¼£E%oÄ>2‰]c˜yrdR®uª…7ñ2Ì\»Æg¿€Œe°)¥Q֙ʊEȺ»2óËæ†ÅîûÖ¹ò¡{¢ÖAòÖ Žg– 2¦ág°¸Ís©/Ÿ&vôQ‹Ú4ëšms dhc¤{7(Ž0ñx®×ÁûVä©…æ¿Å ã ãˆÐ7iZ†vÁ¡cÔ¦§$ Œ}<¨‘Ž´ï´MLqÌ|µ.4,ñ¾éÜQ ¯{=.éqp«„¬…’9@Ç&6J à&…]}*-le8Óc6S–u» D ½ÔÌ!M€GyÛ‹‹Íµ¿çË]dYËZŠô/Úzþ§¾ì{×—q*¾¥ Åþ žT‰Ì@öl引ÚÓ1µ8Ê2P²"z#wœ;èM{’Î¥¡»y׺9ÇÃÊy¯7rS¯Ò¤–n¥éHÎ5½´ÐÈ#p#aF'æÌeY̦–Õ bö3+ÑqUSn&¦+žf–v¢È­ó,” •©»ÐõD²Ðºb³<µOêd6˹†çëpœàØI2Ñ£º@ÏG×·âl¹Ø¥PËîZdd冠pvnZmÛ\äV|vì£Bϯ[Iz ]mçÆ“ ¯9Ï}i RÆ2 ïYO ³_»nÂ<òiR’W2 X†~Š2& ¬ÚŽ„H„xBá å°´¶ŽúçœÈáóª*¨Å`ÐÏÝ”µËôVwBÞÁÕ ‚àô™÷|÷o]î"ËZÖR¤QÖ­w}í3=‘euDhFv5RêD)T¡‹Ué€É+”hVÉëã]æH—é4(ôê¡Ýrô~>¦fãhD¡2ò¦ióìA_/¬ª4-lÇ8Wê“K37É„Lë¬Óθm]Üli-Î:[ÓÆVJrq’f—955fq‹hð†_‡ÖAJùyÚ±Zri¯WèÐUª" Æ ³¢d°¶e ×ÈXïm›«gížgÜÁ²ŸCe”A ãPõúåQaìi¢ö˜ÝuäëŒaqßÜÅ@fÝég*Ñ»ÝA‹äžr%‘+õÀÄÏ›«Õ› 7{Rõ±yäëVå4DnfÌ`%ôú'Y‘Ý7¤Lm#•æ~èHߺî®k£#ðÕ¨¾Þ© Hn‹Û.w¸þ³ßÿ[–;ɲ–µé_ðUKÆ·|Ýÿ´¹§†´‚Îåʱ=žîWì¬VFH"[,& ¤ív敞ÐÎñFNN UÇÖM:‹¹$¡©–æñœÉ¤F Û—Ìåi;óûf¾óÁĺÆ4ûdŒ­†4­œáÓbíc6³3Ç/J²êÀ¬£—·=WmˆÀá± K7>èZ6vwšph‰eB»¶a0u ì°®¾ä¦™–Žb3˜^"õÑ–eúé^7<µÐÕµ˜Jë°+½ÑCdñœx}*7]Éfaæ­^¼,|lå9¬=eiž\AZu&nè Á(„Ï%Ó;Ük–J¹øØÎ³]IhYãö≶8"*Ül92·1ƒàá•g(H!˜¼ âas Ï?õôÝçÏ<¸Zî(ËZÖR¤A׳?öÿç48Ö{Ð2Poœ¶,>CëòìØ:ëÚ"M2&3{`±5¶dc#ïÉæNJ$ÊcëúFhç“è^ŠGfñ@Õã)d=û`ùâÄ¢R[¡°æ.Æ~¶¥Ô:LУÌçºÖíÎì$Í¥Ì\±jmÚ\3=q ÂÊ€, d>c—¶g羟‘œbûD—O ƒFì<ðµ=%rÙHa3d ŽD=àÆÖQZØI"²‘“ÚzJU’ŸnHœš›Øk‚¹ßfïéx~Š(˾zh×ÂàúJ¥À˜8Vš)Šu×âU¶† Xóó•yî½×÷æ‰æjÎ…è‰çãÒÔ6+‘‰¨d·ÌqI]Éìµy-= UúNÉd®¨  xtëËHn…(8½ù®ïú/—;ʲ–µé_°µ{æÁÕÙüó6wàÔ6ÐJVìv¬k '˜Õ%SœÌq*§Æ,Nì8 çÈiGv¶Ÿœ>÷H“ç\u¤‹˜ºTåIoæ>0_:7©NvÏ³Ü íÔ9#7ùúV\¶˜IW^(Úi‰­8èy18õ`XÂ+K¨ú`¢’uó6 m€Ô QmJ3t¡Ó@—²¥™ ÇÎ6b4Ñ ð?ÿÜhF›•r-?9¯°¦i‚[G<õÁúÂ宲¬e-Eúl=ÿS¿õ»}Ä©¦ûL½i¥Ò<¬ç‚%i ƒu‹…éBɱ(t-W|+¤‰š×\TÆ2&½Ù•¬ÿ?qž™½Z‚VF‚ùÁ•dó¯LBm°¬I$6ËKëS¸ì\‹1ÐÙ¡»Lõ–ÓMÁ”Ôò³2›:—Y v´6Ž0Ö|YÙvÎg‘¤]×HûÁ·ä¬ÌùþHg·Àë˜üAõ†>6£“Nô³=·‘uj @ôèW8}ì-?ü›–»Ë²–õï¶Âr ~îuqõ}îðìnuÛ} ½˜È†¥aH¬êÑzj“v6Þ·¬g¬é—=ª+LzƒöZô2Åéówn ÀS×ÏݪȩÇ:$¸*8Z%ÜugÁå w-À£Yà,³º'üšrøÛyüÒ", »!¤¦>¸‹YÒU™¹¢™ gnëÌD-ßnÊÚf6²²§æÚ<¿y̲šÍŽ-‘ T 3Úo˜[Mø6tú>Ü|ö]Yà Gzl–¡r™š¬ÉF…nhHä29˜´ŸËdË‹o®n µ*’nº|liRnæaÊ,þs£Ò§<ð½sFüЈ^#ÿ‰ önÝ:×ÄÍ›sôPá&(±Ã‘R¾p[n xž,–TlæÞ5¸¿ò˜’覰ø6®Áš—“(P¥±JçºV–»Yzò„¤Æxn2ƒFhAš¡çÚE5Lnä2™âë 0¥ D\GÙ­q~<ûþ~Õ]¿â¿zÃr·YÖ²~þå¿ök¿v9 ±žüÁ/ø®PvŸÚÐ ƒzØÊâZfÉ?ž7ó:±“bÇUHÚ:XLŽMóš&íHúxú øWïÞøþc|à™+xâ†ÇÍ}ųOo#ž¼ñðÓ+|èYmgî8Ð{Á­¡+X¯”¨#Ì…Îôjö4ÜØæ¼¦ ™É`fƒÛeI•ˆæ©R w:ë^ë¬0pæ]-;»Plúhj’+;p‡Yþ³çœÖr£ÍXÙq–ñ…ä+ÇVÛù÷VÐ/íøKns`Õ=7'ŽÚëDh¼‚R"¦ƒ‘ ;fÏãuB'/vÈÅ·™av6(KJY7*–%n^ëð”KAß‹ýŸ«fBÃ\â8Ž®ýì´ã5âfÃØÜµpCÁëU S®Ø)Wk‰úïÈMDâ&Â{m›Q¢:¤ Á*ZˆH-íÚyCs uÒAçå!èÏr |2r>ÆÆ+Á_½û_öËÝfYËúù×BûÈ.úñ7ß=ܺv»ã¬±^°€Õú™¼¥ÐH¤clŸ›xã·Ä+3² /rÙ·›äõëÀ¼øÉ÷žàƒÏá¹s ¹¬#b)Xû‚>Td<{ñ=?s„ïxó?¯§'ØïY]Óç-=«¨šu©–Gm¦tm$]—H3}Í›§sÛÌÚÍØÖ&Ç2®Yͱͣ%] ùO­öšåèØºb <÷Vð+gÍeÏ1ƒ…løÆ0c‘jsïùëwxAÂV5˜IêLÕ[.ô˜k¦ í2¥j‡™Y Z<3Q‡<ƒü+U ÃPÈî·€”Ý › *úyëi!k^ä±çÈ SývfBX¥‰IbáMܤØf'±ÛM;~Í6aÔ§{~?ÓÌ‘ðU*át–tÂù´´ã§óú©Óc]õº ê;…Ö«Sfz®~µÇºÏ¸qõÿ³ån³¬e-Eúß{]ðO~“ï”Ñ]+å'”©ÔaÆ.ôFéœB|¥´®`1³}¬^o¨Àšðí›?ðSžà©í1F$x¯”â)¤TKAÍ.ôìr|æßö–<²Ÿ{Âa¿Õ‚QÁ×X‘QΜà¼×"2e»øÂT+ó°¶ðKJHÌŒ,ŒÍ@c³Ñ\5Fµ½÷XqZ—Ì93fZ_ég´BzÆ°È•Ô lW´°›M¨!(ÛÙ5bG'¾}Ð5Ü3ݲÓBUYX‘ܹæÆ(ÊÉVÜðô—ôïÈNÙœÒ2£A…ïC ´l3ùª sUs,nކ$6Ó.h#ε¨Ò `Üé±»n¡Åqzn$SÑÏTýŒz3ÐP¥¦˜…YƒÄ3_UíŒnsoˆêËQ€!5²[¶xQßÞ_@•„.xŸ\Æxã±ûÊö¹å†³¬e-Eúß}M#.>ô†Wõ+í8J%\í´ûg^Õ2“ìÀê‹læñQÙ´nêlzø7ïñ¸zcƒT&¯Ýó”+†\QJÅT*rÕ×Z° WŸïñ¯ßQzàæˆëÏӌѕ3áš ;²£uh©H%6ž sdÎ8+ OèÙyÍÀ¦Yá4KOËpžÏ~Í}̵EsïúÈ¥VÀ9ãOd—KlÚ^{ßµˆÈd'n¤Â ‡oP;XPË@镹yÙ¸ S^BG¶LoíÂn{¤]¨£ Hõùl‡/U=¸mCa6›™Zãp¬…±«@>§/|h:{ÎáyzfN{i§§¢¥z¹Ò _RÒâ_2àh%»Ÿ´ ¦™„°u)ü gnr`¼DCÕ ßŽ>š@Öw¢ŠEr")÷¡/@NÃ$ð¸þÞø¼å®³¬e-Eúßy?ú~Q$ ÙÑîÓqf'žY¹æGÝéMy·eXCäÍ™ø4hÑ œb g¥]ÇëÞöH[CÕ™d.³Ç8VT†; ]Îà€‚ŠRÄ\Ù¼ý±5^÷PÅæ8ãæ3qR¤ñ†´$=‡°“À¶}ºÖE‹±À ²fGxÐÕv Î5W2[¶´s™‘ÍÌÒòPÀ瑟÷-ÕʱCŸ—Ì?¥¦óu4]±bPñºoÇU,$£Òÿ›ç#nØUÆÖå‡HÏic¦g½–¾Ìæ÷¬ŠŽ±¥¶{åëg’hà2깨–í<šɾ´¸U¯c Gÿ÷Dvùx¦ŸA”™ln´ÀÇØHt’›ÌÎPô ÀÔ¸1*[[Œ¸u®ìg{ÏÍÞÄHÏ`•Ü6 ˜ô|†^gÜž¥ ¾?ì§=\™"NŸþÀ÷ýçË]gYËZŠô¿ó:{ÿ×ýO>à¼YZA!¹Èæ¶nfl²vmt›˜ìÌÔéËÍ:_€gžÞu5`{­*ÄU cA%Äí¼G¦cV­EÉF¨Y±ÑëÌñµïYãg»\pñ¼Cäq×ág{c^uÚ"œËíz\ß;#A5ÁRñBí4fÅØào³ñœÅ]ºŽ3L?{}›‰³¸ˆf6ò5‹Z1GåœÚ:qÎøÑŒ@«SÓ3;ž/’¤8«µ %HÔ(ì[’ʘF»è–÷œKï”Í\}¾´×M„@Ç ö\pª.cÓ WÚuV¬’P¾õ½ºr… Ç™V*…šö”}%’e²â¥STÆ~iúÕRRݽ+ZL³!àæ"]!šâíôù¨ä¤I߃ç|¿ò¼M£Bã}§ãaNw(´ËuZ„]Q©™m"?¯…ßá.zlý1®?øúÅ"tYËZŠô¿ÛÊÓsØ>õø½²Ö¢›XÈf]ÖAªc±ŽER[*]#Ü ^=0ò•vZœ~öàƒÏnPÅáxÕÁ‰G.S©ïsRÍlj8¶¥ÆŒÎµ`ÓOÝìñÎÇ=ö]Ƶ[{&#•TZz"èÍ<_(¼í{Âɑѕ;²‚Kƒ~ ;ûšpÆhiPÅÈ`3¸»µæücf'ìæ02–ÒÆi[Ç·šAês;PC8.;Χ¶QòG|NÛCPÃ.•Q“¹Í’ýZ aÁÊ…³Û:Ë ®¶Aë´ã¾_›µO„ž­‹†c3ußFjŽ<¤RמfÜ"5‚Á{QH;w¹r–ÝkÇkhH­zj'š˜9J!áÌŠ/¤}&Êž›FžÅÝ|Ï‘A } ¸IàÆ)‰^š‘5õ½n(&úÎ ýÆ}ÐËôCÉÖ€¿œ?qoKFYÖ²–µéŸg]ÿз}i°®—1ŒæU)ã© ¬È²šÙaæ ‹1f]hµ®|Ò4¤óøÉç·WŽÆ4a;fu¾ÂAe¤Ð9 3 pÔ LYÙ;w(xç‡VØUàú°ßÒtO}2³€ÃЈQó–À„Ö-×L}nߺçRX@­«î[w[Ê f¦}gg,j{œ…w¬\ ÌL;X<`ˆ5Ã@,6hP{I­¸cš}¤ÆÊ6‚Ù<äÄdCB¸v“Å ªy5×5·Œåƒ“˜mmͿ̺rJÄêÐ.{XŒEÍl7;Mjç9C7@:+ð×ò0YœÛáL»ø‰›·<û ¹ÐÍ—En†žä³ÀÍAh׫øYÀˆ‘I(Ô4%¹%n<‚AçP)&=ŽÀÍ“m`"ÚPœóØ>GA€©ŒÈÁ!ÈëÎc[›ïÿ¾_³Ü}–µ¬¥Hÿ?®í¿å5ÒátuLÈz¥7+ „ I 3ËÅ)Ñî‘ ØÊÂQŒ=o‚í³JiÖ=ðØ àágÖˆâ!¥b?¹(«+×§`LªÿqìÈŠ\-ZxcìbÅ£Ïöxäy„ˆ›Ïzk2s´kÌ¢†¦#E•yvMæë}耧Ù&Å$XÆNšÁÒ–ât(º £€ùR)k–•lÿIy‡ÿ·Çö8؆֤r²ºcÁ⬹aµŒ,Í»èŽùsSëfF DšÝatéé—>ëKúã#Ó·‚YlRj¸¡É 3)f/jîbdWgëàƒ:M•P'[À†ÓÑJM×^-ÄuÐÍ]¿¢‹ ¼°c΢Ns5+—¢Øx†Œí\H²‹ s²¾ÙÝös‘„3ò¤EX(í«Ì7ëQG6~r.:`·£ô0©1JÇ׫®Q bÖÝq×âuÄ^NŸï[_¹Ü}–µ¬¥Hÿ¼«T`ÿä[_NT‡ÚEF ²•L})+™¿=#:Ÿó”š„¢ÏEoÌcb‡€·_½¾ÂåµÀ‡1W”*ôNÎN‹6·¢ w*•l]½\N*¦œ ¡bÈ‚w<"X]™°›²jw;ºŽù!XaWÚvf“î°°åï…sfonVš†e–™VT“FþŸÒ3±.ÜÈRF(£ÍôɇïY±Ú7]µ°XY˜ÉÁm œ=Ûß“²• ÎuF}fÎô:ãÙ üÄã© 1klLì@£‘‘6°ÖñV§]ìhId^}±½ÅUF-RÕÞßžÇÇ4´’”ž ¯€hAŸÎxþHÔ«ì>­k/ܨL4Ñn’Àe3ùSiîeó4²l±š&Áãu?襥¹·…¨…[,;}6¯dm—ª#!dƲ`sE=Ç=˜]ôù=7_#•€²+ÑÃû5®}軿|¹-kYK‘þù¡î‡_w_Ù6sñ9Àk÷aäžÌ¾~àÉ/,Þ´²B†0¨—-ÀÙ¼÷³A0Ö aY‹Óî…lZ9@¿ž©F©Tý^PEoÆ­¾ÿ±Nµ¹pqAïî¬7f°( è>‘°XØòÐl2ÁάÖ,Üifgžy*¡_ÓAËl–¯ù‰tÚÊaø)ËhYËZŠôÏ»†§þ¯ß×]Âi8"D8(aHDã"Ó¯„Ò¬ši j5†3>KŠAoœÎk@B úçÆ9ðÁ玕õê2öS†!a«¼@|°šd0EõzL(p(pdnyŸqõù®>'ˆ¢Ý£Ô‘hÇ ‡àéŒÊ BÑÓØ3‘sDéX¨êì“bÌìY÷ð¹-bR”´d+C+àI¼›k¤§_B7ØÛÌôжy{!L,žÿ.,–Aâšc–½VÍ,ªÌḭ̂…R·È´)t$_ÑjÕ1z2Ζˆè¶+çÏVdÇ¡EPf¯™ÕyR†}†¾—ÉÓ—…:n'ÜØÕٹㆱð{´Ÿ í=‚›8q@ÏLjOÏs‹ÇL#uÛD5L#^³Ï0cþ—‰ìðÊŽ^´ öÀ±oÞ㥼P²ž«5\£d``ÖvaWï+ü ×ÐÝq..¦pþØ›îYîBËZÖR¤ÿoW½þãÿi$ÜW²Î …¡Ð ŽŒ£ÍôC–¤7K_µƒ¼±'F(ºðÁ§[çk/躂)eT‹BÔA‹í·÷¥ŒÃ€\+|Œd”R‘KÁfå°w=QÔG<;ê|=»cLom3Ø`D\s–ºQ¨R óóC$%‰TŽ]x•fzrè~Kët_ ËeÑt¢&Zg]R;×ÞdU`Ñ56wÕ¢â(‡2ˆÚI v¨Â÷ÄÙs.j:bËÓ…k¸ !lÔP Os€3Mô˜ˆ’UD¯›3öžû‰ÊN˜n\¡kî8è=Ó<&Zì ó¢yYsãa¯=27”"€³å¡‰ ªSxybG^h.c?3yHv»F 4D'еx²ÆYäÁP u"FeK® ©‡9 7œW ‡548}Å0’Dâ^/m*(¨ã t§·~ãç,w¡e-k)Ò?ç*öû÷½¼2ÉÆÔVTñ2;Hnœý aMz$ûÛôçÆ}ÓãVßM„øéð•9‚ ‘ " ±¥ku= 9ß·7;Æüá]Ô‚Siä9sv«|â\oò´i§ç6J‡XVaƒiv¼ÜŠ—µ¬¥Hÿœkÿüû^:œN·‘šìŠšVGM«£Dã#0ìµK BH•x%´ŒN²!·ß ÜqÛ öã„>:xÑàŒCW<¶ç#®\îðÿò‡ðš?óõøœâ¹¾ûݼ6óè”Ó ¸68\LÀj£Å/PŠ“Þ0+#+¡DíÔRi]Ì­Õw»ËzcŒ—xÃFÓûÚ‚ 2C?ÓŽ³áÜ:# ¥ ¾FJ…ÖÍÉ«€7_ûDêUžèõ,'-lÂHlÂðlYÐ) 2Áƒ§çwi$8¡Á ÀÂŽÙœ<²(BîWœÏW=7¬é¦‹”tMUÂð¬ûÉæö,Ø8HøÚ7r—#Ù® ±Ñ½rÁóQ´›¯T„Jfzjó\Ïbì&%椯){óò r¦íìq;–iú¶ùò=ø!Ðkã ×ƒÉY$Ä¡£ñɨÇ¡È@µkJßoû¢f&‚æÃlü}VöM×P™iÒÍdšço¡zÁýôg/·ãe-ëß^ŸÐ3é\šn\ñ«æú”ö$ËÖR„Î[ R·")f£D›qj†56-m Ü™¡Ä¡Oº¼Å«x1^zϽH“C©â3B ðNà\Åf}ŒÕj¿ZABŠ ¸€Zâ– 8ï¢G!e\œá7ýêcwú³vC³Ë2¡yªR®ƒ³ÞÌÑIepK¤_|½Ž§E:ãS¿Øœóg»®”Ú9ƃF&´ÞÂpÌ\ÕrQfzà|I%ný‘~~RiÌx7é9¶¼é‰³i“ÒeŽ’RúºEì dýJ®-wäe-k)Òm9…!)²›’dÚO&¬BrU°Ùgn󿑬cs)+œ{Z F`뀸¾Œ_÷ŸŒOºíÃÅ™YÅ+’ËðÞÃG ^jvpâá|3¢rÆÙň¼ßã«¿â³ðŠÿâOw|¡ÂöA;z+”Zhʨ7x÷¶l$Âöö~¦svÓLU²¤*©t+ó-;ÛL¾‹´O”uqæÃmšÛ¼oERóN·Ðò£åP[ÏrƒzÝŠæ0ISfËIØÔ*¡óaþ:X«Ž¼¤™Cšoä:ìy®Ô²¡ê´ÃAû½ßékXìcI„§ÙÝ{Üêf› ç€Þ’Ê m@9¿€á\á`XêÔZ;òŽa&É5àxƒ>G78$åYЈŒé) ˜×cM¦ç–¶YÊP™™Tnò’^ïÄ „cõþœìyÇÏ{ÐÔ5¡··gR¸Ê#]Ç„r°2é¸!Uà¸øðÛïe-k)Ò³NzÚÖ #¢]´ ÕaH#®ßº@¹8ÇøÍ/ÇŸû3_ `ƒñzEí8ƒ$7³«Œœ';êˆá´³Ç?f§Õ•+ôœw¡eF‹nX‚¹Œù‹'F\Ú® QUEáY˜lG¼^FæW‡¦?·,èR•à ¦‡þ\".ôt$Ûëy/”qïHªf) WF¢vÝj ô´˜Tí±{&xy¾^¡¿y‹+!ð±4w¡ƒZ"ÔÐeý# 7q¹*Œž£¸4ܤKÝ`1”åfL«(+üÏkh\è±Vúp~Á‰œd&±uAÉw%Óœ&ô±'¡6Ö¹8úØwDgr í pFˆcÊÚ4)jã}+Ø.RÿÍÍ Š‡`‚;Âéöé‡XnÉËZÖ ×'4q,;eeK3ipbÖ$µM¤1Ū'›•0±A¦/”LjÓÂ’½)»µÎ$ÃÅu|Òª‡»|¾ä ¿Ã~ËOàæv¿ŠˆÒ£ vûa<¤k‰ïàjFAÅ~J8?»…»6‚ßóŸ¿ ¿ÿ«~7Ö/µÖ°‹ŸU¯n$6³Í„èqDƒz+ óÀ¨Ý?ì¤mp0ý³Á¦…ùÊœÇAI¸™‘Ò\É\e÷ʺrsT7”„o{e¨ç½®7_o’ß<°ºð9˜_œ3[Ž{å4YT!KÚ%zkd7'Ê©¬ø@¿çW„ÚSã%d¨DêÆ¸~¶Âµ3'olkÁ±8%‘÷ëÜuÛ„Ë]ÅfU•!Í”°”8{&”˜äe¬t3[ Æ3ˆ³P—Òò° –´,% ¢› OmºeÏQ!HÒ!ƒÐ'nRS¢CµÝ9é†ÄUf]³KGÕ®¥œE²ÏÁÏéø³nT—µ›ÀöÚû^¾Ü’—µ¬¥H·7߯¡‰Å,L”ÿ -c8{ù•J³ Ð-Jfq…®ISÒHsˆ ¡à΀U†¾]wO¾ÿ>üŽ/ýb?àoýœíFLÕnB¬=œäœ., ÃT°ÝaŠÏþäûð_üëð•¿ýKqåS ° ž…Üùb-tЛ}JÌæ¶c‡o2#Û‰Xš‘é¢ÿ} jY± µc™X¬3GЕç‹:ãÐ+´<ÝjLnge!ñàs±Vh®²p†2õÍN“½Âªu°æ­žbÓý Óɦ} ß•F-L³ª4$)E ;¤ö4s‰ ´¿£´+¼ŒV:΃c‹¯<ÛyŒ ¸y8»îñÁÁg¼tûïJpuBÙé±L¬:ÊYè@}&Dïù[›)¡rÏmÏÑ“Ú$ëÿtvsd²ƒ†3NÚ¦Ìdw:ç25÷”BähzbÆ=eiŸ!q­ky‚fJc~ìuVްþàdÂj L×>]nÉËZÖR¤ç€7ÊZ q¡Ç¶±˜«Én8£ƒú+8ÌE+ç–&m*ÌF®æÚ%íçÆÁ#”-j=Çå­pk¼‚êîÅç¿ú>¼ì%wàÁ<Œ÷à1¤i‡³‹çqãl‡£Õ^ü¢+8½÷>|Î+À§<ðËqt×ýÀú^Ô£¢Î¸(‚²ûYÈN‹Z!Ü[ ™‡K¼‰ÍîtéÆ?¦A .Š‘º,/šÁ!ð|ŒÁÃ)‰fЬ¶›]¯loG·ª4‘ìg¡ìM#ÜõV-¸Ãº³CÂÏs-Äý¥v …’Z9ÿì4¸BëÜ„Tn` Ê÷œCÑ9ºP24îÉÒ¯Š¤ôÇúÚO=qõ‘n¦ŠÇηxüðì®Ã6ìöCõè‚Ãvö 8ê;lbKw_NØ_LxnŸðøyÁgÿ2Á§¼ä6¼øäœÏ&½œB3œºç&…¤=/ü,ñ:¹‘Îj„ÄKºË@½ÐsbK+µI eÓ Q ‰\iGö|G¤‚c‹Ž ¿9ÝÆ’e’g†Ì0w:PÊ—Ij=Ú½ÉÂVêÈ6%ÍÖ@Ái{¾xx/kYK‘ž½y¹ŒÞR”&í”ú¨¬gÇ~a`A!¬‡7nÊŒÒÄù3kÎíb:“†[Àê€ì×èC…Ÿƒ g¸ãž»q3ßÀöÚóøôOýøåŸú©xìч±ßža·wÈCÖ^v÷wÝ{ŠÐ¯±¹í.] »„®+ZYÆÇ€îe€tê•L¬ÀNÉ ˆ¡ˆdü®Hh²ç|×S‚ÄùtôÆŽI5ÑÊœ6Æ·s Î,Eaõ4êyÉ£ôhp±Í–}“}Áfã ÀŽè„…Œ áú®Í4½hWWwìÐ\Û,T­LG³ê-;Ç•¤eóÓ*Àxƒ8¯¡KÀÈÍDŒz}cTDäñ«k\½ñØnÂÃ×>t­Ã“çœû\Õ@E j©¨µ ÁùNpsïP p+w¨¥Ç]›Œ|6"M#Î÷Ãýwà“îîàÃó¨~§^ÔEOƒ"ќÄñ§[-|5r„ õÓ–ç5(„|#ue²µýŠr-š¸äÒ~&›tÏ\ç‘¡ÿ8gÓ¾â€Ms1sŽŒrQd©:5”©$¾ºôºÉèùyªÇpŸ}Xº»î/Ë­yYËZŠ4Üj­óZÚ‚]“¬”·ú¸x»J’Ò9;=v;ㇾÐΊ;px:Wmõ%`ºë pq±‡“5úR.Þw©¢Ï=îÀ>ßÀ/_ßïï‡sïÐ9Á”¶ˆ'— G·ã¨ ð8Y9äᦀýÀ˜÷Ï(¬k … i¢ñÂ,€Â¬8“2ÔYׇ¢.dRoYIœnh ÉN®g€‰GÊÀ’BÇqÝìF'z{WʖšPj¡g7ݼâFÚsÍ ‡È8J‹Ò´÷['Zš„`^Œ%BS3w©I Fjr%È  ¬ùz±9 Ut8#Å9ÊœÀ¢í,þÔõ€Ÿ¾õ"¼åÃÇxÃ{ŸÇùXÐ… `„wE%rΡ¦r`® ³13€X)g8'Qꀳ1 #`¯àù[7W`}û¯ÂåðɘÊ{CAÙ1ž’çzÊä ô³ëh ƒBÁ4úÜ`ú¬Ãsælö¢D2rÖ.ÙÜ;³}:EC ¢äX˜o}àg'š¬Ð+<8rˆÄ: ?Þ`š©Æèõƒn,ü²S›ÍqV±…„€&‡WçŸÞóÜ ~â¡Ëx뇞ÇG¬¼S8²àrª+Üœ+‡¤Œs›—;ÑóírvSÁ0ñÄÃ…üìûnâž+ïÇg¼ì>¬Â¯‚È[7 A•þÜÒB7Ê,¥Lì^»CΈz3 ÃÎs6~h£o¬˜m¾¤Yå&£y×6D¥ò:úfa* +‘ ÂÉ“¸hh†k³D®FOæ®—: ^,sée-ë5êþ ¸û?T ¡‚êi»®ÅNz²ÕNaÊœA‹êK±g@‚A‚$H¡Ó›†º!„x‚ãèQ/¶X]¾a³¯SZa/Ç8:öXw¨Ý‹äEˆE°ò‚*†õKà±;5v—€=!¦Šñ‰ŸB>×›sudr3õ¨ÐULÖZ8KiÄ6ëþÊÌ#¥\<Ì¿&¹a—]÷8mõ»‘üÝ–s¡št¿xÆSæQgΨ*c²Yáu3ýtt„sð¡«\ñúG(¥2&{O§2áÆ®˜uj§#“ϻѠ¨vm]ÇÀð8ýpiÉÈÑšôq5*éÌû}n>þÁ—-·åe-k)Ò‡Õ…{žòé-lCZtážP©1¶%j^s¡E%;¶&šP͆oò“*Ò-t÷}pôR¸ýÃÈéCŒ¨èý9Nü®Ž8>Ž•ÀoFlÝø>`µÚAp š¦àïQËl.õêsoÑÎn¥sÛH‡­B†°ß°{Þ2õ)´»…ÊÌîÓ¬+a¡Æ~/3 õ '8ø}'ÆJlÁ$€B¢­ˆƒ2·:Ò¯š¯_ŒdVZ˜‡°°–}ƒ¢‘›Æ4ÏpvÎízQ^A?lZozê}§žƒj²!&[}x{¾óm+üôÕ„T3¢WX©-E,çïEÍHjA)¹T…¸k†sÀ~Lð"Ç„ä ¼wˆØ—‚ýàâ|2ãê×°9:Ap§º)¡wy!dZ€ÖÀØÑì®éû´o±ÈKn˜»h$ãÈ£€Wv%˜%Æ€”d¬IµÍæcŸØÑcb!÷ èn"JÏ.~.èŸÊã*A? BëÝ>C¶gïü•ËmyYËZŠtÃû/ùbÌ_ íæH°™“˜„]X©„oYÔMŽ"dÒV²r}äœ0ëM?lpÇ—¿ìwpýyôÓM¥>¯; &ø²En`##Š;¸ºS¿·:F¬{È´#sm€„ à@…«kð„êe6”NÑUj|ë좛Cgˆ°²07Úœ½Ìã[X¬' y Œ\F’ÅÈܵîÊb-ËØ^¦½-LÞrµ‰mÎ 4:Î=í˜Ù–¡uß2)š!]ãxÃÇè¦fK¹Y :!4KsŽÌùýú¼N·áGŸøxäÚ„à‹ÎZáÔ¤V¤ZákQßìRщ`ÊE}ÅÇŒ[g瘆Ø3ƒ2cx¦$‡„\3†¢Œð}Þà­áé[²¹„¼¾ItdÑm¸YI~+€ßÍ6ŒÜ"µ÷‹ ×¿wŠøXThác|OÞ#“¼ %7IÕܧìI@ƒj¤ ©èy½„sæ•\Y’Bã®´×püÝòü\Ö-0ݤ›7„¾d<[àîe-k)Ò³"}Û«_kñ|ÙÈ0,RÞÍ ½™%j>h~y“CœÙH2c÷0ÞL:ïvîÇÜ lîÃÖ¨áj7a½ѹ#”ÚAü¡Ë. /GGI»—}A.¹ëáº#À]Qü}ÿ4àÞó÷};¦3ÝPÄN‰c…aÓVFV,–¥Ó’¹Aag4Þlðt-tU LVªÍž…ÍXD¢ÞÐ ô\™D§ú|ÑæÅ¡úDÓãM¦.Q.D\™h.à Sxf„²o¬ö­Ó·Ú±äDkv›É5äÄy`àVÞüèø±·Ûa‡M/¨pRT®@ÉAA •ïóósŒ»-^tÛe¸œ‘óžÄ²j¨°v½R$À{Pú´Þ¬ðÈ3~àiä òRtôPZÄ$@>hrÂ@ ™ùýw&ÿ`’6‚¨$ –Â`è|Zäß¾ä¬þî¡c6ÓZ­Ž*ÉkÞñ³âfä0f^Ã7;`ÝëëN$•• HŒà–µ¬¥HÏàîËŸõ–TyCg‡†Q»€‰éOu`’T¢ƒ“è Ô™†Žù¹ì\cT§NÇ4&ÇîÁ¡å¤IŸ|ü¸ƒÛoáýuPÓ Ž/ð¡À7Q!!C*£¶<™BÓu`ÿpã†koƒë€þ2‰nìZÓMÎ4»âeœI† .¸!1›P ް£hÉF”¡2ÇÓž"Zª–-!iÆ[ÖÊÂjò0¯7{GRX¦tHfd$‹›ÌiVp†ΰ}§Åµc‘D¦3™ÃYNÀ°×ÍJºEX<1¿Úà_ÑÍÁsî³ñž§oÇÕ§ž„¸²ãªj®È¼®š‹,È®¢Vàì|‹’*^óšß‡oü¶×â¿ù Óè¦óðzЀ ®û}B)ïzìÿÿìýw¼mÙU߉~gXkípÒuoÅSÊB"Š Â » N` Ït¿¶±?m·»ÍsÀÏm?»Ýí~~8a M›‡ILI$ƒ!D©$U]•*Ý|OÚ{¯µfè?Ƙ{­{T²eŒ‰=ëSŸ›ÎÙ{Ÿ½×šcŽßø…>póÎ)Ì0Íe‚ók”ÂõƒQN¯³ykÁ®†Ùq Rø’²ö½“Ÿ1—j€½mÖǨ”»P$S(J¤#†…ý_b&}Ô)èg´qÒY‡†u5Vžƒzðs­|ŽÆ ¼Hݲkè{›my³6kS¤×ËÕ—ŸM–+9 ³P£†I½Œ3:s­Á)ÌÝFX­†X o´whU/­sº\A»÷yìYyÞéË>šsýçÁlƒ™0Ùš`mCÐ%L=…öæð˜ˆñhÀ–¿ Ëw}Ëg~‘î$Qï±NæJ­ âõŽáâv`üò6C÷[2Wv 4Q!ÒÐ 3[´K%KGí+)ú¡ÕïWG±¬ÙÈ¥0£ÐæþÖÇN‹áÐVÃk‹ÌŒM ÏXÈÆî‹ûVa{©JRXW-ÏE×»›¯·¬rõ¯ô…¸$ì±»Ì{>Š_ôÝD2ÖÉ ÆA2Ö²5´J)Ñ­"Ë“c]ä¥/~_ñg¾ž¿ôy|Ö—þiΜ!ËU ¦ÍDb“œ~¬5Ä”ˆ$º1;²I\»}HrçDaЇ5Bj)x®×„.…¿+u„3Võëz«Õ>=TÚ Úë¤óf?ÀRߎ(³úÂö_æôúHFKÆ8=3›rÀ[ßGŠ`›P¹–­T¦¨¤Åâ‡YáÂÓ÷n¶åÍÚ¬M‘:é3÷uÖLW݉tY!l*Éðµ:›vI‰ÐšiX•),l”DV’’’cüÔ!Åú‰'ÞöÝß)ág>îûRÂò×áà§È'·0]OÓÜfRœOds€­Ïaj5Ìná8ÀÑX=æyñã,®|+M%^Õ%©¨¤påV‰B(ãW¥7¡UÙ”2¿)ÞÎf`;ænV÷0¯ÞÍQfW,'7Í B6 …[M`r¯³eµ&MzHðsÖšëuZD¥´xiY$@}T2Øj”™œÕ23 ä1§óÚhX‡d´K šÐÎüx ·ªOáÇåI~ó½2kjL6B¾b¿[)&b2ä>‘ºù‘/çžÝsœ=žzo‡îä€wýê/sr|ï³ÉŒ­í© bÆ{Kˆ¦©˜6øš›Œqä†49O]? ×Q±ëT'¢®hŽV–RdvÚk}¾Záe«°?êQ®¹Ñv"±’ ©³Î¥{ɔhTŠª]z¥Ý·kä €¹‰rðzoX…¼ûv¸'Ѓ«WKÒrTõ„Ô›ÛØfmÖ¦HËT3üÖ‹ÉÙ és‰E,®bº±£]¥™ºêÞÕÞÍ”” íµ0©4Æ>óëL~íK9zóŸ–ç~èóðçÞ@¸þ.Ò»þ)Ü~+y¹‚åfñfqÓ݆Óâ6´×aù À°ýÉäåËë3 ÔçÒZ‰k4…®RŒœé·‡CGÙ$‹SUB‘í¸*g†vaf— Œ¨c;ΙÖNÏ8ñÂNAÈGÅà¢Ì³S«Ï¥&)Ö«ÜG}´Xý}RÖti¬“Ï"í¶²‰;e!ÇVÂ*""¯ÃªÞ×ë\WC%–`f—X¸ûyËoü’R¿Á9i-i-‡ÊˆYIŒ[Ç'|Á½žÿñù'üÙoüVïÿç¿ø6~àßÄ¿üû ™63VÝŠÛ‡4ΉζlyøoøJö?âc9Jïf¹<â›þæ_çÌ´¡‹³Ù ç*Bñ®&Ù$Š€”°Æá#ŽI:öiã© $S‘üy"ú \Kåå3ê‡M¦Ìò‘÷§/ìnF?Ÿ:a$¸cªv°…·½|}åPW•^+qp<ëLfÊÜ.‰fZµêŒ<¶êuß«üK•¨¨MD•z¥—ÏÆO¡_­0Ö¦°<¡Úžm6¦ÍÚ¬M‘–5=sîVwKæ·eUBdÔi‰[/×.JØKÜ+AÑ£´”{Ã+Tê¼g'r ¬k=´f¹üLñ!0p¢ºùÊ]¢wÏJÖ&ç7Ófm›™4ó{?ý§Œu_­ß;z‡\¥2 $ð•F%jq.¡‡¦‰Šé¶±ÑWRàƒ…­=8sÂÉOþÐWrã‡^J÷¶DxôŸÁâípéÕðàË =KHoåð໹ýÄ?cuí° wºZ ®Sö¬Q ÈßUs}~µ‘ 'J°Rx³ÄrDG¬g ãºÖMmEA¡æº“Á»V÷(ô0³Ž”Tø9§ÖÒ•ç(lé¼²J§J'OtÎÆÂá³:oGt·N‡¬&(¤Û !FÐJ:×0 «~ëÝNP7gÙyè!ØqéÞħ¼öeb¯{¬MÒá*b½³˜©d0ïk&³96övÎÐø cÆZŒq8Sc½ÃÖk-ÞV$,ÞWÄ”©¼ÃºŒ1 ·Ž–»Íôr&uÇ„•ïÄߨLå±f%ïYå·^ç‰ ë01¬”‰>“?ÇÅÐ1Ã@3:Û +%üÔÚ™él>÷ƒ#*ÁÁ#Ûi†sйhR˜œñDµ·Ymq!›ÿ]GE=åå0.H:ãŸL%¶#Ý Q¦1u‡á1RÉCF>ƒv探 ÅÈ$ czq.¼è£©'àÙ÷ÒÃ'~Ì«yå¿û)}öÕîUe1d¬± Ö0.‹Mh"˜w ƒÍž„˜4Ø"aLÆf3 ã &%’V¿œ¥èG\¿½¤?n1«Äö¤a~&o×,bEe„gœ" J¨‹Šòx¯ò8ÀÍõ £´µÎŒbBûA·\bWsdíZG¥cÍÕŽúYù4¤ á©—ÏÔèg岌ÑK ¥ûW/ñ¬ö®ÅzÖEHv…9¬sÉ®O‹›µY›µ9±Õäy —« X«tt²)Z…mtˆÂJ ½|]Èöl\ê(Zƒ:r??(1+£Ù4 nÁÙû„¶}fç¡ÊG¤›Çp“(Œ³?œ0X3{еc쥈ۢ‡V"×zfnŠTb—©‡ÈÐ’•ŠŸ·vè~k|}´÷‹'²µŠf £Ý~ òZJ$hÒN/% ŽXd#TvDÒM^7õÂä6ÊO«W)s8kZYVÞµø³Û¬Úk5W9·7çò‹? ßÔ,‰ÅÑ„ç?ð"¾âó>ƒóó «6`Œ¢—ËXk±Þ“SÆQá}Me+ÕR;¬«ð•§žTd—ñµ£©=Ö‰6,¡A[ ©‹„”h¼Çõ=ŸKü¥/ŸðQ¯$W{„vE› [/Œh7 F±’úÕ$…»Õã›â£^)Ì]<ÊÕ…®û¬J´ÒJßc+xPt(¶Ð¶òX¦’¢Í>w^#3«!‘‹ò‘:••k3 ¦&FçßåP˜ ê¢þu›˜»:ú­ k³6kÓIN*MƒŸ¿ø‘îð±Àtc/c7Q÷.íÀÅÃûÕ^©ÕäÈ+;¨}èx•,`_ áAAe2V=Ž+Ë•v¥~™©Ge„ÇaŽ[% )“>*P:s Ä(ÉbÅ`&´Pt¢Ä¦±CZRþ€“÷®Ws§ójÐKu3ë;)H{çö‰^ÆÂW´í ÝÂSmY>íS?“GŸ¸Æ÷½ùMœ¬ ¾ª©Å©”ÑxyÿLç„T– Ñ&)lY 19“Ék¨"+i¡QÂTüç¶'¸þˆ/ü¤çK¿à#YÜþM:sÄtú7¨*»Ft’ý¾œ.õðNÞã^ÓÃÐ.:¥ x-àaQ}µU[T4ÖRÌb«Q­Ž!c•ÆfE$ŒªJ\©W#œ^ù6Êã´­ê* q)PÒâ:ÔQÆ×l˜Ý›µY›"}úØ»ï鼺"0ö¶6eç⨤óW¯ºÜ²÷²’µcp%ÞQ%Pë®Â P°+‘~A¿FåFý‰ü}T8×TRÈ+dsó / –0N BªaÆçjeàja´ê´³õvjgj‡"hëÁ¾ÓØ!“:×ò=e¾M”לô ’Õ›b­ÊЧÂÖν̼éR“+NcÅÌÄ P»P+Ä8§?G(ð·vÞVI`®†îpGd Ï å:+ó{oaëžÏ$Ü>$zG¶‘l"Ý¢æâÙs|Ñg}*Ç‹[üì[““Õ7I’%-–6„õp×Z1rQ䜩l"c0T˜”‰9ѧ€Í0­<—Ïcg2ƒp̧}ê'ð¹àó™Úëï éðÓÌήcµêˆInµèÞmÃÚÚ³[Bݰvi³ê›];轨ô³©¬fMk¡ôÊ®.ÉXFÙõNÙÝÉÉ5—ƒ¢(;¾$†¹¨´5—…8æ”Ø©º!¶CthÕ(ÓÛ*ùÏ5„d˜Ì}ð“MÆÆfmÖ¦HŸî¦Ýþã9¾ßœ£;¹‰k¤«-ÒN GÉI—zé zí$ê9¬¥Ön01ªaÎZxlÐÀ{sØiǮи³CAñ…¸¥iP¢”­t®¨ ò ›nP7'[ò…û¡`âTÃÝj1Ÿiƒg†ÃAÖçLYºtW Ò§¤Ý8 5[I‘0y`ë&¾,ÑŠtCŒ"Z¬vfIkœ)ЪñÎ*?ÒŸ±Ñ¹T¤@»ü¬¹ÝTJÔÓ÷¼ÙU··nÐë:/#Œ.j!Ù¹ŸÉvCUÝÆú=Nº9¶Šôn )ñ²—¾”ÿ¦ûÜÝý ~å7áÚaË2FÚÔ3LY…Œ3g¬ÐäC6Æ‘r ðJD¬?mÊT9sß¹mÎoO¹tñîy€—=|×~ô˸së]8w•3»÷‚£=>¢ê—ôý±¬tŽl’¦WubZìN‘$*“ÕYÍa åT0à)lÿ(ï[­ÝwÔCY2°ê¤³öê$—¢nŒJ©ÒMûZ>¯‡ˆrm»™šÊ(ÿÂÆAöeô`` ñ2AßgBÊXwáÆf7Ú¬ÍÚé÷[Û¼òmË'¦ÞÅÄ›ëûlÔ•ªÌOͽHÙp¬2—µ‹Žšmì´[ŒVàTOmÊÙ DéÕc9ee†+¬œ{ad;¯0²Ê RÂ0¢v8Y½µ}5˜P‚#´Ð§¨ój…š×D0EÆŽbåg-0ÙX‰òÚº• ~M…lø›Òõ+4nv\J$J½HVòøÝhæÚýjwF5@ç)È€5ÒÉw«Q¼"®ïÔm«|¯Ñ@ëÔS‰eõÖ«pó=b}žŽ-0+rH؉9“,¼ôU/`{ÏóÀ¥K¼ç½OòÎÇÞËSGTÎR¥H4‘H$Fƒ3ž¡[bmÅN]rÄùȤò\:{–½­Îì5Üsá,Ïîðš|纟*ϸ×Z\H¬:˲SûmúvI5yŸÄØLZ °¼=ŒÔFÕ” «•J&3¦fÕÕ\<èS?ËäUZ¨Ìù¨šçŒ2ÉŒ‚lÆ(¦–ˆJPDDŸ/éó­d=<Ä .ejúÓõàš ÆO7vc›µY›"ýþ«¾ðš·c]­Â‹rô¼)pÎZÊT¤BKw·8ÿ[ÉzÙH³uŠš5m¢°oSPØRçÁ•Ο[…›ÙZš»Ž‘ì£vÈ oÇ-[©ÖY_—o¤Ó A‰=º™f%»¥4t¢%3»@“VI<Å«nPGZµ;®Õ•«í£ÕN¹ºƒ{U1*É•}/lV⒕ͺ]Aµ£sïCíœ'ÚÅ·ªÿû‰lþµ&:õ =dD9è$?¤sùJPÅ8¸£†zûåsŽî$ÐÅC²“x•r"‰Ì—¶˜~Ì+yÙó_Ì üM{ö½œœXnß:àörA›2Ýrɤv$ 6×ììnq~g"ÖöœÙ:Ͻî°³{‘³[ç¸÷â”sÛ†½‹—IyŠÇL›BÅIˆØi"M!Yb{Œm³(T“œ æ0Ö«ÄÊ ‡£ùç1ŠDŠ­¢ Å ¼O`u´‘”…oÔ•­V:3ѱ„^Gµr²z†³©sTy5âXm'÷‚G x‰±Œa8¨U Do1u_ov£ÍÚ¬M‘~ÿ7bëÅ×ÜäÞ§þErÞûB Ó®8ˆp¢¬Â©Ížv‰‡ÃÆ„&D2«~Ú¶({NÐk`!‰!…§të9Ê|ÕÔƒ­fVÿèØIÑ.¶¥N.ìíÆ r›¤9Ù%bqí>¦™ÀE¾SØc6vR'©¢_.„²µžÚ (¶Òƒƒ’År±÷ÔùwJ~1’•M~÷¢Ž iMÓ˜’Ê߬—Ç©‘CCÒbƒ¼?DA>VšZ WI—Lg:®¨fžÅwŽ…{9õDq9ÑæšÖÍh\ÄÆ9eÎ_ØáÜ…{¸|ù /¿ý.¹võ&G‡ Ž+é:ÖL 'WWlííqa{ ¶f>÷lÍw¹tñη̷/ra–éBÇ Sª®6äÅ5jL'5ÁªyÃ2z|uKLWV‚78Æ¡ j­Z4”Œæ¢ßh ÖÀóXi²˜—âB¢+._I1­kéœØÜè¡Q•}ñ×yg$ ÃôrÆë£°Ì×׊Ž~ŠËZ­$ÈÝœÅ2°ý ›Ýh³6kS¤ßoÙz‡ùù‡kï¬>5µOaý¯$Ó´æÀÎ & !(9éX6¸ÊéÌ/)穸*i4½Ø‰š"?ê”y«ºjSË¿[•)ý€Œ’ ŒJe(ä,´Ó¨úcÖö VáPçE“mŠÝc ápÊÐ+:‚ò“nê9jL¢‘Ž;ká´Å $ }²1$Än5ŽÝYLJdeå×V££øÉ’ÂU ÷äÔêÒ ®Oò¾Æ¬ä`3h‰S’OÐÐ ’jþ³ /ĦC&óÛ´í6¹7$Ÿñ͉gla¶âÄÖPM˜ï6¼`ûBÌr…Y.Xuä'‹%)O¨ÝšÄ–›bÝš3›–˜8£Þò¸ªÆµOáݳ¼¤± t™îÄâë96ÌÈfVS&~—”g¤<¹ªFò³óJ~¶¬®^1ÊaÇꬿ¡PTR]aÌWzÍÍ«.×¥ÕC%sõd…¬­šÞDõþ®µÏU{¯°2ê¨&ò9;4«]Ðú<°ò{KÓxLw“íÏÿ÷›Ýh³6kS¤Ÿsåúµ¿˜N~ð«à,ï”M!ÞÏæa^k…ÃRDOªm† Ï ²•  v–‚™úXe´g`µ”Îxépj5䨴›µQºš¢y.¤1?Ñ„‘—làJ7n”u®ì\ëE’ctNžô P ô’f•ÝÐA§Ñü»šŒ méâµSlTŸW;<[ ò¨iVv0\IIC”üaõ¡Æjþp«ÙEN¥ö¬1jÒ˜Îô£Qw,…RM­¥ÁIýÌçæˆ‰]’MÄvÇT¹¦ó 1Aí2ÙXútÌ*[Œ?Ã$° ã·ö =ÂR³;Ÿ‘çS¶èðÙã.Æ7dB3™²<^PÛŠÔ\„|›ÐGBöt«LnÀÆë2U}"…®ºþíI…MK𠜹E4Ä$‡@§3ÿbÖR,a½Æ¬öŠzЫ…¼¢$FO|±W–¾Ư'’®ˆ„/芦ôÊòN^»eÄtÆ)tžÐ±E%€Ï"®äkŠô0GëÔª½Î ôÙ‘ûÀôÂóßµÙ‰6k³F äæ-ÖüžyK5[þ„5‘\= La-ÙúP£ÞÇF“—|‰lTiUd±—­8‰ùê™v™bvR\‹œÈ¨äÉ#cÒnÑdíBõÀÐ/ÅÉËhLhá+sk5©°Úá »‘k 2ªG¹&ž¥Ñì[ÙÃ¥ƒ·£¹|1,1Í` bõ`àKŽ´Âç03u +¹Ç*·²jëiý0.0AåTf)Ö¡¾:l­Ìt%ÖõÝ‘Ì0kOÊ”gy“þÖ#ä~Iw0¶Á±Âš%}oI­£JŽJ™èL[nɤ_b“§jj’Í`+ܤÆÏ ³ºÁ‡¥¦ï·˜ÖsêÜââDƒw¾?dZgle©­¥ÉŽ>!úЉëq³ûéûCÜ|Io‚¹Š­veŽ«(@Ðù|Ð÷ªg–ÕVQ”è—““îö¬ª…ªVižÊìª-µKEHšJÈ|M!Q–ëÀ©‡Žæv{†1KAVR$wÖ˘!+ Óêgo38cIItå®:¿awoÖfmŠô(ÒûŸö+a:[ئǒ¤¨Y y0Rè Z,ƒü9Æ!¶2öÀlˆn4ÚÕTäP:æ…YᾑM¬Wr”U p‘+Y7ÀÏ)Ðk=q‰5ʱXq†v`ltm·©âUì!×ϡݲqzè¨4Åk$û²*E+ì^_]D=½†f 09YIa½ ¬­îk%·;õq'…#*ÏMJÛ'k”-®fd$+ÙÕ#v¾ bÕº27KÜÑ{1y¥){,ŸÄÚ<1XLl -´)ÓÆæ63u opÉÒ÷ Ö,iüM*keîÞ­¨ÃVõ¦òD·Ã¼Ù£¶.·ä\al [ƒ½óUxÑTäɹ?ÂÇ8 ¿ƒ* Á®RÉšþ<µz”ç~ os¦2ª(öœÆ ©Ñ¡–¡^`ï¬c‚έ¿³C6y¥Ÿ;I¶Ñ"¬<ˆÐéás¡Œ{uG«§Ãó÷9_‰\«R¸€ÇÓTùÊÖõ+›h³6kS¤Ÿûͨ÷ˆ~ÿJ—'äP‰èx˜½«©ÎØ¢féÆ,¸×ùiA³‰8íF“âX¥nNÅÂÓô’Õ[•I%ïô'ÂP.3ß’‰lÕÖ³Ìq³’«Šå¢›ê&œ†®í°¢~mìXO¸bü¡vÖ´,«ÿG=˜X£³O«ºãfÈ ¦Èy´`ç(._˜~+íhÓàœVâ  9ÌY$hV sXÀÉÕáu¦^ç¤yx,4 Ë6*+Òk—ÃÏH‚>®8ìnáÎ‡î „«˜p‡Ø0›ž'››:ò*‘c»ÇÔïÐÔ™-‡ þ“sD2 ,mE°;8c¨¸N=$;e÷ y*“ Lh©ú®‰öhŽoP-ߊoö8YÜ¡«2¾>Kl[ÂñŠF™Ô9k…Ém -f¢(….§‡¬b"“Z%}¥á0W¤UhzšhW‹h¥ÝD:ââçz!­=øôŠdd=LÙF—¥ð[M!+f2) &>ë°kýªj c=Ætd_wÕ¹—^ÛìD›µY›"ýœË{}Ñ÷Ú‰#Ô[øÉY¢JŸL§³ç¤Ý±v ¾0²R˜òj°ú,ÐXIWW ?œ‘ïsÚ¥³Ò”ª8dY›<°š±Cönñì.àú9ŠF¸ÀÕ…õ­Îeä»áíÒmí˜|a™vµvÅNMNLI«¤@«3k¯ÎaÂæú†}/‚Ú|ZÍ鶪/^ÓÅ*´t×¶°žJŠØTÈwµ:ŸY«Ÿ Ç,]aÚ·*BP¡)Nµ¬js=ºý«“¸ùyÚOaN®Ó¸;X¶ÉÇ“0õ ¶ñT6Ò/°L!UDÓ“Â1¾½uÆg¦¦Ãg°&AµEO…‹ 2‡LÌ¡¼j¿Í®»ÃܾwðFêå“P¿;·US“ç3p'Ð__Gƒ —ƒajôð¢ã’¾•÷­¸Þõ'ÒùÒóâÐÊh&=äyQ'$ä@˜°âM98j ‡Ñytѹ;+d=˜ã4hÅ2Œ@²jݽzu›b»Ôë¼ïHz¨î?{ËÖÛ›h³6kS¤?ðª/¿îÍ!7?aŒÇù½µC’Q¯»˜´èúÁ—:%e5›IlÕ<#%é6BYбú¸ÅÊ1Ë|™ì–nz¥;Ô"¸–Gid`1A7Pã§±bïhÜLáËá QØÔ«ùÉjèp²º’e²¯-Mµ[7n°MÝ ®ÉI1º‰› üLgäIž«åR§ÍP´uz¨Œ­Y[¯æ¥êÀxwS©þ·°Æûѡɉ&¸$€}œZ Öêp““ö}ø­–K¸ó^Ìá|zÖÕÄ|†ÚY쪣ÊK¶šúÆ×$çñiI®3s,õr‰³ã26X¬ Ôx0 ›+¦Ù1 ‡ìØ|<Ƭ®pôÌ,~ó;q‹·°uß 8l7Ÿ8¤ÙÙ"Ŭ®cíâ±’ßœpìLß»(cç„im‘,ç¤!'®¸ Ù©iŽúkÛ‰êÍQMµrlV8\ßËRÐ3rL¦`š±Þˆ§|ì•wPò¦Ã  ‹Y>›u޹vðxåZäŽÚE¬éhš{ŸÞì@›µY›"ý]Û»ÏK“3¯y É‘ÒYœ{Pªy Ù^¡î ÝJÒÀ†¬$œ2Gõ:£s•sM³B S‘kµ£9±­ÒAbXbD³ìl½¾ž~ÐD£ÄŸ¢ÓvµjŒGr«¨vÈRì%t.]ºl7u`3aÇÁT…9£,¬ÊÍl=ئ&ôñr- ñ\â•E_Ù²æ®Åü®Ÿ- ºRR¬õÒ+Ì‹äyW¬¹ÁñÑmnݼAª{fÓ„k¿ˆ9|7&Þ„êOOŠ·‰9{‡@ÌÛ9ši޾kÉÙQÑA}6†”§¬ì9’58×c«%œM÷ÔOû~œ_°õ_ÆÑôcyûÛŸezy—g¤[ï¦?ú9XÊ5æP053Yi¨wûúÀ– /dÞ»ZHA40¹ËûÌTå4r´˜Ìå!äÒ«×¶A“µ´cÏ 3ÿäm úzâÕ/<öÒé•þÙºÏàÜYrßâNn³{ßgýøfÚ¬ÍÚéÿäš^þ¤Ÿ‰«§HaILèVµÌ];)®Q jaQW…½Úª›7Fe÷+)*¡USÁÔyH¢ZgÿÆ¡;/žÙáD;W?r–êÔqŠV+‘H¨»@çÕ\g™šo]"-S«sc}ެf…¨•Ô¥$]c ÜÅ{e™Ç~ðÐöNþܵ¬%\©¤WÕ*kÓç¢fËF7ýЪܨN”1>×ô/Õ’Çn„0D}}#-°«‡ ‡J‰z®†¼\a̳Ü9°Ü<ˆ˜ùyf{†~ñùöÏ1;y+•ë1v—œ*,><‹M·ðá– ªe J‡=ÖôLÝ“|‹&Eªt“ú½LýÓÄ“Çi¯þíµ·Ò¿ï{¨Íæ÷¾œ3÷u˜—þÞ}çšIÅÅ—ž'¯ÞEðïÉùP'×RÑË›$ïIC§,s!’™J]䂯b#×@ÊñÏ$eGsŸ5е*J‚âUï€ää=´óB2´IØß…Qn­ÀÛ^yQ„‘ÛÑwà·n“Ü!®iX-¸Rßóð•Íî³Y›u÷Ú褟cíÜ÷9?¶xçÿô6ì…W˜ÛÈRtF‘|&ó¹¬YÏVÀŒvÅ·xmƒi•tU ÂPXƒ®"m²í4³Îÿê!Ö¯d-§N‹’º²Ú-Ú™vß^^J4*Ps‘EE5$¡ÒÃÇR¡ÍjÈ”ÎÛ)úÚÖ`•ée®¯í!&ï;é~´âë„&÷²Ø9ØÁä"v¸Œ±kUa礨FéÞ‘9÷:W¯éõ=4h¯ôP“ÀvOb·op°¨é#œ?÷r¶º["Y[ÜÀ¬:&Ýsö~¬ŸÒ/WøYC˜Ì©ãYè¯cf+Rê8^šú„Z|ºF·èˆ·ŸÄ¤Žþöç;š3»Ì/½÷ò¯Ôáô6Gï»Á,=ÉÙ—\Æ·°Íô3Tî…ӃĪõ˜œIø=Øzøsd³ûlÖfmŠôúMÙy~¨/}ì/Åëï|E3¹”¢kßMe„ýj§!ú2Söƒ±Ñn$;í4‹‘C³Išä¤Ç}?eʆÛç:A++ ëD: 7æÞÅ\ÅÍÈ<%1k®M„x³F‹§Î«©nîSÖ‡;ÕI«òœnK`M4!Ëê\=ëì×_ò¬ìuäµNvÔxd)‡gÁÌ…5_B9Òjxþ°¯ñN ScäßìTí-p;ò5(´Z‚DZ…Æ} zÈÃØhWmBúê—ª7âí+8^}4aõ<ÎMfÌ&=¦‚îÆoÊhã™÷a§Èõöè6ÍÌ`|}M{»Ãø99L‰‡`V×iͦ¿‰K7˜œýöö/ã|ö?êópY=ý ,XœÀÎÞ éäô7ÞK{û?à=L½vÍíàY^üÉsÖlf…ð³êðñ’†ŽB²~Œ¾Uù~%Ñ™¬– yðZ¯5Œ£ø‚×õÀqHÊ ¯no‹÷º*lÐÔ6EF¨äïC7ŒpÂTXèi¨k ‹;L÷î{ÚOÜl>›µY›"ýÁ­­ý¿ò7®þ©}çògšÔ@Þ†í#‘!«sUqUJj¼QMòîÕ-,·²á5>1Zls3°¶ý–zp»aîjÊ|ÑI—SlC]=2iÕ{y¢sòFŠ ¨éÄT¾¿è‹íL6õ­åëâJ%]´7 ¿#·|Â`²!%ŒßÆO΂™RoO±µ»ÄNç¹yÔ×ÉúzhF5@w,q‘~¢Þâ †#) ²±²‘çÅÐ]¯ƒ<6ÏÇJ–R£?gMœ³SÕ>ëèÁ‘%•8Ë ë9·U8§#‡¼Ôç¾fö6æ{[ßXðl=cvé»Ûs±«<¾F ay•¼ºEl‰‡+ðt‡nõ ÓóÁîÃÐu4þnç^&÷<üÉòÃE͸ ñ=Optó ŽN®ÓõÓyCnßG|öHù†Ñ4È׊¢€í±„¹x¯†ºâ•ŸmöÕ)l®2¶ñ«vÝUªÿ/d1}?³š½X¯Lð•\ëÖH‡]#ˆMD}9˜®–0Qô%­”PfTVF.NGKyŒÊ‚aJL'Ô?ñ›]g³6kS¤?è5»ôº'¨>êWfµ5Ã-v1fA6ÑI}¶× O#/dÓkG]’—PfõDº¼"ç*ÖрߖâÓŸèꇆt»&­í¡ÚBÛ vÛ‘W=Óýû©Ïœ¥Ú=êñ˜ÙœzräL.>„;S‘N®á·–Xó,¸Çèî¼l±çõ𠽩Fðµ²g²”Ánkðˆên“Ζ«F9¶a`€ë¬Â,‡Ž°Ò±B¥óì<Ÿxð<ßñV–oÿj[“º 3fìÜb†ÎblÆí@¼•È^7¿Õ¯ƒ/T{œ»<ÄO.…°u9”ßÔ‘tè…ÙÄ_Ó`I8¬¸«œÅÊH4Ré‰8lÝ Œ|6`+OžÖøíÖ7øÙÆM¤˜çŒ«ñ³-ð–åµëÄU$-¯“Oz`BŒë{v>拟×QS#•b³Pmî‰nì+-¢ªÏ¥°.UΦv\ð¸Óyÿ:Â2Káõòfˆw‰LôS9ÔÓ¡›Å*Äë hÇÛlï¹€oî!e‡õ×'âêšï%ocÌ„vu›´zU~†Á zQRÓL-ЯC®™ÕÁ Oó~È·YõVMküDF륳ù2jñåv©Úø™ê­  •í ñ“¨­*jk²o£v¬©xÛ©qL×i‚h­Ö^r¤»8Ëä0(CL«CF)—”³l¯<ÿkþÝç5—>wCÛ¬ÍÚtÒ¿µuö•üÛŸ}㟕kŽ^îÍŒ6ž¬-ןb«¹‚|p†zúb¢ß£ÞnX†)†;µÁ’ öL ׉xË’O24;…x$jÎ&r•D×|³œÈ fFÝ¥­‹phHXl›ÈÑ’¨ñ!’m©B‚3Y#¤¤L^;èŒ!‘ôßä_-¹k0Dò2“– C$ÆÛ„ˆõ.Æ9rŽ4gÎÑuÇ´‡8<ÉFòrI>ÎÄeÆÆfêHÇ·~ø<‡¿Ü3{xÅö+lT¤¹,ÚÞÐiw©qìT>Õ(IÞzÍ<îOôý/D1eÚ{Ô=ªSÖ8øÄib“~v^g¦ÑxËVL<*ͥΩ0˜™9$.ßCÄàë-B{B2‰ÅSïi—ú¯ûFekÚ¢ç2 ŸéÏ·„&êtù? #Ò–zrûZ %ù™ü ÁGYòAÙÜI5Òu¥´××_8 ¬Ö€Ôæ5jA­ìàHוTõiï¢&:Zˆ¨éŒVM%\ Pî€jó‹s^ÔƒfÕxú>Ð÷-³3gom ôfmÖ¦Hÿ­­üéÛyßýÈê™·¼Ün?LS- i‹.'\³ãn0aæ õlÝÓÐïœçpéP¬—lË«ìjއ»#v^f7“ é†Á¤ŠL&ݪ0ª!oÕ°eë!6äÔ’´Š9KÄ¡1„ì±IvþŒÕiÉtLÚYg<™€Å’˜JA…<›JÆfiÈu…µ‘x`ขÌî×LéG+R¿ å ã ÅdܶÀV&˱Àíh‡¿´Íá/mѼ`ÅîÇ,8ÿi-vªa -.•šX›½ÌIÇ]››jq êúæó˜\2¥KÁÖD¯¨E±Q£¤9Ú •Œõ ¥gA„­fQwÇ"7k¶3éðh Q[†T®Zl¡ˆ(ÑÊ{Õ“‡!¡«š£© ÒW@¯¤¬bp“4‚ÒM4$ë.Y±d4;évÛ^Éb¥+îø¿W)ZV¿óBâKÊÀo;˜V£¤+/zêöP@™:ˆ®>顬|D§ŽuQ¹Ýp(ò3½$L±H·b÷•_ömv˜ÍÚ¬¼Ü_ûkmó.|0«q·WOýØ‹ð÷î§å!Ž ¶™aÜÙ¡;5ŠÈàì6OýäŒj+P7‡ïz'yÙá­'uwC¾ž1)cª,É@Å3±·¤Þ“p$<†¬¿z,C’BmÁîdXA2g¤Š g+]0ƒÅjŸœ•ö› ¹@Þò;´`믬¯@l=ÙLÌ4/ÞÅÖSR×ASal-sðUOì¹ëÉ}©%/3ñvŠuì1½›¥xø„Í 3É„§5ÂI‚ÞD $ñjFRPoõ ƒvðú9':s›D®g­hŸFZ®Z aQbÚ|[“ÄHl«‡íî³S[R#ï]*f;ŦTß×õFc3™˜ÀˆýÞ•‡¿à[¿ÒL.ô› f³6ë¹×Æ»ûƒ\ó{ßðsñ~¾ïÃΧd³óÛ˜¼½î¢²:Œùí מ\òÄÿÍ=çñçî!労r˜”‰O$¬ÏØ‹ÓyâmO>¬ÉGŽínËüØÄŒ¥gJRvNŽpÇc°´ÏDEÒ‚›È„u€o^çyË×+[i­hÍX"‘ )×d n°[-éÎ ¿ÝàG¾– O®è;"JûÛ%‰xØ“û€é,´Vf¸Ó:G>‰ÄÂfOwÀm'ê³=ÝSS®~Ç=<õí;Üü ËêIé.ý95„)2¥-y™EŠW𠿆 ckt–‹ÌLM.4jñc%nЙl qÀRcþ-0m0¶vYˆq¡¹âåp 2¼Æ©z+®°ÔÝŠ;WҘ̰8:kÆ6ù¹ ƒ…j×ÉÿÔ é„Ý\ºê¬f6§íNuÊÅ[;¡ïI–(ʺ’Ÿ7Uò>Öj›j­Ìå—½¼×^ÙÜYÙã%oºh3"Œ‘ ÎåùS;b§32[Ñ@ް€ÕÍŽs/ð »ûÒÅfwÙ¬ÍÚéß–uîÕóüìÌ¿öÕ‚\ט~E8>GêÄÓ8EÙôüdɼêyö‘+˜Øá·ÎhZ•Îy{ˆ+KmBÄ LŒ#¥©z~˱RX–ÖDÖ_ Q{Ý„ †'d2ÕžÙ‘08V»eÝý)-WÖnÛëßJ‹&ݵÚ2 ,*rò¬_Ñ=y›¸ô&d&øº"Ö2ÓNëf¸fF>ÎJj28"qÙ(ô<Á:…ÓÕ¯ÔD™yç£Ìâ‘9×è®ü½ó<û¯§´×„1ÌLÌ[LRÃâRº6«v.f¤˜†%taÐ\¥xØZÃ(”až’Ìj)NXQþ ·Ñ9w들¶ :7ZÉï]¸¹©TêNçHš‹í” ‘¯/ı`õ:j¤˜šV é¤lî¬E·×"^©Š‹0ŸJçìÜè ‘ôy¼tF±’«c-îz؈­H«Ú lnE2ú E;ÕãG}T7­ïUÒ¼ñèuÆ_.»V»éMÎreçã¯nv•ÍÚ¬M‘þm[Ó‡ÓÖ_ò]Ù]ø6c÷èÍœj{Ž­ï£ËS‚S½i}ÀäþÌŠvJun—ì2 –Ý1Qi/ë•ÔUæÆ–¬E3ãÈT Cì0i7ì”ðU©0k`Ö*´ÖsÒ‚k´k–¹³'SkÑîõ‘2‰ˆÕRñ´X¢.69ÂÕž¼ŠfHäÎÐ3%ƒ¿0!×þ„nŽÉ–\APtíß«ï1{Õ=ò¼Gžt’%J±ÎغøH½bë5û0i¤xK¾cH7<é¶'ßJ¸yÂÖ‘Õ{fÜü© <ûÿßåè?xÚgY³šýîÜ…1³’ªS¿AÞ%ÖÓaá[[¦wìåqÐ)Ê©¦™Z¿F©c¦Ïª]Î#óåÍ%íâ•2 ÞáJÔ˜8¨{…©•YžµP¦RÌ 2Ðh'«r¨JÓÉÌD¾.jgO^‹Õ.8Ž3¹ d®)•2ÑWQIuÝËç,ùZÖfTú–å}´j‚’œÈ°r’÷΢l|ýùËŒ;%è\9ûñúŸnv“ÍÚ¬ÿôÚÇþ3—± ¦Ú}¢;ü˜cýÑ1-±ÆaÌJ åq.‘V/áñ¹Âó>ñc™^~57ÞüØÅJ0[¼–ɬÀô¸ð¿Ï%+R¿Ú®TFaé¨]vÉ•”ˆ£¬G€uJ‡>fÖ>ü]RJ™ÎŒÁàHXöoÍIÆÔSìä<ÖÝOÊ/$ó¯ã™ñìϽ½Wß1S"Ä2!Nï÷Qh••Ôu¨3†„×âX Zac—ĉøkR8[­µ(i R¬­¾‘p .0ºìÔvD6«æÒu›u¡w"®N¸¯Ð=¤Ö)¬^; cO¿â›#cL GÆQ5'ÐDé¾-á*pœÈGYº¾'nÿÄYnýÌymÂò݆þxxˆvê2fòcÐèÎ^;n#¶7R`rÒ<ä<Ì^Qˆ“ZHa6 üU‚—£²ºuf[4Ù}’×`' ÷JÊrNŠeHÐÏ”Áä à*±át*µª,L¦Ðl)ÌÝÉ캙(ã:ˆÛ]4ÐH×ÜkAMv(ä>©ªÎš í èÀO毡P§Ø’Pæ»Ú‚f/(ƒw*³ƒ®:XùTÂo3W.â—ýëús³~[V†~õnßwï%æOë÷Íò[\{¯üÆ¿cõ'hœ£m[b{@ôs,G$ “{lOïç±7¿•Wþ]æ÷¿˜ÃëÏ(O»˜PFíló¨d{2«Zfawk×jz)¦Ù® ±UÙP| Ä]-ƒ‹óéAO‰ÖÊw Š#Y5*°ò7ýbx,1>Ñ©tëImè»õw fŸ'-Ü™”ýI Ô/=vÊ_¯„lÖBÎú>õ–xþ·™°0˜­H^EÚ÷XÂ=Ü™€õ¿×R_Xâ·äg‰'Ó$ª©8|§Ó}%‡ ˜Xi>ödO ¯Ss"‡JNŠp夃ŽK)êëBl¤Ö•ÀÒ¡Wùª_6jÿÔe-ŠªöêX§Œôal›pwÒU6’›=¯Z/Œqñ2Uæ÷BµÓµÀù^“Ú|‰:Õ™;YIrÚyG#—K‰•´­ 1€;‘ß÷šûíÕé-vƒ,,5‘)åQá8eÈç,¯óìGÿ£¿¼ÙA6ë·²RwL¼þ/¾ }úïÿ…ؽ÷ÁÜˈ(&^5à¶?åͳý¯ùfwîËþá Ýéßê7Ùaë%_ÿM'oûÛµ¯v¿.سT昔wˆÜƒk*úÜçóÖïùU–¼ÙCrëW¥„¥uá‹kw)ºžÄ™W#´¿y·†´•"¼–Ly퀻Q1.R,F0¸Õ´ðzè4êÔ løw;êÇ-9Û5ˆ^団 )Þ a{Û»Ži ÉKYî Ôâ–ÕCÍõ¤£ÉúOë×ñäùÄb¦ŠÄ•ÁÌ3æºöýÍ9íÕ ®Ê+vW)f¦÷÷˜¦Ç6jŬ̑“#ò ºQbZ]rn¤klJž·D–v9µÃ\(ùªVx\gÇÀ¢²ŸS/æ7΃U3¯d5ã Ÿ¨‹š’¯l/Å5¨Ny2U}µÎÇ+ÍòîUG47Új¾¸ñò˜•×ë±5´Äk^é±Í«5mâ%X&èA" ¶þÚ+ S š\v“+÷á×ýcª³› d³þ³VxæŸ|öêÊ_ü»«[;u ³Šý¶×û`GF=1‚[Âêæ›ö»÷½éuL¿‚ù‹¾ðû¦ý³¯7ö܇ìϾñîþ/\7ÿÃ_ýªxûMŸB}öûª£k—˜ÅÓ̶?úÙ|ï×|_öOÿ‹Çþ/ƒŠm±Í\Ÿ¢vÊK§.`–j ÈýÉRáe?ê~íºÐ®êéW…ámÖ;©Õ¯Ikwàî¹·Ó‚™†–l]¤í""væ1³žþFë¬HÉk)ºmC¯f,VíFk2ïV⨧XZ,©)ÕÉé ›5d.¦¥Õú9 oéEFÖt¸=#/} 9¬s¤EÄîeLvŸñg~/Pí.°Ó ï³Î³t€¥Mú6Y…j½F,¢‘¢}§G'…„S”.x}fš q‘•±ú8rÓCB£±«Å&´ªµû´’Šq‰œÍz'šæ°Px9«Ã™fC›(ÏÝ÷òÑV¨ÕÒ½ç+þ÷ðìþÁ$÷;ªir?DõµÏ­ÜC¹¬ƒÃt‘+40}á§½qþ‚ûJó!Ø—nfÒÿ…ëÜÇüõagÏ{IÌ6©3Ä~Bb‹Ù¥Ûìpž›¿úï©·k,£…PÄVAÅW(,¡ÇClèO:Œ·†¢jÔµ[:Q;ë±çʼ·½*S-Ðvçç(Ð0Ì©ëQqvÈ\:JwÜVÄ£J:fÓ«ÌËÝEKãa¨u®-R0K+?mrbï)>‘:Ïž³'®Q…¤ßéKФc7DeœƒØ°Æ«Žø”'=•ÉÏ@:ä%¤£LZdè3íG¿8ãø×ÏŽ'b<’5ªR‰]^­Ds Á#:é* IR¶`è2Ïöȯn®ENOú•—n:[0[ª³ƒwªÁÏu­D¶U>6•3Í@rs*ÂrèÔ•ç/ºoò6HÁ;¶åRP'¶j&ð<Ú…·šŽe•M^UªE/õ‡^,D•ñ:wÏH‘O½ðìT‰+|ñ?ùÚÍŽ±YÿÉÕ]!üæ'þ«ã_Ø}<\ýÁ?è<û³3ìOödœdjåYh¤ªµªVØ3…zK䇓sÐLÙ¯3û‹G~úS¯~_õøê=îÏm:éß×Ô­·íüæÿû&îüE›oÐ/;šÉŠùÔóK¾Ç-žâ…oøZ~ýþ>5 <³Â…¦Š Æ%c‘ÒýrWl•a-p¹\C¸ J {ÁàöT'Ý­ úðg¯}3ìæ &)- ‡3-³™Ó>zB¸ãׯ¥tßCQ.–*({;©“YA¤{–Ù´!h!ökX¾üœï&žãzR¬ÈÔú¬ÿܱCO˜s·åHKˆ°ÉÝ™„ÛÉLî[QßsBµ—A-8“j|×ç='$ÕZc’KíµÈ%-¤Ù©'¸’®*ÍU•|µºáÄ'®4Ê»ºÝ®•n7²5ͪáÎBS¾Ÿh’ƒ@ÐKÍâö¬nжFºáI¥nk~¼N^óêH ³ŸHß'=jÕj­jÔÍ4źx|ëÆI'úêY%Ïå&oÁÙo½ýÞ¯8úÈÍn±Yp¥cºw~Úwõï{Ëk¬»Ë>èax@“ wVÝøÖ[ŸP»(»!~u•úl½ê_kç{mÓIÿ>YõÙW6÷~Á¸É³ÿȺ)[Û ÙVw‡³¯¹ÌG2þ¾ËX+E4i¹*zæ¼.ž~ÔÕÆçø˜ ØkÖݧQS“>îdó©B]ºçqá¿›„60½£BÉS¬íׯ)æ†ã_k‰‹,0¸>Oqýζǘ ¦)OGÖ¹»û´Îð*nâ·.î†VŒt0æÃ[2I[ËlŠ)ŒÓï¯É8s‘£Gºê ïKЫ´Ë$ÂUCûnÇò‰‹÷m³xbJX©7už2ëù),åW¯:f£]N ²)§EÖ×'õ·N:ò¦°¤'Ò妬õîÖÔ­º0²&}¥…… è¡ðwR34Àú!Õ*¶‡7SIߊ½²Ñó5€ƒ,Zœ¨ALóO4”CQ§?•þ,Q!ýòºÂ+pŽ+—?ÿG?g³SlÖZËG¾ð.þýöãñ©·¼¦9Ç~už}gä:˵ò)4”¦¸ÚÉ0³ dS+ñ¬TƒÁ›«Ãàªûé6ûW⵿xøÈ×ýÅM‘þ}´¶þŠŸµ»Ÿó£fêþf £òž˜2—>}‡å*o>Ë䡳•³S™³Ž‹rÿ~°öX¾ôþPuáÌX=H®Xw¹Å.•q-ÿ/GµÑq\ÃÓõ¹ˆ›i&Q:ßÖ@7ÌžÑÄj©z¬5¥[vªúyv’1tZÕj°‹ÙJIé*úïñAB†ìèÃ9×zXh>ïqŠPDj ‰ ©›¯×øI‚U&‚ÙŽ韪Y¾k‹öêœþ–“ÎV]ÌJþ²3R¸ÊÌÕn¦F*F6Тj”4K'«‰VUÑg;±àL*ß2•v²Z¨«JÌXPSŒÀÝÆÉü:ªLÝ8êæ57:;ù”c)ÆQ6½ A 6 Ü]ioµØz%‰Å"¿Ò×­æU÷2'§ØÛktfßI§_4㦇t‡+>þs~Ìì|ÂÓ›]b³N¯pýï}ÉáO›ÇãcßÿUÅ~µË¾«‡àS¼øõ0ËTÇ3(g£M4ÎVÇTÆIêšÊ¿Wj³;Ù‚iµcÿø-ÿøÏÜ|ãƒ?ó{ý=Ú°»»æÀÖþ×þàá»~@XxêjÂìáŽíûÎÑÞ<ÆÕ;´t '|3ÅÕ;¯;Í~ Þ¡ØÆS²9UËßµ£]´Ò‘9X9†¿ƒŠªŒ’Úܺ7îž Z„QòWai~#cô õuøR&Å«ÐRŒ{MáuÄ¢¯Áa˜ŒF«8 Bbk[Rj´Ð+NCAÊ{•Ö:"ïw‘ØV°2Bv»]gqUƞɴWúk f™íRÑì0uöÊ(ì¦ç£cGµõôN XV‚Yo–n&ëÙT¬GìÆÉÇä½Î±ƒtݾ‘":y¾Ú@›¡ŸÈ<œâ‘^ ÍPtK7\—`%ª…¤‘•úÖ{3˜ªÄ¬Ž¾†¸Râ™~ŸQó–¤ÁÖ鱩8ªÕB€3\€PÃò:ìÞç?ûG6³èͺ»8ýôóúw}úOæ™ûmM»SãиÉpºzH‰Ëq”ô–‡û*«5®uÃ%Uf5 væ¦ì>õ>®~yüâëõÕföª;›NúÃ|ù¦brÿ7|£#ýÊešù9šûaçÕ;´­aëå/ÓBÕ1Èœ§îa?ëpuuÌæôàfÔ9ÛQÁ £â\fÉcó’ñ}zfíNw·îÐÉ–U¿°bªÑO šjÕ1Ö&Ð)6mÛ~=8²ëjU\Uë…Ô—Ìt¶îÖÝ~Ðn\¡o3¼RâÃúNTk}ùð3íÚ!ÆŠ¸Ú"2#W ,áZE÷Œ§¿fèßãé¯WtOMèïÌ'Jœšh¸‡J¤ŠMfÒ.تÞÚNÿ묳àzªlh$‹Ùê¼Ù9‘U5j6âœ~²j/›VRœ©u–­d²d€cé²5)THÅz…°« å. —D±5Zd‹¿x^hq®¤±`+13öN b¨Oz‰½Lx§N4ÕQ`ù+¼áÇ60÷f C¸ Ëw}ú·¬Þöé?i—ìWžýj[ä€YmjÚû–¯G• ¸!i½c?õšv^ŠZe#÷‰W@Î+ÐWY˜œaßuì?õ¯þÕåcßüúß‹ïÙÆô·yU“ }2ÛOš|çW³I_èë#–Ogñ®'¹ð¼‡¹õó¿ ¥u¢té%u&)MNÙ…ŽÝÇ⨀ÃÀÄæ9àp?*ÖŒºã8*Æn›—BÞk÷G qIíDjÈNajyìlŒêy9!e¨›µ ;z=>d\ÕŠwxö ÿ›õl:C Ãc¤ìô5åõߣ¿Ï|³ÂúHŠf_Ýõó•0k6iäH®0mG<1°ÊØY&9Ú3º[ݱer6PmëI)EÌj¨FŽ*ãRâY)ÊÝбS¢UtÒÍÆV4Ì9J5¼aK16ƒë˜QmwùQÌTÏDÅú³HRž6ú1»zè|S7ÌØ³šœdµ/ zIEMº ªÝÎYÉ:J\óJÔ))_¨VÜ陲¸òðçþ‰o›½ü/|÷fWØ,€ðô7|u÷ÖÏøî||e2eß70XfΦ\kI+²†Ë”{ „àèý`+ §©»Ë´­ÑÌø¨&>º½eõ(îx“â {wûÁO²ùÑKÍå7üä¦H˜¯zëy·ºxÛ¿û=õvõÙõö\ÿ…«œyø#¹úS?ƒ§ÆR‘TÞdJQµ²W#±~yl€’G.eã"nGs?êŠÓ¨›.lï16ˆI‹bÔ‚ç×afÈ'”—`×|sôkòZTf´ ­¶qÓ ×[|$s6:oÖß™ÔG’È\KÎ^´×6’³ÓÒÝë3 ³oë#&Ybª¨êr2‚ c2`’]N vÎäÎ’ drëHmEeJwÑS 9›Eî¡5jôaõ¯×FJFÃ.L£ˆ¨PÞ–t¿)ƒ™k¡Õ¢Ü”¤c()]1ÈóD ñšV½r’Í'÷jš¢4®¤ƒ®y}¡ÓYsT74ýyr':ì¬wÉè.—)Ä·JÌRœ¦‘9í‚Ò1lß[_»ç ¿ü†Ín°Yéè-ç¿~ßo¤«o~oد§ìŬö¶N‰aQ»_;…F;^«ô¦Öy³X3 Õ¹ 8†jăzì[Mbë{•n•ûe~ÎÞÉÓo¿?œ¼ñ£¦÷ÿÉïÛÀÝæk~é ßÚÙ×þRÛ^úÊúÞºö˜l Ó/éIô8“1.“ RhRÖTªN»M£¦™ž“Ôå.;QÙ=íº8»œîµ0Ël×–Ÿ¥L®ðôkRX±"‘ÒÔÃ;­ÅU‚VØz¥éYZø\·þ~HXï*Ü0¶Ã¨v:±‡R×Ä:t~²Ì‹¦ºÀÝ26p;0ÖtGjkRïðô2H]wáyD¢(±½ˆ$&Ôˆ¬ëО4ħ3¸žÕã®ÿð=¾½’Ù™fM»-}ÇRˆÊš*‡^Î`) tîˆÇò«WÈÚ©ŸLêX©™ݶ$diH‡mÕñL=Ç»$æ&è¬9(¿ÎF•hé,<é|Î5ò½¾™өIÈ«ûó©B5(×Gq+Öð)‹ÛÕ¾â±Ù6«{÷§~ëâ-ólËþd‹ýjªÄÉ©ŒP°r¯Ñ¡fð@n@íßø’ ¿þ¿Múì©EÇIÅr"êª CVúd ÛgØ_¼íM¯»þ#ó]›"ýa¾ °½ÿÇÞÜÞ¹q~rïòËνòâÁ“L¼_¸:½Ò ¦ê1»ci’´0÷d¢ʬÅ#¸ÑÓ‘µ‹tZÈdö4#éï³~çP”Œ–¦>mi¡µkuñPÄŒÎKØF¹h"¹­´¨JQޱZ¿u=)ÙÑÅ¥Ò®$bZ£ñ˜V …ô5ÄvšõcyzKy=\HÑ)²¯|è!{TÖ(„©[\Ý“s…ÉÃêÔ&ê‘§¼î¤ïÖ°y¤!QéÉLî´£·íðôwáÆOìpóÛ,®XI³2à÷Dê‘Z‡®tFZ¦Vl=É÷š6ÅÑzô‹ÑÝYâ1W*ïÒ(ɬ]w‘{¹¬_ÚYô'Ú9d±íWRl³^œ1 ]t×i§­!!Vs²RÀ½Ñ—¢¯<ÑΦ•ŸÅx™ïÑA¼É•KŸówÿ»ýü°Ù~ÿ®þÙ¿ûG–?o﮼éuÓö›™¢BzÏãiž’,³ºàÑ)±LãJqmU~5žü•£é]ŒÅ€Qå‘9 ú­hs%״ɽêéyöïyËknþøGÿžÕlÌLþ+¯Õòªê{ÿÀ­ï¿ñC'o¾IÿØ nüÈ!Œ‘]Ó] Ø*{‹õ†xÛ’Z)—);bœhQ+ªý°.HyÝËk “¥oëoױؒ–p 3ºªK-¬¤îfw±¤‹·UOè'ël¯„—Œh±YƒÉƒÖ9¯3¼Æqœù9Îò½+Þt#H?kßÖÐuÆ“ŒÅÖ+rgñ»jC:zî+=¢TCÇ­„8£“ü0˜M8œ:ªE¼ÊÇ„Èfç ÞÃ$ïxšý%{Ÿp›ÙàÏÜ ÊT-ñŒ•žØgj·©Ò&ëÕÚÓ‚Ý–¯í;ÕuêF“¸‡¡®¤óe“f¹+¸nz…¯­äkGF³>—P?UX;êÜàÕmt3u¥£ö²a6µþlúÜí Wö^ôÒGîûòw|îæÎÿ}ºæÁÕ»_÷¦|Ü6ûÖzë•G¡†@^‹uê”p©”ä:¥Ë„VïF‹tÔéUÖñÑ”»-"Jg½Ôªx9¥Õèž HÔ-rí;õ°ïÕß©;„Ã\ÙzéK9÷ºßÝëyS¤Väq{ô ßñå‡o<úvóèïýŽï¢9W‘Áú„ÙKÒmÍîìTN¢WO°%åD¼nÈG–¼ÐþÑ%ìV$ÔX+©¹„høDJe@i%ÏŒ›â¢Í ŒÝ’˜ðþzk‹%(ÓZ:꼞 ×jl‘Ô³»f,+9Z†L Y›¤”QVÍ´qTZhݨ8÷ëŽ]à}¯óæ^Ã6ê$ßk¡I䫵Àð¶Ç¤¼~¶ ¤V¬V ³\«ÜÍAÛÛˆÝnIwš5ö–ï"Üå5"a Ðôdg1ÁŸúþ–½×0{±v”­¸mÙJ6Ÿ~!…:é,9õêó­mPùzµ+›IrJüŠƒÎÙ*¦;‰–µÐ¨¼¤x:iP†+]"¡*¶¤Ù¨b”¿KKÝ,fSWêd6¾"”á&²a¢¼å¸Ä%Ô Wž÷ç7ÞÜ¿W 7éßñ)?”oþÆËê9ûF£J“r6\%>ñnÊz^bÔ1/ùã†CæªNzh½«;>-HI Öå1zÖ†?hl«)­%@&Šª!£„^ãj[¹ŸáÊô¾|û=Ÿÿ¶ÏßÀÝÆËñpò/ü‚›Óá_2U :·]ƒß«1ç-Y­ŸLíÉy v?¨ïõÔ—+&/°4/IT/íp÷ÜE°3‡9°—2î\J£ädæ5Ý^í“’¬Šß¶vÄM–¾žY«‡¸(Z¤Q c{¼_a]ÂÄ"ø5¤$þÞåû1æ»aÎí /2-§8•Ut q…ø1ˆ£ìluð¶í©»2&ä#O@œ ¬+¾gz¸h2v§ÅL»uèÚÙ¬îp[ c‚T¬~°7-ƒüü½þI¾/âImC^8òmGº™i¯4Üø‰³œŠñ‰§Þ®ßùlRÂøˆ‰ ‚ÅTY´–œzÒ²ÂT ;ϸÆb&‰ê\Æm;Ü,`·ÀÖFä;­…iÄ6ã5"µt’¹3äÖaw´y$gªtNcïê4Ò³±½üÙ'L‰«FÔ6aêEƒ“1ß’ÒdÍŽx¯ìí¡ì‰[w½æ(åkçµã˜]CôY©Ï9;Í¥6ë¯79RƒÉÂ^Rì@¾¦Ï0pXI}¦#'KŠ3fžˆKeŠ÷Ѱ?P鲺„#5xÔ„HŽ™þ¦'4Øz‰@½§òµÜÌQŠk_] x¨¦X 6#Åw­ U—2[ì‘â¹Rob§>ã…ÂOôãWhÜÑb'ß¥TjL¢p¹µja‡Î½WåZ­IaUþÝM‡®¤»Ê• ŸôioÜ}íßþÿmîôß?«üüÝøÎ?òOòíw½°š²ïöØsŠð Æ!Y ¦Ñƒivƒ[ŸÑ6Ñ(Ù«HÇêÒÔÊò.w~ŽÂ^¾Ïr7Ó{Ì¥µ‚R•C@¶ s—¢Ý©kY¾…ÑC¬ÛbïÎÛžš{ÿ¶ýæþÿæG7EúÃxM_ü’'ûGß¶ß¾û}oˆ}Oh#éV/›· RãénN‰m¦¾Ø2,¯ê.f‘BJÙ°¬ÀÖÎë£Æ ¹$b©âJ7TfEÏœúò3ênÔu©ÄWZ-ö±4 "Tc]"+]™áéAÂY=¨¼jäïªVÏrezÁpÿ{ìÓ6wøï\»#>öGþ×ö7¾ô›Óíw¼ÌWì»9{NÃöR¯0¶ºà©;° AIUA’ß²ª Œ…Ù ˆk•‚m†®z?T²ˆN§îŽIc¥»nõ¶ÖqŽÑçXë>:=Lk¶<ñšJ;¨&ì-¯>r©9sîq¿÷ÚwþN¾å[ÐßÉÙ‚ñø{.=ë/\&]¿Ë&ZrßÁîu‘Øfì¤ÃxcÉ)c§–œ#ù$cjƒg¢B8u¸€«!‹éi±…<´ ¢¥¾1a/{Üq"tŽŒxM–$*¹€•vi>÷¤P0¢G^ü×d‰m¤ª‘qJZJ7áÔbÑk–tér¬¯o“`y R–çÿ·ïÝÌ¡?Ü×ê³þ‰¯ûÇýÓozà&ìÛZŠ˜Ÿ #M§œ´£N}%M×&¹V-Ü=_†1}EºòR¥Æa~§c  »Ú- æŒc¨Ñ¬›~¾IjIš•^U‚D5‡ô;Ø¿ñ“ÿý?¼øú¼»º÷sß±)Ò¦«ÙÉ#Õ…_þ¬ûƾ?ƹ†´ª€Šx;ªb×’Ž éz¯Üh‹?ÓÓ_…Ü[üDœ½Lc1u’|Œí„ñ†ÜØa^SeÙpg)XrL,>X’Söøq€; dågG•b©::÷Ú5*8ÝH63>C#O*ÅN]&õN½¥Uôt³º‘@ #'²Å³Ð^ZaIË´è(ó!ÕWDj¼º•% ¦nÉàÙªhw«Çõ-6€¼ 3Q]¸îMÂF1.¹ÿƒÞÑZÙÖƒ.3ã×¹¬“þTŒ\¢#ÝÈ=º !3{Þ1FýƒÍLݽ–"ûˆ!±¨©Båö.¶ Úl©/¶“Md¥Ò-7ÓCšvÒYI/yé6K§ltVÝ•K•»¿“N%tà“ÀØAÉeN¡E7:û”U ¶„´àÊC_û}_DýÀæÆþ0]ñæ·½®{âÿù¿st¸ã`¿šHQ6µ\¯ñD%„V˜ÛN;Q“Dx=v1.Ñ“qÔõf·‡‘½ÿݶcÇßq¸Aé¬ûQFEz<±ÒC&N;~õÇYayM‹IÈnÖëýQCß±ÿôýºÿÿÚ+Ýü‡›"ýa¸ò}÷=íο᷷HL·fë ˆ"7’ÒW­ávµ. ݱÄ[ÚÑœÔ<Å@ÄxòN/HP lAò3SerŸ`’Ä8°•ÅŸÍ2§Œ-ñšˆbm·åâÎi å&Iñï3ô;K¤0óL>°Xmíd–¬w‘?oµ+õÜ]ÉÓ¥SuëˆÊDÌkÆ'r~bëzRôØN-ˆB‚¥C¯âÞ(ðyHúxŒ>–‚AÆ, )Wj”"ö¬aÍ@™WZ{ŽËQ~HæŠJ(Íú3ȳô]¦º‘Á%º;5q¡ñy·<ÕN9+¬x}+k:+‰«Ó.Ú™Í#€ˆéÕ³;khF”@2£»/wÃÜ­ï4ÄC·RKDí(|’xÉÖv6:ïVn1gñY ûÕu®<ôǾñêûþÐ[7wõ‡ÙO×ÿ»¿žþ—<ÝW±ïg£¹r,:KÊT ·(¿µ¹ˆ^»öîÌž¡p— nÌÚ6§ 7ܤñ~YC~ôõ w‰6…ᬟO­A™n­ôj› /ÅA²i4jV»¶‚:°õû^ùk÷~y|X°óM‘þ°ZõÞîžù­zwJsñ"áÉk£+Èܨ ÙÊ®éJfTÄ„cŒ EB”âcoÕ…^3?ëLwt3ÄÞâ*…¦|ÂNÀn%ì ³ä`©¢0…â"‘—‰´R¿æ£âÿœ„ô´%,§l-f/&éqºrb‚­:²IÐùõLºÜÉÆH•‹ôªÖË Ü’{­"F‘m‘Ë&’o+E3Bêüúc]xOÀà›Ž”¬$;ˆ†Gg-¼†j}g§±†ÔèTÄi޼þÔZü:[;2!Ñcäð=¶­bïµbÊâ&[™H“£Îu|æhòüDˆd©¢0]¥ÉTVÉd^ mI¨"ªCÙj+ˆIæÝå¹lÒn½ˆ»l¾Y k!©]c²YÎkÙ¸Â1W.¾þõ?²ýª¿ònîè£â|ëÛ_×?óW¾1^{âAdä±?9«…V·™\³N>CÁ+£EÒ„Q‘-ERÝòp§ êqÁébìF]ð8ï‡Ñ–¸;š ÎÞãì!3*Òª'ÚFmBÃRÇ;EE¡3u–ŠŒ+ªå+0çÅ)°» Oï?wï?õ‰›"ýa¶üÎ9&g·ŽÛ³çév¯“oÖ„e$2e)Ó¯JÑ`tå¹4;Ïì¬ð°\ÝÝBî³è©è‡ÚK¤¤péY0Ù[+²-³•ñóžÔ;â1äC •%Þ2¤`ˆ· ÙLc¥<›ÈÎâö¹Ë¤“Œ¿I·&©ß¤q$c¥ÀDQ@g0®'¤ ã¼iK õ•NŠEW]\¿]µ[wÊf¶Ân%¸cÈhœRtw¥t™:`WÒž¦‘—`dÆà”,6ÌÖÓ¨{O´k[¯Çªˆup5¹^Ñ“8xû6{y 3UtÏêaG³©zw+u?ÒùrIëIN*ºY®–²a8E÷ˆTªÌ׌BÞ&kt_ÖÜëVu«2ªÇ·ÚŒ(aÆ¡þà:?wV´¢ÑKôeêàø6W.~ÜG¼ãâgýðŸÙÜÍpöáÏß›n}ã7Ä?òzNϾ›ÊõbÕÏ=¹.’ZÕ3‹j÷ͨ¦a§Z›‰äQfèX×ô¸°ÆQÁ-]ò /3çq¡.{jû,3éƒ÷£xP˜ÓÔ9E¡ ñ²ØæZ•Nú¨†BAÑú=öWO>ÍíÿÅßtæã¾çë7EúÃluªç½€úÚ5ú›'äö9Y2ÕÚ_ún§øÓl‰A;<-Ó]wôKXw¤rµfœ\e7UÙ|;bŸŠ˜IÄZƒÛKÐŒ·˜•¡AnBæ|ÄM"þ,¤ÉG–¸2¢1>T¨u•Á[éø¶ ÆÙxI‡†Üª]¨‰TVä5);\—Ö7·™ô0ɰʸ֒³Õ޶xV ¿,A~~¿ò$Ûc’ÓpT­ã1#÷‘ÔWV‘‹iIÂÒë}í¹;I̬ÿÜáÉD*µIÍŒ¯h¶k˜4ô!°5›±ì;,•ôß2çUøÙÔâV|¯{%øyµ Ú¡$íX”¾šøã*-ºúÑç,¾ªÕØDÃ=ŒƒþX:çd£¡Òbй¢’ײ¶ZŸ¥ˆ&•ºBh¯såÜË/?{Ïëßþy›»øCx¿i¿¿ö·þr<ø±ÏF›}Ûˆ[^ѧ2va(b¹Ñû³‚¼”"gêQ%ÑΔN‹fý=Ǹ“Ó<â¨7£îyC¹ÖJ—Çÿ¹tÍõèÏ¥Àw£×¨©XV¾¹ÕïÑÈÙµÇ÷B‹u/î|VåŒ}/ï«`vžý;oùÞ/œÜû#ß<}ðõlŠô‡Ñ íÑÎüþÒ ^Jl{V'½÷¶‚ÓEìN=ǸÍsé‘é™^˜a/ž#]½I®&Ä“cIEZ®têÛ):´EÆãW-Ðà­ÜG[· ö²38µ¬L9cœ‚Õ;‰æ‚%FÜžœ>â'1pòa¿gg0•!Ï!ÇH Žj¡óôY$YÙ÷8Ó’ú ·É6KzÕJqàœ”e=FÊô[ˆ])9ì1ôTx¢°©’…í„[:rp…€&Æ-A‹}Ph[±âõ>¶!•cNm™ ÙZjcà¡=²bëLG$ž´ǵ`Ì9&™5[ úˆ@Ð1 /“úV>“¡ 2+®½Ì²mgµ'Ö£±— ‚¤rÒM5zí’IJQ(ÏÉŸÕ½­i­õh5¥Ëi…úr>Õùþöñ½_þôÇoîàÁ=çÖO=/ýƒ¯OWà¦c° û®‡»~É:Ú1)в¥è­¢ ñ¿ýYþÃk²uì»]AlÖ…JuÈ9×TÙVì¨ØÚbSk%éÍ—NÙóþN`Õ¨P©Óº«åTAM§ªŸ,N}_8U€Oë¢Ç«l™êŽUø]»ï<îð[õHÊÏPŸ¬E¾™C8Ñ¿³Ô»³¹p?®ÿðK~úÂçþ×ñ Øxwÿn MWoðo.]xüþÝÿiëòÇò¾ïú!ï{Ýõ;ÄÛ'ÄãÁÑJtÅ:»UiÔzæsWŒ% g'2 ¶_pfrŽ;oÿe&[&/»Ì}oø|B7cráv{BZÉ•—=zÃ_þ–o/«7Itêf€-*‚¸’U›2îlÂlëL»703I"m¨qa1½%[+^Ö'º ¬ 9 ›<¯”¼åo°ÙÀ,ž¬U—›ˆy²©Y*l ŠÛ³–¼4øÝDšZ8°d›ð;FçT‰xèɽܵ¹­õÌ"®™*žaÎO1SÅs‚u )“ë‰ÎØN O,34Ÿ¡3‰\טéyºà…¥Ýx8pÔgnóÐç¼N6!„9;llAOûQC7ÐS{TWñ?Ž+Ãýl°ú¬ ¸¥DUæ-)îQCÖ¬f[ç~سBŠY%]Ö ³içÖ3^ òã'¹²ûª­ã‡þØÑ¦@ÿ_¹}܆«ÿü«âñ·|%·ž¾×:HûÔâ—[9´¯‘ª\gV ¥Õƒ`±¬¥èãGðÚ˽Ü6§I_æLͨ;.³çpªȨ¦uŒþ|Zjw˩ҩ©àÈ­ì®n|\ÈûÁD%F=,½×–¢‘ŽêãƒÜ«‹;š’UC»Ô®ÚêAz Ë#®œûø¿õ?o½â/ǦH˜¬aÎ=>åÖþë¿å›Øò/âÙŸþ!n¿ý×é 7–pë›=+uÊ*9ÐE d×Wdz¿+[î‘…^µ)N,Ù}ÅeRl¨öΰõêçSíezù4—w°³mìÞE⬞z‚þé÷qç-¿Bûô!'o}/mG¯ñ¨ñ%ZÒ9ªó=v["&ýÔ`ç‘Ô[ì$à· G1×ìO<ñă%Þ1ØiL2Î'Ò‰%,°Dq0ë0 §¨Âê7¬]<ÌN‡©î,Â?›µS"GñFÏפš5soG¢VØ\xñV¹~p»f×bBOï qáhŸ±ôQtÛn/gÐÛ L÷ ªp6aì1éhÆìò îÿŒgÈ×RûØÖÓ¹n6YåX±¨-pŶ³‚^;ÜØLn*…³[%ˆÑZ‡J¾®Ø}¦,EÝë|ÙiG5QXOó±'“aƒZ=Í•ùË狇þÄñ&ú÷*Œ}ôËçÍíoúúîÉõåIÌDö]‚zgt(ËRx£ ѵ¤sño·#>ªqz«íòëSEÕ ¤9U¬OK§NÓš±ÓîПëPžkÜ¡—ß· 4’ò÷Œ^k§J‰ü¶\#ë,f-fÙˆs\.ݱe½îŒÂ¿EÒw?Õ<ÇŒy<v§Š«=5‡>ÝŸž'Þ?Õ*ðþñOi¥çS¯Ã ðÓÝó¨X'ÔDE• $¸TPƒFþÃ{W²¸€e«~ú^ºëØBw‡+f÷âµKøêk7EúÃ`½÷;þÍ'üÈWüáµ}ag?Ü8âì=—yà¥ûœyÁ&ÍœåÈÉ“,°‡Ç„«+Ò²#ªÔ*s…jÍû ÇŽ¥‰¨_Ù#IS‰Ìr}„nìó—ßËü%/dï•/¢~Á4$÷-T5‹ÇßËâ¿ÄŸû Ú[W鞺Eœ‰Æ^¬µ˜0g"Õ9‹™gp7¸­LNÑ † ý¡!ÞªÄ|ßCˈ—´Befžs;e0ÎW¶f¸­þ¾ Ýš)„ë’ˆåt„k–þºÂãëÊxWk ¬úGOÞñø­„ß‹äe~káæsŽW†^ÅrQßÛ9 Ü¥)õ^#zñþ)ìpöE·9ÿ‰·©Ïªéˆ2Më-%Žiw““8•‰'sãäïÛ•|M£0·UMghåßM'ÅÝ8é*g['ÿF#A¿òŸÝTÃUú¾©øñWv_ñÂwßÿ¥~ÖæNý=Ñ.Ó?õÍ_oþã?ãÛÇž–3ûÕöPˆl¥áµtÅÒ5¥AÇ\ŠYÒÎÒ©·»ëËÖÑq7‰«O½žÖ·AØãbìNuÄ÷]º÷ñ —w÷35áê1óó÷s|¸äÜ¥;ÜûÒ—So]"/®âcM{bXÝ<Â&º›-aÙé•íìîJns6ž«h—+^Æq]¼!‘XYHLihvv©¼ÀìEØ{ÍË0;c²%/Y<õ8ÝS·8zÛ»é¿.¦ô ÑÏmcV¸ºÇž±Ô$ŒK¤•߉¸y&ae2rÒï á–ƒ âR<ÆMoe³Q–²ó™´´d'w±‰–t„ÜeS+ðT¬aQãöé–'­­<ˑ܊s‹Û6ä-'!%}‡ñRbuà¸ñÌŒgrEqþ>ÖãÑ‘sç þ¬ÅÆ«V\˪ޱ÷âÎ~Âìªö)š­N 4 ”TIg[¡„o´Âêît~\9錻(pÒ?—Ϲïdó©&2§¶­æF«ÓXR •f“…üBTȼ—¹öâˆ+ç>å•o»ðÙoýC›»ôwq½u¯¿öÿýºpýÿú²Ž·R’ŽÙ5àÐk©øb—”X&§wø!PB ¾þ†³;­5É*Ÿ‚ªÇ³Ýq7\ñþä¯1cÛ>Ç÷ØS÷xþ !†JãnÙŸúú8Ì–ÉÀtô|c“”q.Þö"Oz¿ä<̨c«1¬eª–”Ï¡“ɇwK;¥¸Ù ’{´=Õ1Wö¿ê™‡©.mŠô‡úú.sññl®ïϼL8ŒL.ÞËÁõý­gqμewÇræì”y³Íl\cI‹ŠpÒ®EúnI¼Ó‚Óë=ÒéÔÚ­Yr‡™»Jx Ž(²&KV)’8›íºƒ^ÿ=ßkØ}ÕG0}ørXQíeùì!iuÂêÝïaù›ÏhêUR[ÓŒQ/nW'raÍyS‰x¬v2õùž<ÂÄÎNncät}äpÓ$±w ÈÖ ¦¯Ê’0˜W€IdµÊ„L<¬×²¶È”q¶]&âhÉU ~XÓ°LÄ7‰ÊÂÉmËêvÅÕ“wÅy{µôœ1‘½ûgTÓ–°PñÚqþÁ;Ï_⟷Âjt_Pˆj"9Ñ)+a«ˆ: À GeÕLÙßýJ^¾¯Ú– Äk¢Ô®©;Ñ /tÈò}Æ á6‹yбÐÞ€nÁ•ûÿПü¶×|Ë_ÝÜ¿ó+ßøî×t×¾éëóŸû„´cÆ®wFÚv;YÕaΨUl£á-ã.Öl:Ó`6R8 v,)#‘Ò¥ºSt{ª»> _Þ÷'~¶ö4ÏavƒÇñ5z¼±äëôA`¬R-lïRô5œMö +- ‹'ïOJÊSmåëcҨז:ZójÉ›kèŽ`yƒ+Í}/zôžÏççlŠô‡øúÉOù¬o}æÍ?ñÇÏÝw1A>ˆôÁ:Gp†“˜XéôxFdBdwê™;˜8ÇtZ19ã`Q“…U ¿cI®‡aeˆQ ÷ -´ ‘§ûl3ºÆHa–K—,Iòª&Lï›b÷¶ðuMwíVÇt]O>2–#G²&C‡µÇ¢Á>ïpsUÄÏÔê§³%ÉRf0Á’²Áø$:íhI­!®,yi`å$s‘Ö….$=kùŽ¥gª™V²#1ËW%ÜEpg ·ÙNn8®LYR³$¨Š¥&$æç:æ;20p1Ñvå¾W²óòcâÄJ÷IEâ©Æ…÷2#ìVP;H®í°“^Xe£–˜ËÌ$d5ÒÒX1Még‡MÚJ.‹lõ*º?€gE¸rfM K¡‰­3­@áhXN§r-뇑AßË¡yù,W.}Ñ?ÿSÓ‡¿ê§6EúCx=ú¿}óüüŸý|ÿÅ/{‹Y@·2Ô[Sè+–Ë%Ë>°ÀSáY(ÔÚ‘˜(x{¨ÈìLµ54¹¦šöØ35v«¦»‘`e‰«–¸‚¥ÌšSEóÁœôGóÛrLÍ,Q»e‰¯1jË"Eq|g{qèbEÆR¹³qS°{†lÄÆÅ7]öä$ɱò0MŸðÓD8ñÄUƺL>©Ág ¯ÛDºy9!«Çy)Ò™C«n§ÇìX°™Ê&Ì*sxì¹s{Æ1 KÚhIt$ w3Ósç:ˆ†398Bï¸÷c9ûêc:•f$ a&³e—a¥›OU nA7J+ÖåÂ5W™‡i4ôB7’èU~”®:Ò¤d©:tƒ°ÂÆWš,Lz[k× øO@ÞâÊó¿æßþ¡úþÏÛæ®ü¯Ø)/c+_ÿ§_ÝÝú¡Ï wÞý#>êûÎ@3UòÒ¨ÃMÈ眴àZý3D”¦¥ÂÞ[¬Ã-²;Ó]f6ƒÎy=o6£‚WàáÒŽçØ0X4ÀÝ™ÏÏgsêqͬá“ÄÌs̬Dž9‚Ê3wk¨Í©ƒ@:õt¢¼•®¡–¹…?š‹Ý©Úù[§a8#ÃÇÜ ½j!,ô åó)ÐÉK·îp徯ÍP›ë¦Hÿ;ýæ¯í}÷Ë^õ«»÷ïíÇ86ÓI9iûFŠñ´Ù`Ô½:hiLúû4*Órd,ÛÀ‘jÎUÔÉP_‚”*L[l$Ä(Ü})!òo¡h¿#¯aôáλÇJÊÏÊ/RÕ\|·­5Ø=9Öç L’œp–\eüT:íÜËü ñØcš­'®ƒL^zbªÖÒÁñóî^1Lq\•X\ó\¿5aICGfIP{lÕ‘ó—3ÕvOè3ñX(²Ue©ç‰í—±÷²f&áVuÐÙŒæÈVCô³v¹Y7^Ýà숹j•Üž“0¯sT„°,S‘z¯D»žƒè=Èéëµxw:³ïãŠß…‡ÿÊ{žoªç¥ÍùÛXSO>ø…»ëÿäkÃÁ›_—®¿ïþÔžýJ ²*ÄŠÀ§hÆ7ÊK(À–ì˜~Ð0›qëäÚrJ*¤SG°8ÜÈ©\s~tKŽ*,w½ü©MÀœ*´Œ té¸ÇÉSÏw?׿2Ö<›0«Îàqò©Çó|êçHÃ%¯ÔQ¾R¦ºñåVÌ9(#^îÜég`4NV;jZA­LRG6M”;|š+³çæO\ü¬ÿÓ›"ý!¼þ¹™?¾mâþÖ}gávÄœ‚­H&cM¯øOq¶ƒœH¯ŠAÕÓCO¢Á²RRØWãÏmÎ$ê‰ÃW†¦³]“n’« G‘Ôõôê4ŸG˜Õü@Gá¼.ȃ³¾Ð1£þ™Vê†jv‚ÙSê´pøs™\e™ÉÍV©‚I S®À˜H¼ñvƒ1‰”kŠ:«\Êm­p÷AÕ8\ô™[7çÜ^5,ôÎ^‘hI8ŽÌå¦gûŽz;—†Uïè+š*qæ%'œýˆüe¹±5²{}ÇRD5¤ FmZ¬¦an…2qÚ +ú•è¢s”³I¥ùÐ…ø’jµí„V6cd¶Ô鬪`q ú«\9ûÊý+÷~õ㟶¹ ÿËWÃ^ú´Ç6EúCtýÈk^ÿÝWùG¿øâþ½¸ë¯È¤UGн2:äš–«³ÕˆDHÌ©èÈÊΖ+|¹ö 3z}[2™‡a Ì€šHƒ¥® õ,c'žjr´ô”z¢öÅæ?RŠ?¸ÂôOc'‚z4xŠk¿r£‘5–D`‚³+¼ ä-H‡¢ÉamÆÚ€=—`aè 6r,’$h£Ã­qç ¶Zbsi-'W7Ndî¼"`ÔÒ¤CØÛg‰œ¹Ð1½œ¨|&w†£Gèçž·`÷¥ÇìÞß“'qeEö£Î˜ssм,+oEƒ3œZgfíbð\•~¯ZZÕO' õD»,}¯g«o­iÄÍéàÑý*@{ñi®\þ’¯ú–³ŸùÏÿÆæüÏìYß³Ó_ûž/އÿöó9zÏ ºåÁNlÁYö}¥¬y¯‡^­_õ0¶ZHçæ‹iLI(Kª]wC1^h%3åêîy«›(ÿ¢aUZœJʚѪÂkxNòV5¯uá®NÜ깆ꧺñÓ3è^7šçÂhNCäæ|]|Ž9ufP÷þšj3:”t+7‚Äõug=eáHÝØÂ¨Hw qÑ+Ö„T£™ì6ʸª=’Ï Q7·¨ß,ž Wø3ùáßê5·ñîþ]^÷}Êg¼éñ_þÑ/îR¢Jzg=µi–¢Ñ1ØÏF2S<ÃJÓ˜¬šœDí¬ëÑ=èµ7Ž “÷Àà ªƒYçhÌ&™j×0½\c$÷ú›YõÔQÑb›â>Èmm\¬óúÈ^3°x­·¸qd5BµRšÑ¥ˆ½Ó“¨ô8bEœöFOŽN_Q&Ó`ÁSUµ¸K`¶2&÷T±#{Þ÷Ô”C¦š õØh%n„‹uäÜþŠÉ$¢åäØBëÙ¾'°÷Â[ì<¿#ÏD§L«ÝM)šn€®…ÖB¥Ð˜GCäusñèOäÇöµÊhŒ—Õ;_’}1ÓŸÁË) ™Ý’•HÒÁº‰J¤‚tË)Ãd[ŠCBQ¨¨‰—Ï ?d{«…Y¡äÜF#©ºñ<*¤ñDžÓN¹+Yªø²s¢…ÓŽæÑœšïúÑß—">@åjNͤ㩯 Ïñ½ÏE:KÜ®žã±9ÍŸfçS‡†4šCgϣȅ×.8 ¡2&¨§yñ½×ÏÁêȪª¥P»Í–Ü‹qU£¿ª3Ø’ìéƒ_û_¿d÷•¿5R榓þ]^7~ö—îÿÞO~íÏ\¼o{¿YÌ1½£[BôX 5™žÄ¯]±Ø‚šuÿ)6–ƒ=®ÄE8½ÃVëÔdƽòHLÕ³#2ÁRc˜S3SÕy5‘d'„#GØ’µ´=| Ÿû[‚ÉÓÚG-­ËºQ=÷ §°ôšf•´ÀwVë;ÛT·—pg¶°³ïÉ×:ŽoL¸¶œs¤¡™L«„|Û+ºöG?§¿ùØóÌâ™Kyùô½x‘ÝT‘ý¬°±Sã ÀÌuCO£Y¤Ž8â‰ÀÐ~G òJ8 –¶^MjÔê5£‡®¥W§ò*£|;”]Ý/Ê9È­Þ ³‘ßv7*`þ|ÜNðÏu+ž6[£ï=ÝõÆ¡ˆ½|힣XŸîÄ ?Ž£Ì§ sÃûÛ‹>—TlæÞ®×ƒÎ]$¹nÄžG kƒ|V®QôB;ï¥ÎþŒWÇ*oL꩟åªgBütj(´<€®çÊÃê·ÖMo:éßåuî“>öIÏ{£Åîm‘—'Šrå¢0¦"tR\“U -²Ÿ¬v™\z,–ËKK¢×¢œÖ÷®\ý³vª†;npX¶ƒcûYhÈLgKªsŽj»ÿÚ›pÔ–ŽÚ(mðã;­À°T·Îep£²©u®ô¨â±š— iaj0Û`æÛøm³ ìêG×7oíqBÅŠHO§NèBÅ‹*vfÈä•ãø†gr&rùÕGl¿äˆÉY±¤D?ꜷÓ<ÚÊBÐÓÒÓ|B¾®V§§˜ä´] ’%VMt_ ²ñ»-!™åVöTç•Á½‚*éc[Üœj¦‘—Q¹•BS‹ÓXØÞ;¼õÎoúâî™w½ÀØÜd¶èŽ·&UWŸlèÁoÛ”b²¦5ÉV†Ðkf°3É$À$›øÊ¦¼ô!™àmlÆ&‹…¨ïsc!vÉæ$¿úúì­zë¾§ î°ÁÛ¼š„à’«Lйé,Ñþßìýk¬mYv†}c̹ÖÚûœsõìguß~MR)ó-R”H=bÒ¤„Hpä ˆeH¢$@~ N„‘åAŠ‘0"8eØ!–œØ–C´(‘)‰oRÍæ£»šý®êªºU÷žsö^kÍ9F~Ìo®9÷¾·(:QB6U‡hVÕ½çì³kÍ1Æ7¾Gˆwy¾ûh¼*ð>²«N!%T¤äk[HÃtu ó>°;®·‡‹aïß—ÇWÇ7>ùQ‰÷ߌÓϦã¯0ß®ÑoÞðÚóë£/¿›G;–ç:C(î4882ò3î™.VYÕ‘žð]Av”÷Y«® ~_îŠA ã¿+œ cC¸ä=ºâSÝÀ8•WöjЪ)͈–fÕÛb†n×Üï…N¥VÒÈØÁËçݶžN¤'»^Á“>Ûò”Ég¿S;(úœ%Ÿ¡wD¹“¿Oo3M÷ õÞÓÛKñÕØÞ#£;îKS«ä|Ø‘jˆMYkrAPÖC™¬ÍIHÓ›´ÞuaŠÖ—€7~ôôžýîÿö+¦w&éß_ó}ø¼õ…þÎ>øÒ¯SÂÀ°JÁ‚…`îšÍR®|k"‡º„9Öó ŠGœy(˜L%r+‘uv­zM›¾äŽvp‚gà÷@\ðœÀeDú²Á2°b¡%JàôûÿÝöïôÎtîª_¹!ìðC(²"軄« e„}B”ä×g|ùKøÂ²ÃÎ-¸m¨CM» p<¹âî{2ÂQEÜÿØ5žÿηŸ§Áˆ—¢\íëA”ȺuÐÝËŠ¶2r*°Dr`zN7‰lçZ(ÌíÁ»«:i/E ¼ü¼}'vd}×4+NîqjSÖr(Zèëë’œe,úÆ¢! ÝØ=Ìo•€ûq,Ó@>–é~wÅÛ\¼Àæ)‹yƒ*wÕ`OLG»mP©£±aä$âåßç›’­mÞÈvvCØžS¥ÐÎTîó=¿-¯!>Gèeº] ßúM™D1ð°]JSuÁ䯢(¯°ÒŒ"jyŸÕÊûâ±|oÈž7ÚDÖà‰¡LÀ^Q‚xQîê—nÇŽ6wE’×”ì”jŒÅØ8†B4ÆJÖŸóª'?A÷xzðEì èü6­=eêîoÇ^Ÿ¬gS³Ÿõó{ž}.¹:'†=Mk-ÛÁtJóno^£žµ^ÿìX>w_ÚßY¦ß½ÐN•EßCñ膔¿76crÆ:é°>¦äÊ‹|r /ÿJ׿äÀòp}OèüøCq¼zg’þŠ›¦ÿ•?ô·>÷ýáï¼ñB±ÜtËbªÉÒÎF×¶<åºrZ¶µ‰bà´½pÖ¼FB$¬­d}O„ËËycánä4åÏgþÞÀk0Ü`Àt(:í;¯9Æ‹Œ8)ôþ=Ä/¸$­ÈgnâØÎ ‚;rÞdŸfe×·w@yJÈá!8ôÙ È…A¦ÞD˜oqøõ€/ÜÞÇc X°Â`˜·û¿ 7˜±Ç„ç®öïwä·`çxïý2îõ\·HÖªf Z[Óâ V÷ÆÆìË÷/„žÃž¦$tŠÿ=†VÀ'l-Vºu°Dî#‡RŒChûfäRPEJê$ŸÛÞú-ÂèºËík_|ÃpY†©„[[t ï7Øa‡!,nàà yv‡ì¯bˆÔwg fÀHšîHo¼ÓµÈÉnÝx>“e+0G:–$/!óYw,òsÙÛn„áH‹Ô0ài-Q‚Z˱îÿëkw`xsñ;—»À@ò¼–÷Ycù}Ή VÞC£û”¢^ax‚‘4¤=IŠSY•EE ?S6[R=åc“A‰rf$¨Í­È¨”Õ„²©“n߬k¹F„;eî˜/qì ìÐëµ+̱#‡éo°ë•nÒUœzaÇ3V?)‡§T˜ô”|κž.ÁÂÙs:gj÷xïJ6ðýÐ! $/ÒXñ•àf#3Þùz5–{ÌØP©°Áe–{2J·–‚h¨·Õ‡í˜ÏNà 9–08ðÚßûWÿÊ»ÿÈßþ³ïLÒ_a_¯üÝŸúð_ÿƒßòÃ/¼çêÁåáò¦"! bòf$ÂÒØ2­Œ•9ª.Þ¥ÀÍtÈZ0ñûê?ãÆ´.×ð `ìJæ‚fÞ#L¸júlÝJíD¦ø"® b†Ü‰P9–ö£i9@0pöµn¾ÖMrUsº°í¸óöú*·Ü J+ { & ïd?@Æà q8®xë×/ñÙ-PÓHœ+Ày[³•íú3{àÙ÷î?»àò}׸xiÁøBƒ/sï¹7ïdx#‚áP&š.¤¡‰a`a^Ëá.€ã›|-¿#îˤg1×F ܇&Þ‰t¦±Àìa(%kÙ}àö|ñFñú,¸ºÈØ3ŽrOÎ*À¨Óà áÜî!¥Ï"† »é žÁÞ€·ÈyF{ˆúL2TVˆÞ°@Â-bž°¨B [ÂtM%4È Ö´Gw0ì^-5 œWä øE!ÆÉÚØñ‘Å{Sˆ¦FÊ7Àå¾ WJM±ŽœJ½ÀŽËmÍyðk’ºu yŒ5PA¹KÍ™>Ïìtê V¢Ûti¥Ës·‹åÔGN½Ô/'8d>æJV,(D^ÉÜ–VD¯§~ï{YN‚„Ûç7÷æ#‚'}¶õ)Dÿ È%ççwNNžôáîwÉÃÙ´Œ³=¸>åw÷°ö‘Ñ˺*$Ï^Sõà½ìÔG[u!£ÃŸ×†<9ªiaœÂåg×#}ó©¾€Ú¸+M¶³¡Ï·ÅåðŸþП}õCºá"ýÅa¹ù<þW_û²ÆÃƒÝÝç0¼QJ aD†l¼çʱ6šsôÚ}ç¿7¾ô‘…zG¬W\ØÙ¹¹”tINˆ\§ÑºÉ¡˜ø#€=W0Œ;Ãð `ƒÜÛ#=räG3÷l<22ï8åï_Ù„áY†bäù˜‹KØè°4`xWYÈÉ3Š0f¨®Àñr“ñø ¯^_â1"ŽHi‰;”dê2—+2^#î~ 㥯{ˆû¿«˜‘J$Œ0§–Nz>”ƒX ëÖ=ì ©d§9Bà. †6&ZÅÐ)ÐÆÓ#ï8T‹O i«ë”!Ês6— ªB)«Ñ`åðxý1ðòçy ˜À¢¸3%¸dìwÀ²–(LÔÉ’ÓÂXýÂØiÙ¡ËTsŒeÀI$ô% †9f»Kƒ¬ŽÌ‰?Ôâ0”×1VW´™Ó, E™6ÌKóâ·åÏe,…Û´ø‘Wž­M›ŠšÊsÝÝ¥ƒW†;Åmm1`wIزÚbJ—U¾VÂÞ}Yù¹KLQ§d4C' ?'Êç8}J·kúkGáš$¶ëCJ¥P pϧ»U‘Vp­tÖåþ•ŽXV'ê ¾ž‘§ì)Sm:+ªUcߦ8ÛÙÎù7böñýßçVï÷Ú½¡J?m§³Ç<×Jç³i<âÉhMÔ¼»Ÿ¼à\èm¿’Þ`üŒœŸÍm#ž “Ã#ÞÃÔW+‘²ñ›´c¹f²díúU|úÎW}ï¼øÿÍŸ~îþ úÒð _ó¡ïüŽø‰ø#ÆýJÚm»`™f²+Vº^¹Õ“º;'‚æÇÍo«]ça+Ïe6¾Ý~VIRÓ-’cÜ`bÝî…]·Ï¾!û!ïÆç0b8ì¿h˜\¤#d—0Ü3ÄgGØ1 ëRˆbe¢Ê">"b>@†òž ÉÅŠÉã‚ábÒ‚x›nׯŒx-x n8;Ÿ‚掉².… à];ÅÝ÷*^úö/âÝÿÒŠ%•t€,ÊTµ,œv‡Fâ1bžJ±ítVº}­|2E³‘ãBËP°c@ÆÊ<[¥Ç·òpΙÑ€i×¢}-¦ º/¿;ÎeºœøÜO?Üa^ãZ ov`ödX°Þ(2lFWÌ1AÄ0À—b¸5ž™„΃µ¸M©°íÎ0Ïe‚÷óãB| eÒÅ®L!‰;Úåqy=Ùê¦Àî‚nN`ñ®{÷= X<©„¸¡«¸R˜_ø¯à…o[±ä–6eÒù&Ó¥«ºwi×ñïê!°Ðñ¬›¼ŒÓn$Q%ezj‡¿Êžò ’U”SûZ:í=•Ð[Tš•|¥eçjŽÀ§uOángEŒŽ!(T1I$ (!=‰!ä²ZYxu¸–QV²`)1šô ¡@òã®\¾¶óoàD´Y‘ÚRŠkNœ iìa„"#÷íußiRäk9¶:„ ™·Õ.ÕÉv–L·§ žÓ©ì©7æuµÉÔòY›št[§ÊÖ $•%NÁ º’úÔ¸³tŒr³ë„·×›®7!Rc£P‘é&c4µK)O§ÛúX[ÛãÔ[[º‚µvß+g0³œ2ÇÑ¡x2ž2œ¼OFLö;è^5œM°}EWÔý)µ~Ò>g‹ûYÑ·3hÝ4žðd¯Ï§{uáç—½}fN~B^N×ÂÆÆoIÐIôÕ¼®EhͪíÉuwõM¼™åóÏ_~ðOüÝwà¯üæO?ûùþ¶ò®÷ÿ¥ÿøëxóõ_Àîb@Àg®0?Lx Ç€¸]§¹³YxW=tC‹l#ŒI÷3‘ó±1Óª¥¾iÈÛ%e= ÷³Ç´³É¼Ÿ”'Žk'¶5§—Óýü™·?âg%§p¹×Œi’47Ó^µ6iQŽœ´J³·¦ò|/ž+|ƒœ L.SA‘€Ãk@ðéü¿9Ýô;p÷oñ׫?õïÿÏ$åëÝŸÇ‹ßõ­xãÿõs1?>bÿþ{¸ýÜ52 .….¦‘°ßæÅÓH‹ˆSY¢q÷,Û#•?+Þº³¡Nïúö“fÙèlí'©v S¼’ÓFϊǼó"Gb;ºv—aûÇ;Îø+–^šŒtíÜ`g¬Xq@â«.Ä·LW5‡#“&$2Ü‚;÷Ü}.à¿ë¼÷»g,LŸ (pµô©T„»kŽŒeZ]X7m u‘þ‘SÖÔ¼¹Ó̃…I¬ :¦ñœ™(óªg,§Éý%;ðÌ,f‡\²G’¿ò©~á nRưsH5ˆ·´ÕT>²:< ‚èlÀ˜1h€¬†šXrÌRÜ4®FA¤è÷æP&á«QáfezLE+:î ¬çVXÈî‹Tmoeº‚Ï9€ ùÜ òØÉÙ‚rgÍħPs±y!«È1ì衼”‚w”Ʀnª_a+‹¡”ÏÌnø='éO+»Ë(Vï6«Íz°§µB¹oߦ;i$ŒÝï`f8F²µkß è]·úIxíØË8c=÷&$ç†&éìïŸæà•ž??¼u>Y÷…¼œø”Ýt'CÛ¦ßóªtþøý둳çQ›ŒÃÙ­ÝD³4Ånù¾{×Ôtf+Æؤ­)ŒŸCÖV¨MÙ¡NÖu÷–¯CiDe¢6)rÇG¿öø“w?úoþµæ:ô2ù[8E/ñèå¿ö¯Éð~̇Ïâ¥?þ5¼ Gºm§4czî¾ù«Y‚œ°³`‡€‘4¨r]ÇîUʬl»F6å#O‹Ì¯‘´(µË÷­œ¼kS°CÀÄ«~Å”¶áÃ8…×ûIÙ„8}¤¬,ÃpDÆÂ8È$Ü"áU,x >ÇC(cÅ›XðVÜ !cÁBØ;(DÌœò3œhSp¶ Çý;‚«½àC¿ç³xéX¹‡aG[ 9l;“pQ' jy§9ÝD8ÛRaqæ™¶ƒÙÆšiæÕV»H¥y¿¢oÈB¦7‹õXÞÇÃZìC+dàz~ög¯ðÓŸ¼€‹áÞä¸ÊŠ"e`Ίl@ΆÕÇìÈk€iF’B¨“%"YÆÉÄ1Ì;XÈi@FÆzŒ¸TÀŠõ`X™$¡œãL±&q2¦#§Ú¥M0 :a¢»¶4s²VÂØÊsvfPEè¸B,TJ›уZ¬!™$>H¸òf^¥U Â2Nå>}Š?/£ö]ëä>‹š„d<˜+ .¼le¾1 5Rùgö6Qîµ7¨ó‚ÍÍÔ¶ ³]ÁÌgÅ™ŽtÛ÷hWàÏ X}!};û|_œÎ nÊèÏ ìYósâ ~Îʶ® ŸgNÇ·ÙY÷éW¼ïªÆ¼î¥²¸ÚPU6÷özHú’±{ O1]Q¾—B à4ÄG¯‹¿@ZËu¨©åS‡±|ÿt ¼õóÿÖÿö7ÅYz§TþÖ}½ùþ>¬7ë#ÁÍ«ŸÁóÿ’áþ³_9Ü &<úµ/aºq±¿p¦=50‘­<÷×jÆiTl$ú…Ð6Ï.ÅžµÞs‡Y‰bÆÂZwÝÍ3„Ö#»Må]é‘~âè8#ô¯²«KïB½·3 D‹Œ§s!sNô †™æ¨Î¡Þ¹²©µ÷î ^'|ô¿„~ÿ‚DæòF*!Ëy¼,7˜Icv›ò`šiEí² Eþ¤ÒZ¾W:¿®ò¬ñ•mB (?0ZàŒ0Ô‹ÒÔ\i—2Ž |öKÀüôüÂÖ‹㱪cavð )8Rˆ•Æî"Žài@‚á°n%¬: c”•©Y ¾Dæ5"¯5àboÛô[[ÊsYÙ+¡n!šP½©±òý«Ù½d!‡Tš[Ë”m^¦sÊç Å*¥O• w-9ª6B*ŘeØ·]£ÆœpB^2 ðëË‘Gö¼¢;Öº‰»´©)­üŒQþ»Z…n.ìš·ò9×Û¨iöCù_ñ›ÅfвÁðò²§LŸú”‚§¬·ålÝOéé)UãœíÝ“ÆzR˜?¥°âŒývší§Uª>ñ'ãÉ®µÚý¬JÞú©»{NÒ½&ë®íóY[±¯Í{E‰*±JùVÆaVY_˜ ÒãÕ|ç¸ýì¯üÝ¿S¤›~¥›WðúÏý_þìîòƒv(Žo½ŽuþÏñÒ¿üµŒ•(eîúæßÞÿ‡¿wö—TM·ÂYŽ„a%Ù«BÍýu½²ÈD Ž‘{ÜŒj€R›ö:¡Ûv.6tE•šüÒh¦R’@IÕq#Í*ï#4].¿Ì)=vÿ€-úb!4pm@Чy"L à%W‚u®Ý¿x×ó{¼÷›ßÀûð€D?ë\”[%à"3¬’óB`r'a €èDå%“ÙŽÀäbñtÖX |æ´5ªÍÇÒu/ÕÏ›Úæ06QäÁ¦ö»l.Óã(¥À}â#~üïàáÆ„½Öák„Î…X¸íØÌ¤4_Cv FŸµ5 ˆÀ<àxP¸ Öù¦Œ3 Ó.A¾Žw¹w®…“h€H™¬âP¦z¯°Û:6í|$BRÝɪÇŠ\ŽSrõ†ÞàgÊÁ„ï“£›x;+Ð-4£6=žB“FÁ;‡²ó ÝDÛïºýŒ`Öyédþ”ßÎÈjémvçO)¢Û¤ÐÑ1ó·i{8kдè˜xݤvßmÌoþL¦d¡4žÛã°h§Ô¤‘2–kWbYeÅ 6ˆD€" {R%(Ž… :Þø¹?÷—ß)Ò¿¿xù‡¾ë‡u¤0Cå D¿ÅüðgðÞ?üÏãˆ#Ù×^ýÙOzÀx/‘7&wšKY*ÌlÇ@[ÎÔm 3š3™±¬ùVÁxFã=Pî¼"Ç É̶¸ÚŠ®·)YÙÈvïFN¿íº³®`ù[ª·^¸Û¾Üxæ§j‹q»/{("yç‰Z9…gî@ñÜ~Àû¾áU<øÁ·¯Êï_gµ$üøÄs§’BærsZ*‡ÿj” `ÈvÎe?¤ü7¤…Äée)S2 ÜÒl#²±â±X!†ÉH˜Söqæ9G泯ÀáüÌ/íñcŸºÀã,¸1:¢ê‚l%bÄÌðxŽe"Uàh·³ ÑDWHŽX,§éõ!Â=áhŽ´ˆs€åóZØáÙ«9Ôw¹”&``“‰zåa]‹Žq¨©4'ØÓBÔx³g^dm§ÔöÁRm6{º7öº¶'Í„•ët:7írºm¨Ieì×)_C›°°¼žÉ²´NZµHέ‘p’ºÜÛ„¡ìñ±vS»Í5ˆÒ¶úïÂÐ Owá[WÞÃÊò”bu¾?ö³‚ù›I¿ $—ÞæïÎËÎH_8›ªÏ'üóÔ«ÜýÎåìñÒrÐËÈz¨[»Ý±ù©=}nïau‰ÛžãDõÀÐÖ)rÕ ¸Öëm”3p’WiMàzË3€ˆÀxÒá¸þôÏüž¼|æ"ýÛéëøú?|ï§~è?šo>ùáÝtÿA4<.d¤ô_ý <ÿÑoÀL(W°Çõ®ñ…ùû¸|ß=\ {GºU„J»FS7QTà>¹þï’Ðv )E³òO.8UÏ„ŽÑÙ„Ž·£µÌa+˜…Žns¶Òm¼ÐVd P‚ÒØ@î«'Z´´5`€lþãήfcîЭ‘MÄë6;gRÇ22n!¸Ð/¾'àƒßõüËá»BØXær(f¾k¶’Rå7u—IævdÆìlÞ¿6ã3åð_WúF+õ–àL×8M…gæÐ˜?LÆî¡ú_s—•¥_ø§¿‡_øÌaH¸ ­1üu¢Á8$@bq>3\DÀÕptÇâŽ5Rͨ6 %ETGŽ Bȇ±${­ê+B0¤9–ÆÂIêZÂ)²æçfmŽ[ÕD3(]+1N€‰³jö¦4±¦²·zJp'éf=²¸2·[•™Ùt ;¢4 ©2®Z\µëú*q¬òí Ï{›2Ë-Ùôë„9A¶º“í^‹}•a9‘K„°ëdZ¥Z,¤ÞïW¥ëFå¬ †î†ÄSÈbö6E4œíÂô)Ó«ŸAÔOJ¦ÒYCàO™Ú—3B—>¥`‡³×‡nRŽgÓ·âI-÷pö>Ùé½z‚צoÇÆË€x§ʼ.»œmíÐ €U;[:Éi5ßá{æô%úí‡]§‚[ʃȋ¿¼ö“ÿÖ_z§Hÿ6ùzå‡ÿø¿û¹¿ñÇÿ†Ü¾þû¦»Wl}ˆy~Œ”Ë5pû ÿa¼ôG@p‡Š^GÆ#¦;ÏáîG^böŽ¢'+¤Æ°ÅÊNrd©œˆ3YÕ;öDÆykHó ©´÷Uè¢jaPÞWŠDûMe“1°XÇ.xç*÷â Ù,pܰ ˜È_Yœ•x¥Â%ÄV~ϱòºc›íð¾{ޝûC_ƇàºÀóoË5w¢Ô<둾 ,6@é|ç\ UÉ­ ZÂ07ýí¦³¤”J;| @Ûq-Ç¥ÕÄ¢õL³:—¯Q¹“æ¡à ðñ_ºÀ¯¼®Øß±“MI%jŠEF'«bREJŠÁ€¨QÇ1G,^º‡ ŠÛ H6\80¸aÈ$­rŽã§“Ü$rVÀn#ÖuÀšW˜XƒQvöË uä5#ÙÊT½íƒS*“¬JËÆ²ƒ®¡ù1YÛÖdXµ ¤µ4CpÜÒ”ïaʤí ñpî¿s7ÁV§3[9)w2¦ÍNôNù3·6Ac-ìu lBÐu¾ôà6kä.#¤«]QU9« r;sÔ”6Åm–€¹r[O÷¢Oä.ãmàíþß×®ø¦3"WB“wkœ{«—yœïŸû‚ÜCÔO:õAz ß?Æ€W°“ŸË$ß­HÚ$l+ï×Jàë_mÒØ€ ?Ë4c‹‚¸Ë&7…ÎO'¤5I¥qOlÔ€tÃb̃:W÷Á¹²Ã³xpóËÿÉÿð"ý[üõø—ÿê÷üÒ¿//¿úó?ò=óùÛ†‹[h¸†E`=$äùŽ7óXÞz¾gÁÝ;‚a&kÄíñˆõá5îè#¸Ð=æÆ±ÀfU2riC"´-Å:n÷âÀbÙ(a¦´œðSHTÄÄÇvº‡ „ÐÁè­é/b©J2­Å?£&uX{BÜr±KQ-¯ºè}CdóA›»ß5o¢+ÇšW1àCÏ|ì_y ïùýs|)‹/î^ÊÃ> dØ2‚Ðé-M/€‹bš_áèH&¸£À`ÆËJ¨Œ7¹QW©`‰„l­4n…¨X …NfsnûÕy>õ¹Ÿys„\&ÄÄh£ƒu¨ ¢(d0X0ŒƒaRÑuDZctìG˜ ÁœV¨*†A1sÇWäìÐ!ÀÔ¡’¢# KÙÏ1,`9ì(EúT§"s45ÒÒBô„OĂР¬LßÒP~N'JÒ¸°.p"Òé ´ÿÌUŸÌƒÝR)¤–sÞ@ݬ•&A{–0»N£ºó@7¦‰m»ÒLelÍ“vS^¬(IÚ÷¥ñ*V"JÆ·òÐwÚLJ…µ–®˜U8}÷”B'g´ãéR);+šñ¬° N @ì)“ïÓ¤Xr§ã¬ ÷Í€Ÿ5}a]Çïx2º‡ÛGynnºn…¸6C‘÷zMv³ë³•-@ÅÛT]¯ùxÑlamæ¹­QjÜibÃ4Þ)ßsý«åûÞ)Ò¿_ùñ?~ñ•¿õžÿâõ§ÿËvní[~OܯÆ£©W;`7=Äî~Âå]àö ƒ?ÿq¼ôG¾‚ 8yÖ+·¯|ÃóÏáÅoþ.4ü%6$ȶizÏ}®q¢‘naew·IWq$)µùø•˜&úÖ+¯Q“ÜñÌGÛ³´ön}‰íE¦þºÆcÖŸXàÓ¶u®M€`F‚Œ™;gÛlYÊ:«ãJÞó~ÁWý±Wð®?8ãñܾQœ½´& ,¤™°wn ‰‡]\Éòîä-N†öÊO™]µ1¹*—lgãµØ_z*¤1åã¬tîZåy8K2c%s.ºËõMàõW|îµ=Â>ãN(ïÒN€)4(ܳ† ‚C¼ìtס–\0ŽŽ(‚3ueÅÀÄf-n(ð`9 ×K.ÞuÈHÙ2BŽpw˜…rå@4mq“G/‡Óºt×ÕDhº®¨û“©%„& ™#eô%´‘q„R–”XÀ®³°²FÀÂæÆŸÕ©ùikg©]!Ûö‘Ý 2Ó3?O«&4t|ë9'ÊÿÙ-'7®OêRO´ÊÒøþÔŒéQºÁ»ŠÓp <…Ð•Ï ì|6)+žL:ß#O]g~j‚ð$+áÉØÊÞ”Aß‚¯‘žÂî~»Ý¶vÓ¾¼ C÷÷ѯ§LnéÈhz̓»Z»¢ÊôºÝ·’ÉmµÈwQ™–Úçá$7Ö†¢nW.5253Ücä@  ‚oüâ_ú_¿S¤ÿÿøuøÕÿÍŸúÒß”—?óÿötüõ/}Çs_ƒ¿ºü vw•Ærà¶/û¯ ­‹›oïù£ã=XÙ:&ÄÉðÖË?ƒÝûžÃ¼{K‡Ž$\ù e›¡Pý¨3ð„À‰ÕÈõn;áU9rŠ Ü{—I}wÖ@P\t}¤9ÊÊ2:A1¡È¸ê*jG-÷¹[ NΡ҄d>óê–¶ ㈌Ç ¡èÞ¼ûÝ_óG^û~ï‚õq;|Gk®_’Ê.:Ó–saÌc^›×s ™CÙIïQ¦°ùP¾o¥'’–ê‹Èu×ÍCȤLã›Öš\I‡²£4ˆ.­hÔÏ¿¾/)PRN&U…)EÍ1Å‹,Èj01¬I'ƒ…rNK$+V¡ŒÍMš‹Ø’½LïÙ0¯+²$ °'¤ˆ©àµÇp1(Õ’Å<#™T½«—6M(§èȉX#QËêöÅ=í03ˆqhPq¬’^ÈÕ¬fuËÌ u¦K`¼Kv‘¦TÕ8Jp:ÎÕý«¦Q‘…[aèˆÆÞöJþâQ(ͪÒËdmKÓbW”d>¯nfÊ]:††`l>îÛþ³F#J÷®¿™ê¼°O}lemŸëžqi‡–g“-oQŸ‚œ¸‰õûó¾ðæ†×'€ÓÂÏöl¡û»^Bwl«³'ëì?mìŠ{n.~Þ=—ú™£ã’ôji¦üоeƯ&ºâ±ØË®\ÒÙ û\®Ýùáçßku¤?çé½ãÝýÏÖþÄÿþ¿ÿúßþîÿâðÊ|¯=ƒ0ãþî…=ô™oÁí—>Ýø„+N¼àÜ}ò¢¨ÖŠ—/^áñ/>‡‡_ú KªbÈ3vï}7v÷ŸAØ_"êשèMíy,w>ÝÊBYÙßmU&]ÌF•1•"®ô÷˜S¼%<J¾¬“-]á=°½žù'•…®L] šNâYq! ü>ßÂDœD±2…gŽRLJmîï}Fñ5ßû>ð}G\?އR„ƒ–½¥Ñ&r!Il7”ƒ4“Õ"ÏJ†\˜7»O§æÖÆrƒ#‰JÔO;ÍH¶i’Ó׺–·I)æB&°I#­´"59‘îÀ—o"5L˜S±H2ÉE8@ ’¡^0ˆlq»¾DA3óòü]K(€E ƒ#™—b! 4IajçBóØà9Br(¬ýPlA=&¨ð Ž0²qa €P7>L|¯´44š)ƒQÁPÚ„šr´$¬¥8ç”Ál¦Š&zA2¦‡IÝû‚²)Z]VyM¶n’ª0%»Ÿ0´O•¡íS«x%£Inųê„!O ­¡êtožÐ"|ÞDaž6Ö×õÔ©1vä©ZT‡"Ž -ã4·9v{Ýž¬Õ˪B× ÈyMºßumÙÃì½TKÏ q?¡ŸlÈé¾wûïÞsÜΈpÚšó?*äˆ7ˆ]äÔŒ¦~^‹wÇ×Hb$#¯2ÀÄ?«égÞÖ"yíz”ZØ™ˆ·ÒÃtÄS)—nðæîÎåëã ¿ÿçß™¤ÿðµ~þo|Ó+ÿ¹¼üæßÿóÿ; x'<Àˆï¾ƒpõÈoý ‚¾Š‹©„ÑËB„%ÿ7jÕ´–îo¹–ù¿Äƒ?v;¼€ˆÀ›×øŽ_üd½EØï`Ô×}p¹¦ó&­ŠÜãV3~-e,è`&¨¡—%’£”ëX× cèFm’kyÇ6ƒW™â@¢ØDYè¸6Uó¼"mçȈH༭¢JnU!‡Ý`¡ÌªróBŒzá2â¥÷(¾þ_Å{¾ë€ÃkÀü˜²‡±嬨\²báAáÈ›¯²ƒ¥NVk3ê@à´K]µ®åu¬Ø bh0X¦G³­ tÆ;ÒÀ$ÒI+3±ªHk2¯,å¹€›› ÙK[B´R ùÝ$CPǪ‚!ªb äHq›“@1x(ÓaެI7»Ã1“(?» ûqE˜¬Ú8C¦„[¡ÌnŽ4¦¯>ÉÔ‰úŽ+†o QSJw2„÷<C+¨‰“é  ŽYÅè6fD˜Œå ±Ô9}ô뮦'Cƒ¼+)L'N>Î x—*­Yj°ž1©…6­5êSYÀ+³½N|:`s ª'o>v“¤´ ÑRs$;™l‡®ÐõŒé|¶«êå]½%çÛåLŸ'Tá„z:¹+NÂΛpÂ=aÌŸ<æùãœû‹{÷¾¼]ŠV}KFîötß}ßMñÞv²ç¥sl3®à@zÔÞïú}•dè|þù†ö±{Ù@fÐx*×èI€—•FÑåܯÆ;b$––Çzðú¯üå?÷ÜýÏù˼þ÷¾å?ûÒßúÿÙò  ÏâA¼ÖÛ+ ~†éëoùøF±Ÿ“vHùÐŒÿ…ÆAÚ®ãx \}ûkxæë>„ ‚[ ˆøÒ/|LJ_†Ü½Âî«Þ“¦n”*!ÛZ™zUJ^/qŠ„e İ­ GþíÐ÷¾Qˆ`‘?wª·.…Ù©ÎöŽüZ¬Yvè$–ÙT ,Ì ›g½q¢¾ÆŠ#V¬Xáre\ŋόøàû2>ö¯àùo›±¬ÀíãÆ‚õÔ %Ay¿«8Ñ”öTbÙH›Ð}™ -—"=N¥sÎ)µ ¼æ¶Ã ¸“ž)½Ùô•»jÃ/Gž·^ÌUòX“@¢CE°¸-íè1§Ìž³À,C’"¨ÁK3¢@Ö‹º^ݸ@¢xÜhT£©„vćcDö ¤°WC†Gs¡ªº+’VjDýÈC¨fR׆'µkˆ…—¸ÿ]"#:hgn;ÓVÔÒJ"h£¹LM• -ÐCµ1ô·8Hu´:†Á­Êaü¹pA’ñ°¡Ì¯vNœÚÅYÖIXCÛÅÆ²ÜйÞéŠ{êR´¬ƒ|ëï«®@UN1œM©sñÊôÛCÝéìçzxzyÊXƒ=±âé™ÎèvçóSš‹óˆËŒÓd*œkœ=GÇ©íiÿx5 dÆ“r^/=AÎuZµÎqð±õ ÖtêÛ[7R>I„!ç&ÓI¨xÔüq¦Ä)èL\wM0F`þâÃûÅ£ö"ýÏåëøò_ù¾/ýuyùøë?õM1âÁðlù€òø­˜õûáùØúq˜´¸A¹*‡ðše¡£Dã®I7P¥ößàÁû ÷‘˜UµbW~á5ØÍ î|ì«1ˆ"ãu 8`@¥¦%ËV´•»eÚ–E}¾6 d‚WÛÍÈ«¼»† H·©]™Ý¾ý¶·¯ðí«B}ôc2Ò'^‚ÅÞså[·‰þ€¼%oÕï[‘p¡Š<;àCïOøÚÿî—p÷ëWÜ€ëC±é”©g£“•^t)Ås$íÜû¼Yâº+7aZÚ"$| ÒïwÖPþg ÛˆÝNÊÖòçë ÌK)ì.Æ]Œ*°‘D3y8¡0QÀŽI :Æ]‚h!Ší¥îu»`ØiY ˜&$S˜ ²—F(*LK0iVEÌå³5D‹5 ˜¢`žGd¬Ð˜ ˆØG`7•I×QK˜Gac•Ïø¸p¿Jøx` I=0#÷½æ îu’I "®šåš&¶!Žp¬hncÕ¦TdÏ7ÆyŸC æj•ßQ\Õ ›ÛøgÜkŽ{Añ®g">ô{®ñ¡?øÆ–ä#ãˆD™”µÝžT?iz+[fv1å0kÇf­Dp¢Öš+Ìô«PݲvM>bI¦òÄ÷9–i»ºOy"ü[Ï,ªh(;i§Ë”ÑS<%Å[Ë€G‡€8ÔKg7¥ÊY*èÉN#‚+’)bP¨£òàˆA ó>G\¹ÀÅa¡°¼MîRØþˆ¹0ñ÷CBW¸T>‰ñ€AŠ­L@F˜œ“³{Ó‰Ÿ;Ðæ•¤H¸‘‘iA,X#.#Í%–…¶pW=´"•Ù@õ&$Ž–4f+-VYüUZát’Å\\j™÷Ú4\“¸¤ò øû„0¨S:¥<øÝÛ®ZwüþÜŒ3ªk¸¨»hçï9a]ŸO©½Õ§ŸMŠ8›–¥+Ú=ù«zêw¾~_éöËxãÇ^|Ùñ¬(ÔôÈ»€5# qýµÍVpó~e' )š°–@È›~¯ëÂÃÚÊþ:Ýùi<ø“ÿ=¼õñ÷áøø3 ¿uûÏ¿ñÏ~ÇïÇî½Àí¯ü"þô'0##2ÁÙ ƒ®q, ÎæÎ ·¹—Ù–=m»]Ó ‡-H³^ûŠ&ƒÊlŽÛº4ßÚ)3Œ>Þº)D޵c‡¿ Ç+Ï ÅŒD×pÇ=ðÞw<øöGxæ›ß‚Þ¿Å´™c»¹ÒÒºñ¥jAkOãMÌ‘½cmòFΜˆÂÄÂIg¬‘“¯{#—DFÞÙÔØšMÚµ‘—"ïïÔéd«÷uÍ,^+ûÙp±s\Y*Ñvq­%¶s‹QÙ2]3²•J°2Ü9™#†’'=#bÌŠD·±X Q2–˜p…³ 4b\ °<Âó—a[ÀÁGˆ&_ê´¸c33–÷mdÎ5škâ4•¬Z´8I¥}¦$m)‡,|Ün§Y=°æGÇ¡ P¨kÍ…„3åµî!$~qZ22™s%å.â’ßêDÕYR:™äubþ¬³ø±¹:‘u°±^uûãžm==…­gûèµ+LOÛ)‡3ÙÄS"3OˆdrV`+dnx2”ÃN!ä­Á0<©½Mgý³ËN"…§Àæ} Ùr†6Ôûî¢û}¦v'mÛþ,wh;µøNùeý5¼¤®I6v8Êþ¸à,«ÏŸ¡*+·ªÊS åº¬Šƒ”¸v™ŠjÆKàöó¿ðõïÀÝÿ~å7ÿæ×½ò_¾øòúe`¸‡ºtúVýøa vƒpû!ù× Œ!ìð¹kZÈùÂH;ƒwNÔj†Í+÷k~ /ýÑoƒ`àH&÷¾ô_ÿìð*î~ã×áþïû.\~ÕÇ0bÆ~ïp %ϺƒÀ}‹›Ìg>Âtˆ­k–m‹Ê,ÿW/!m÷kàüìd×ù½Ÿmö Gzš%Nã Ž[˳o i›VŒ{ÅKÏíðÒ‡€|Ïkxñ{ß‚í·^-æÊ=“sâÊ‘& ¡dvÈùØ‚|-»`±ÂôÞ†NwKañ\Š‹×=s'Í ØyÐçg §*gqöµYFÖ¹‡òý eºO^œÇ£5œEv {ź CY”»"­€Lx@@á§fSdS$Ö±4c‘fà óRβëÙáš7ùWÙ‡'¨˜@V ã [XàD²KL§› ºlmlõÜ&JSú %ŒáX |dÔ¤Íå1%.Z}¶‡®ÐLå1—›–\–×òûÌË6ÑØÄzbFîd5}¡‹ 2–…¾Ëdä÷Z]kõÛ>Û­ƒ¯U¹õÐ¥&Õ÷`&t~è¤Aý¾8vg»ØZ¨Ö߀e”Ϙá}LeïuÝ»å³ýïÓ`vÊn»·<éb6ží©ûýú„Óp¾öúþôÄ3;·?¬lî§~â|–Z²UÕä;Ç mÉå| c¹äª(RÖW~ìýïÀÝÿ-¿n?ýïý±×ü_ÿ‘ñ`w÷EŸƒßøK†7¡rÀzü"Ô^/•›ÔK¥c¯¡ Û/òàYæ• ¨£%‘¬Þ¤9]ãòÅníxüÆk›˜êf=Â_þîë‡1¼çcöŠ;_óQÈåã3p“–kLã%\|ËGîÒêH&ºGÇËxmã#wÄí¼p–a':Ö€¸m  ILé«9Ùßòq„ÿ€R÷œð2 ºÅOÞÍÞ÷ü€÷Õ¾ÿ˸ûµ+æë2-;v­ŽQdFW“PâhÛ™kShÒ™JüÈ™Œ_<,Z^¡#¡¬sÙ#W½ºZùæÔfVopcœis)Þô·JøËùTöéyVx‘×€jv*KõÕ¶*†(X³!‹C†H‰’,¯_Š­(ƒ8‚F)SPú³{Ô’„6…ƒ¸#Š#† Ž)f›‡ÓµÔ0…ò¹ŠiV Ñ·ð‹Óèæ “p5„òz¡å½MÜ×&‰ª¼ª2¬«\+ç†x&TLÉbµt¬è„Ô N³^eŽõà ]“p¤;þ½´iÐHR3³k1¨,òê&,ZÕƒ]†¶——³WMTj –vœºU[P;“U­ÝÔØ‡LÔ¢ñ¤Ï¶wE´ì gS´àÉœèá Ž?‡»ý¬`ÛÛÈ®ü¬Èö’.?m.¤3;©¤ÂÊר¹ÏµJ‡Ãhªc óu×µÓ–ñM¤D…«»€Îmí”+Ÿ@ú/…»ßð€%ÈþÀ‡W¿„œ¥‹’n×!Ût-üób ’XlCw ¿¿ÁÜÕ´* G„mnž#$'ñÿVî˜'Þ½+c7nax Š$IVì‚àÙç#Þÿœà#ßùïýCï8æGíb¡°†+:Q'¶J*ʹ܄!”‰&%’™¥B$}8§¥•ö¡JCp%J÷+¥»Pe€²;cÌ"ÚÎUÇ[¬]Ðr;%D+ƒ7Ì›$ˈ9†qL#âh8¸`i礚A ‹zG ¨‹’³‚"ˆÁSÀÊøkZ.´ ‚a|X1¨ D‡ŽÀèŽÄÐ-B‡\ds^ЕipõBÌ[ã(Á1í[‘³Ðb:EÊ{nÎHšû“¦_1îO¥Ä}ým‡zØRNåk¹wâÄÃUº"L›Ætän”¿1RªÓ“É6ËNþ¹§æ@U÷Ìa_îÁ¾`{%!]RZƆDÉì•X¦@?R¦ÇBRÍ+*¡¨Ï‘Þ a?q*N=²û‚ÚË’ÎÉ[é z>·â<ßm{×8NÍBÂYá•3Ø[Î&ì|FúÊo3í÷q•éìʤéœ1´µƒèA®CTzÉ–vï›Ñ¿ž½ÒGdÖ]ó%9"s{}5AM™ íkãµ r-ø:êç(DÞBU1„rº·ó£Æ•ÖÇÙ¸uD¯Ü€¼~òù{_ÿoþïéߌÄêð9¼òÃßþãcăÝÝg0쿺û(ÜCì| ëá³'µ¸o6s™7F›(ÞPÌú+ÛÐØñ;ÍÜk¯{÷aRÚ±»ú4,3®?uDÎ:m?züî쀻_ÿ8|þsЫ*ŠýKï‡dAzõ5Bä&œ“qÒˆË6ù:mDê¿,å‘ß×#LÍ–Ô;ˆvѶҹÊVÜGzxÏÜ}/pLÈ!xöjÀ‹ÏG¼ë݆|çë¸ÿ-·XÌ7LCª²iŒêÊÔ $‰Dbâª!SfÈÞµzƒ‘üáôó®$¥ê"x“e~fzè,$âà$/eNl^v÷þÀK”Fù ¡@Þæ€Îæ‚ÕK㢰c(S¹U–Š M°—P&r’xÙ™™ÀÔ ÂrRh4¨8²–hËceâç2º•ÏxÙÊ:dVäa ƒAr@…J†Á /;WJØœÈE ºQIbR ÎÊÄŒ–A]É`îD#EŽ,4ya3ÛÉ5pb–¶û¬l]ÙÑ{¹Þ?Ò r,&^'ßx*;’мÀ«N¶ê®«·z•vyn ßJHªûe èÄ‚3·Ý°Ä'‰aÛÁßK—žæ¬Õîs™SÀ“ö¡ýß÷ûë§¡áŒq.gE9œMÍèž[ßijçÙ³É<ØA‹XN‹òI’Ð êã §ìúí‹…œ˜ëÏÙÂ!ˆµ¢h™NÆëh3¥Akð+©°Êî¶éPv g?2}vå|‰äb„×=Q€š†Äʽ²Þþðvyö;ÿâÿéôoâëõ~éåaLïùpç»ážÓ¯b=þޝ>D~“ _Ôv3B£K—V}{]i—90´^"÷ÁœáÚIÒ("ÏÀ| ¬bxá;~/~÷G!qBÂ5 .ñÅýܾüqŽáÎ%žùîoEºN˜Þ÷nŒï»+ñݺL¶Puý¿±Û>7øZ7“ÝvÕå7¶øéÚ,tÓzÝ78F.HZ;u»ƒˆ xæî„çî >ø-×øÈ÷w¿~ƺ”‚¶r¤Rì<3 C2ÙC–P¼£×•–ÓôÆN„ÀW”?‹ÚŠm&Ìc!5Å¡¾0`¡ ÖÑ™˜ÔÏqGÇ0æ7{ÚI«zÊeæïðrò?ýHßî#àbd§â޶–LKCP 0±)kÊÓ¦Œ±ÊÁI$jP @«a0ÀRDг…C CTä´ƒ!a7-¥q`ÖÄý©ocµ]dÊ é.6¯Àam´rÚZ­ìãœ{ìZ8ª9‰ÑR4:Œ¡p*±ËRAœª¶ºjá…žÝ¡š—¤¦•¯ö°Û>–ÚYáñÊþ%¯¤NaUÇf–rBðòFزµÅ\¢BíU#M ùÉn6•ç°…”Ä3ȸ:éÙ|x!8©NÍOúÝ4ºqeyç3HÚðdâUo>ÒÄœZ‚âŒm¾`K ;·ÕóŒêšžvÄ©QJÀ¦‰6‘ø‘^êh«Œ\aé§yá–jqßB5øYÚ>{“pÕœq?c¾ç†‚›cLkMe³ÌuÑT‡HªeZóÜ ”†±œé­Ÿ¿ûÎ$ýÏøzüSß÷W¿òÉ ßø ì¾yù%|êŸ-“.÷#ah.2:5⊰Óx áΰãÙvKø…‘}’JàBÉDe—yÈ(v÷ãê¹#ìø1<þÌcŽ0\Àá¸þå_Æoƈ˯ûZ`zq¿Ò5ŽŸþ"2Žp€17Z6 ÚxgÎÛØdU¦ ïYà¶MÛëf¤â…Ì;­&fcÀ3Ï_!Ýddϸ†³Å¨–ŸÀÅäx×»<óžŒ|÷—ñü·ßÀÈžgÝÜ|“GNe9µs×ï„4£03yn®PQ2xÚ‡Šœ’XÄÚ1h‹ÜÌ5ÖrƒYÇ)¨ïQ2ý¥üžÈIi¡/³s„Ï%µÂçP$q „Pr½‹¬„»“Í ^œÆÊZXõ³Q8Äá¦P)ðt2ƒºB#§ÝPÜÆ‚ahrN˜AЃc;):ø1&Sh°âœtÁÉDZÓQ‰zÆÉ+èéV››¨‘’µ-Þø^›Üº›ž˜ß‰8}Ú´Ñ„(¥cøÖË­9·`„ÐÈ„ [X*tÍç’ùùWÙLNdróq«BcƒY÷ü쇶ÊkZ}¹8å1œ˜‘¡ñ~×lgpôy †?¥H÷6 =<.]îñzعÿ¾ó]²œíOê­ó©Ôêä÷§3ò™tXc>k.ºxò3ñ j—³µ@åò¤®i©Î€ÓiÑ–.‡»EIÿUO÷¥5nÛÊ$•zCaªŒn#¬áô³ëÍçbi͸ò©ÃV Ï5>Éà™OÈÞÞ#(Ö×€Ýs7ùâC毀¸û;Uùìëµÿzúåaüú¯.b»ŸÛÌÙÝ[,ÖrØÔ}†\–tžMtO²‹ITâÔTÓ–ÉHn­c¯Ó”¤2qÛÜÌ1'’ã#`¼¦\ü ¯ýÄ7á­úeßx`GËÈ7¸'ì¾æE<û=ó—_ÇþÄøâpýñŸÂñÓ_ÀõOþ–GŸÅøü‹À›{ø`ˆw#<ËãŒq(´§19“³=B‘‘IýšâŒÏ<‡py‡×^ÇåGîc½°ðÚ§â¸Ì¸á<¾@6/ñÝŒ{wwß—pÿcqù±[,ÜÓ¯ÇÚàô´v’Œ¬61sa ×õª¬‚näž7Pš3ãy¹3®0•çòŒ(¿ÃbauÃÊͯì®-”«ÜAÇÐöPUê3†Æ µê-ÍÃO¤°¼ƒ1‰ËÊ5‘xs¯s€HYGÌÇa¼°bÍ–¤H«1Dpœ2dÖa‹äe#l•8JWCÊÅx&™b ål¼ŒÅãÝŠ;Á18 ×˜Ô0N3\ë1 °gdÄ5 ®‹äÛŽÝÞ€µ¯¬†lYÕjµ™Ç=VRמd?jWÅ»ô,vwÛ¾ZY# ÍjP'Þ¡MUujª9Â5ÒÒè·]‘ ­©GÖÚ`ÚzÍéèªÁÖ¢„ÛÇ®LqéX¬FÁ¦½ò'y;´ éN mk§Ë¶§ì‰Ót]½Æ®H÷Ä1íd[Þýv…ñíôÐë©DêdÊG7-W`èÈ\}Ó ]SÒKÃRÇZ¯2· SOͱÍÙH@Éì¾éš%œ±ÖçîÞ#Š’oÊçU}2Z(‘6´ÒšýÍ… e¶œ&¦ùÊ‚\WØ 5䦜QÂU… LtÒ†é*RÖ[ù-C¸»ÿÄÿÌí×<ñuøÄÿäÏC–Ñð2$=,òÀëÙÊ­„åV;ë ’0[)Ê®0ÏÜ ,¾uÚ84²‹“xsFc3mH+0܆…éM¡ì®–°ÿÚk‡õ­†ñ.ö£àòùápÃ+oA."îÓG1>û„q€ì,X~nÆk¿ôEÜ.iSJd2§ò=JêwEìŸÏxñßÀîøXr”‡˜ùƒy(ûÌHéÔ¼ÐÝʺ‡Ýi% UZJrw·T ¾µ™y®›áa0¡ö¹²5«ûXÚaéZvJ‘‡SŠå÷d)Æê%8#iÓ½‹ƒ—òçÎbáYͱ$ެ#rp¬)` ÈiQ¨0(òjP5 ±ÜÔe%RÞˆ  ƒ»±¸¸¬ 21(, ™ÁÕd ãм¶ËnxʘE¡CÁ€³ P7èêÈÉKÑeÜë¹ìç©?¯ÎMÎuP= e*c’ Ô;r ÍÔ¡W/uc£b›²×…èÄRˆ˜B Ö‘SÖ:Ój÷†ðfeèÇSM2”Ú÷Í{›ßcK)è•d”ç2¥ƒ¦(ù¶#}ö“æYþ²^´€†'ö¹iÄÕÏŠÞÚlQO cE–³Ý°=jÆÙ¤Þ3‘zb–ãéÞÙçE/<…MÞçG]¡í£%;÷0㊡éžud±NBA´jѨ3wwç¤V‰}hó*åó+­ü<ÆNÚµ´—ik“ÒáŒ\ZµÖ›É ŸŸ¢­Bd.¿«¢nõúwäè1rTw嚯–¡5M â½[»­yg’î®Å7ÿÑ»ßü™ïøqT#‚z’t»3åNÁìôiðà¹úõη§d ÷ÖÜE®5‚ðXí¨*„ºRö³>n‡–Ó†2`H^ÞøÉàÑgîáñ/¾l+€qsý HÇâ5Ü™ðî?ù½@˜0¾ôâ /a~åS°×ÞÄñ•‡X^ù4–7#_?ÂðÌ}„é>Ö/¾‰|8"Ü3<ó¾ñâ^þvϸúš¯Âú¦á“?ô7ñø×_Fš3eX3÷×Gj„1aŠ Ó»ÏÃŒ‹—®^(.ô ênp‹Œä{z\ŠyGñn¶2-“$’y“Ndä¦Êàô½  жŸ62h9„·ÏÏÖ Ëdžˆy¯9ÂÄ1JÆœGL2²&Xq»\¢ i)O ¯RÂY¢"¨#¯ÅÂfVŒ¢pWÌ–0ªb-©äX,#Z„Ç~JÐÊû¥†ýEÆ!+îE#»#ü¸Ç8.¸Œ„ XVÁ ¹ØgV9-›œ@¡fw[åbðPÌ\Þ¡+§¡’à&´˜IzG~ßÈ{LƦ+C)È`4f…>ÅZ!Ül=å” T¥3ÕP.Ëáì]8ÍÖœk#º‚¥=GTZuòºošéLädÛ•j#ÐÙÚ˜êu§ aqaÞô6ö7=E¿|.媄´él7<=yÊžò{ìLãœpê`æÝs ÝĽâÔíi¿3=½èmMD%²í;¯Ñ¬e—ב ˆ¥Öp9mÂÄf±ºVΚæ>Ït«6À¹ÕKŸR›¯Þ G&yÖäªÖ¡´S”«4è~­ëK¢t™a3s H×1àÓúÓ¿ø»åòw]¿S¤ë5˜f¼ñû—5à2°¿[nþ@˜ÚÆòïJI³[r²~ѰK½ÉŽ]g.Mv‘õxW¥ºPÙàP Q$¹&/Ô†¦âf-ûöš{?:ù„=àúçvxýç¾ ×Ÿ‘ßx–ª;öˆƒÃ±@qÄþÞ^øcß‹áþ3_zžÿïü«X¿üe|á‡þ*öï7†{÷qóÉ/Ão_ÃÕ·~#ò[ŠÃ§~ Wßð¸þÇ?‹G¿ðk¸ýü+p]ñÆ«oá–Ô͈¸­²Œ„² Cœî ¦w î¾oÆÅWqñÒ æGÀí\v‹Ê®róÞÎ…>FCX™¾7jÀÈÔ©,-MF¬I2Wa×4‰÷D^}œ­?ªó•j¹aÆ #pwjÜqSgF€2땆–¦jKÂ"£?¥rb-Mĺgå4rËåð)6œ <:–'{L ’Ü73pL@ UEvÁº(-Ä®ìÅ&¸”æÃ3 S4DĬX Ásù~/Ñ1Ž¥"¸FŒ2Ãò€at\Å„Ã1^ ³>òزW© 4ŒØU Ö’:é íU56N¦Ö]¹·Fâjc¹LÌ®·®4R>ëšø+Ÿ¹Tö/¥QÃýfýfRוI…S·`êV×M„µéó¥ f‘A•¿ FØzn„´º×·rÏÇgøócGL¬õj.$¼­,ÝÞ¶/È=\ÏäQç…8ž±¬œÚvžK½Î=½ÏóŸû"u6½ž0ÊcW¤»òb”émá"ùlo]—¹q zý¶Ý²‘É\I¡o§ö¼rê~[¦¢Sµì5N¶G7|.×^"_òÈN²æD=jN´çòsù–ù¾¨p\Ëõ±ÎåÞˆ# Œ†î¼¹-¼¥ÚÒ9šׯø£ÿѸó±?õ÷ß)Ò¼Xþ=yÙv>8–;S{;ÄM¢ý!¸„ÓxÓô2—$P#:‰±‹§^ØyîVÊ{ŽúÏ­#£CY5~Ÿ õŽÀÕX¿¼úwpó¹÷"}>àöácîrFò´Ë©3`e MPŒ¸ÿuÁåÇÞ‡ÛO~Wûj\~í7!- Ò§>}öþ£ÏâæW~ãK<~õ1Ûc&úŽò³#òE Œ˜ »ýʱÿˆáò} î|Õcä}‚ÅÒ@,·e´ö¾ybAÝ +:Ô ^0튋™­¥XÖ‚X³†ßßÄf1ÞûF¦xâ#_?y3IÊÞüæóÀ øßþÓ/|ç_ü«ïi¯ÿy9˜åÁèeWWšïk!{Ô1ûJ6.áN%.¸_¢$(  é+Ëts¹!c°-(£)©(î j0zP{!§y ¦”¤l…l“q8°øä#`_n>þn<þÌ%®_SØs‘•01:±nq“+€­LïýÌy dÑ!ø% ºÌæ%¡*óû#œ©Ó+âû~×qÿC vïŸa÷çBbš¼ˆ^`îd‚dX4øZ8 :é–ãÒ – ¬ˆòÚ‰?i3@Æ3×V¡1®/tG˜š»k a ÉdÜ-ר:§©†qRʹ%Øl<žjIšN•* ÍQŒ#¶›¼#êVwäÕ1/;È´ ¥sw®ËU§”CŠG¹)n†Ýdø +F(²,µ¸ùPÑ`®Ø!#Œ«ŒqHÄàŠQVX$».U‘Æðb¢!ƒN ¶£”ûü*³ª‡SâT¸‹‹Õ|fG ]5æqÏýöZþ=3­,9iärN dÏ ÙàÕ ´F“:Izˆ§rc“§vWY×D£‰EÄ$N@ºæãz#mi,Ó•r2¶êß| Ä»Ýã_4EÈVøìIɑոÔõLŸ,O‘`ÿûù®º‡­§§ôÚŽxÒ«ÛÏHlëÙdßCÚk75§®Iˆmè°¥óEïa|òF´3.©N€URãGŽ­QÛˆw´o®ú}°àKõïˆõ¶Üñй@$—¢Ÿ'¤ä¶ÂçÒí]î ·77î¾Ï†ý¾äˆg,—éT§„ãa,Ö®ZìAE â uƒh¡%ÁdDÉWìCD´QG`6bÒµw,dÛ³KRØheÏVÅ=Õ¥47ª¥9 4*IdÁ ÷sî®Éó°#Î+ohÍèÞò¼«ÉI¸è†¼K Ý”{jÓ·¢éT«£__ätâaŸ»éµÓPצ¡ZCÂÚýç7-‡¸“øY£Mâ[ì)Š»7ûðº+åDº±ÂCgŒÁøËí….gÒ¬¾ÀúI,>…¥Ý ~ÆêŽg…¸½8· ­ÅvèöÐ=¼Þ³¿S÷{zïñµƒÔÏ]ÅVJîÊùÔç¼î”k,lE´ƒë­:ýÕó”*¤<Ãù{k ]ªjƒµ æ¨MÄØã¦Щü}¬ç2ïïˆk•„&Õ'ž¾±É_œ/–1a¶ Ëá“ý›Ý}ý<ü‡ï{9Œ€OxPår[—•;„P)ú+»ô±|WŠÿ¦{ìÈë;¦Ü:ÿ@HJ—ÂâÞ Rýšµ2Ç8“E®¬aÙËPnÞLfr¢ñ‚Qî­Àþ«;ï} ûW¯1f«7Ž.ao ÒaÁ8öÈ°Û I"EÒEP–Ï0RF¥»Œ0gè3òÌ‚ø< ;C|OÂøü-°¬æX%Mð%C8Ì#¦ñEš#¦ÝŽåz‡q89rF7¨ l$1“0| СÁ·üךþ”n€”½… Þ!ìš 3ÞG¢u<üka·Ê ‰MªL‹¦$nÔ_³ëB“^¢>´UFmÒj>mÕlû ˜¶v†9;D ®Gˆ8ÖU1¯E †€ë9bÓRUêåÀIÑ,ŸxCѽ 0tuÀVÃ~p¸ WÌ>ârȲ@5)"ù GÀ¥,pÉHvÄG:”8•ý1'؉<6’'`ÜÿW¶·R¦"ŒvÍÝu/hö­ÂB°r”j BhZ÷­ tÉr¢Gàg—åóÝê#ÿG€¨~¦5‚Rƶ¯T´Ä‹6áoR¨ÔÁâÕ¥k$|§V£Ö™cп6˜{›ŽSËyÞ¦ÿȳ4“H¢¨u…Ý;©ñ)2³¡Óµk¹¦âÄ—X=Þ‚kû³Á…rèEª²/rc˜zdqJ¨Qy`zÓ2ëÄdÄw_cº¦/ß"=ŠXÞ1F‡Ý(ì­7o(Gä× #ô" Ù tRHvä ˜î¬°}†_¦+‡_eøÃpáý‚dŠCVà8@íˆDb’ I: æðå®3†Áà6Àײ›‹O´(BX4Èà—TŠpZÖ€ì ɤ˜`:¦q¾a S™tצ×C)b2`ß|ŸýH„‘Ÿ[=°Íš|Jc)ÂÊVìüÖ×#£Hi¿™y˜:/jB¼"…HâÙÊá³’óq@ˆ{5HPä丘"lqø …{á0¸Àƒ—½|0D °$nsqoÛÀ³#ÛŠ1(rR¬1!d)›«ãÖËà°2‚d¤%"gÅþbÁqpX; ˜.s1Ѝr4^—¹nà89WBf\×ìËŠA‡f¤Õôa(„ºa_XÜó¡…sÂÆ•@VC22«Jê\ K}¯9Åã&Aï-&³úŠ[•C jƒ~âµê@eÀD®ÉX±ºßUm–ZMˆÆ6-ZåGìù|nÎ [è btûés_îÜÁÌèˆ]ÃS ùÓ$Xç,êžø%gR/;#õn`Ë©re+ú5гÄнíØ >Ùþ|©Ü³Ú)ÝÛÜߨ{ýDP`³ŸÆ#Û´[eT$ Ö¼yé×½‰IèÖÖrçA„t¸ ¢'–çf+M|”­‹3-„U òDÎaáôÌZ§Ç¿0_ÇÏýÿÄá—þÜ_Ž{<œ£œô㥆ÔhB#Ñ1³#ÆÂý†]~hªò¢×±íNj€8Ð>œ¸+Óž„âI<Ýç>óaéðZÏ{͸oòBbTõÿö¡T²03XÊÎ,ó&4/^{× ¼´Bo2æƒ`¯ vqå€]‘Â-’K -eêƒ ‚a—/ l˜dø£ˆÙ:(‚¬¤bf˘²ó„lŽuX ž4YPtjÍdö»‹)°àG¸g„ ð$qÆ<01Ä1Cl³˜3D …Í–2¦‚¤fBø>TËU­/ÉfN9W¶Œ‘s9?2„é„É#ß÷¼´ÏÖ¸Ÿ­j²Ö©×Æ Ð­K9Ýw»ŒdŽ( óˆ7!„N{P)Ûspä±Þ!+\ž ÃhƒaJŠÛT4—d-gqŒcFž#,”“ö¹Kà8+†P"~T i™0ÒMœ¼±–óœ»}ˆ"gÃ@ßt¬ez¨d¬Ty^®Wã¤<Ð0$ŽH8ɆÑDmŽn*´åû ´h¿85ݲ]XˆZ-fvipõ 7>ŽNM6Ùª4væNÊ—2‰FGºZÑ©MYÕbŸð¹‘!d/«¼“dm“$ºÁ`îXÞçÐt/‹êåRŠ'ƒ'r7÷Zfê†O¢.Ï =Φî>›ºO±bS¢ý$mM^Ÿ¯2?»†U²Y}}ÎÏC&òxh„"Þ<$,•ûèDKMÅ‹jÇÈî$–õì®Ñ'™Ù¹k¶já]»ë¡3^Q)çµLí=¼– åÜS YÂXˆÇëZPÎêf'Z®ã冤TîÎÈ5ZŽÿbéå—þÌ_xôKÿ៾|´B •˜°ãþ‚oR•gØÔ>Ëì rÛCm’‚ô” ˜låt(7dìÒX6õ¬Õ‰ w NYõ.Jgæî‡rÈåܘæ~Ã{¹NsàÖr°T-f~€;yÎЋŒc$] *ðKž7Ì"ÈjÁp<M Guè1"Þ H²"e`ÌD«¬ˆ1"ø‡4`ŸÉrš|¸cˆŽGPŒ¦!\ÞÏi‚ª#HÆr˜€1c ¬!ˆ07ä< 3|)ùÅ·« » KƆù`Q1iÂ:¼¬ `"˜v¢Íœ „ÅwkyVjS£ÕØÈr³­Ì2Nt3kd6tUX´ëÞS›·uOÌ™x£¦‚+ WÁ ûvƒbžw˜¦„d… p»TIË:aš ÇcB¢F\p1 Ô“$Ü:`kÄ8£’®‘Õrv\ì²+Pöû#Žó&Ï.KÙåwÒ–°³²WçëÓ}³² Ò4ÏB T¥kœxÈúN©LÍÂÝ~exãPÄú䦺[îwxYš·½±)ªQÛÔ—[á2?->•±Ÿ«‘É®Ù@VD­@Ë­X*÷µ!ÃÌuF]5x—¼øÚW{àjQ«ç†$~V°<éÓÝÃÓçù9Ô¼œ÷ÎÕìÄ?[»f œ5= Þ[•úé.k*1­3]©Pu•ªjÍS®ïÍÒš—ú¸~è˜ù5ÙŠÆ›ä55r¨°ËjóùÞùÚš·x…-½ª^$Ñ 0±›ñ„ALÕÙ‡Êi ‘u^H˜¼*×¶>æêgÀƱѺÏ&åK·f¡?‡üñ²éÑô_ˆ"íÿøÃw~íå»+<ÇF¨Ý­“ˆ‰‡³wݵ¶Î¯ 6ë¾ú Bw¡v&2ŠCS¥võ„¸·½…ë#¦—dvÏ4Ìàt’‡–…ªÓaÅæP‹CòVÈSýË€‡ ¹˜f„Ì7…¬´Rå\¡á”F$ÌpÉp7d‹±r–<ö _Æ 9#å]qÖ±ˆ2RJ”õÇ”‘lÂNsvìvŽÅ#²gds˜DˆG¬‹ÂC‰L/{š(æ¤BñwsL!!­ –Éw€gð¾í5Ëî3@B†-Š8<)$Y!¨„S—Å8Ñ$¥²lY$F~Ö5¶Î¨v’¡†‰Ù°`±·¦X—òÙÔ§&Ç*À:P3ˆŽxîbƼL‚qÈXRéòZ\ÆL2. ™b§ Ž<ä$E~†w†ŒŒÒ¡ ƒ#H©n¹9t(‰£ ,ÔaÕ€8d,fÐP¤Vy¸—¬ézXC)¼+žÐ1xSljCˉ¶Ü¦ º‘ÍÅg`Ú‘Ùz$G [9§ÙDnði É̘vUe:‰ˆFf¤„Eåt—[‰=U²³Ib“`)Jƒ']E®… 0蔥„ì+­'§Î'Aéu0´)®'›žÈ¡pÆ–ö3³ŸIšôLs,gSïÔAäÓYAÇ™ÁIŸFÕÿi¬í”ƒóI-vç 5ݳ%²ªÉÀ‘“êÚÁãh9íUç^ï!OQM Ü™Úp#qIë#ò-¥”ÔGW‡/s'Åö30@/ o(WËѵÅQÕ<ùØþNjsFT@yfTÄseÃ.ô¹ˆ à—exKÒ_¶Ùn>–Ÿ_ðÀ—Ï|àw~‘^nqó³—/ãØ]á³Ó •‘]½¸SÓûmMÝÝð¢›x¾ï6× v^Ǧ÷“‰“?Äê׬ ÿ®°5h^¢d ‰fëBB §˜a,ûsÌ”x<.û;8Íù&è®VÖëGœ† ðTHY>’¢‰a#¦1Á’`6ÁÖÕrD ezKÈ8"0QŒ)àÀ|¬¼„hX²0‰Ú‘V`‘RpOˆCÑSÂ~—a!A¡aEJ†G¬«`A VˆHi‚À±¬;DÈ*ÈÁp´Ëãt„H9ÉUkvˆy1 ‚E2d†ÉŠåªÙ6MmƒÇ‡ôÒÉpjPÆØ$õ€#« ˆ+í' 5?ÃÍ º×@ZŠ[Ø îÌV°Ó #‚f¨–<@ %ƒ‰`M‚ †G„!bR…N9Gøš0 Ž«ËTzȬX½0±%d*ôØVŒ>]tb‚b…/LSá:0gu‹aJ¨\¤í†–#­¸àﯰ5†æ$ ‰¦™%k+æ ‚¢îë!ŸRK!«ß¦¢³šÔ¡p†qho¼am2®0¹ÖuPÇœ¶Z4.Ús¨Ö.É*p²XxêY º}:fâv]q­ø+Èn¯è˹\hí øxV(ëãí §¯äÊô7vv6™÷.eg$XœÃѽG¸1ºs·Ràºo“cÕIõ†ŠwÐs xK8“Êsˆ?â=÷'7(>­L$dti=S7å@â÷W£®U¬Z´’­/¼Þ¤®Dj“9wï yVS¶À3µ~¦7ä´ú*rÂU[¾¥Â‡¦8‰§uõº0 °¦GwGéõ•¿ý5‡Ÿýþ¿%0ÜÃ{«dá>¬¿. ½~cûUOÙ¡¯±ÝD@»8«ÎÙA˜­J ÆŽ,±vûî9´ú·.Í©¥(Yn1fvàôÁ l3 ÙI%Ÿ­.*Vyßó€òT:¶ajšRSM®xvË ðÁày@Na\qÈiJܤ,G¸{!³ !)ÌrÊêLWÌ 0!mw4\¿5ÀÕqé†ì†€5’9<)b(±‹+>;F ð¸<@¼„D+lóeB,Fª¼÷=–0‰àP±z†¯K(IŠTr§s™Úœr¸"¹A’B`Åj•.a6æ”Ö8p$kT÷í𯱃‰)7ƒÒ——E#Ò•ÌB™ KÉ«Œš!àîÈ–Ž; .È6@¢`^KØ…Å€ü˜ûDqDsYªLY<#¹#ÄŒ0$D™ —Ar±ÞLЍŠ0.È’5`?”u ãdE^÷¸{÷P|ëÀ88,{ ˆ$˜¨²³ö>%dËêe \x‘qih~ë²cáO§~Õ¢¤åœ3‰C'¡ÈÔkjÜe Ũä2Ï-^r³ç­$/j·•–¤u§½I«V’j*ͰÌ¥®«$ 5øØ·ØRð ÖK"%\,bmú­Ìb'±j®ãgŒë>Z2wçÎÜÕßÜIžØ`TRäI–µ=eÏÜOñýT¼vß×ÙzÚ59õŒºéºsÓ '™ÕZÝÕ¦îyKc«{hE ;<Ñ‹n_漢?B5B©ÿÄØÎ­Gàùª» OªËœ¦(˜XXwå5,7lÞ¹'×±©A6s£\vÒV· ‡hS xÉ)€”&Sßìæá³ú;– öëéO=ú™ïÿ[ã=<˜îᣘDe B•DÌí"©Úºš1œ:ÙB tÈ<¬06¨J™¸„‰ßv#iÁSN%{vVdpBâajÓ¶„²‹ö¡y‡KÂÚvœãØï‹¤k²Ë ;j´¨q,~uÅRêÀ1dˆx ƒÂ­ì4Õ1t̘ƒÁ 8fÅc7ù'9&¼9‚’²' ƒ /——WW Ta•òO ȇ² tzy|3á0'H.Ðj¦¦Zµ8‘Íæ8Ú„9;r XÇA2à#Ò4•iña·ÂPàÛ|»,À<àhå ´Y‘Š´2k¤Xö¬º´@†è”·uAí¡2õ„ÎR7yñX«ö’:-@"œ ãP:¼…˜ äA#.ÈIrye4 SB”fÄ1ýh¨C(™Ñ“O1#FÃ4v£cFxΈX1dADÆ8:Æq+c(~Ý;]G jÁ¥RëX ÆòüGúÍ#”hdê(SñxQŠP &µ®‚ê>XêÏ“åê,¸•,´~8éVþGe:oòǺ;FWìjJù[î/§Hí°šb´Á™<Ó±Y‘VFöV×&“ªQ¦¶6b¼àÏðû¶@kùãÎdqèÑ5±«NbÕÊrÓ"W¤¯+DV×mÚÁØñìŸrʘ>a‹×ºâÔÛÎ ÷ú;ŽO1I!ľiÐN}R'ÛÒ³I§»òÊðÔþÌÔÖ½Ù˜¡ÅüVh\¤51Ré(ÂÞu•bùý¡\Þ)4ln*…ž©/Ë÷äÇ|y)KÍcù@Uó?Œmµ÷…¤¬le_©svÞO£«‘‡d`G¨Ðh * IŽÒ±©åX„tûl@$Joo[Yؘ׮C³X܆¿µÉäjŒ¬Æ¶ï­Q¹ËߘÀJ6o<•jÕÙWXw 1S¹ñò „;-Ÿz›ùÙÔ¾v”S³LxÂÇz+€½Á‰w“îØMÞÀ©˜†È5ÃEwånZNÓ´j¡ßŸí¨¥kRÎC;:Íôf"ζÖɲøyê¾#Ó¦.d£ÂáœB~Þ‚O&®Ù°XfÐÊ¡=7­äOï¤f•Ý9ÌT®<<Ÿ"V¯§Ü_:¶‚,;×å|Ž­‹é_¼âŒPx¦uqá³1zù»·€l7¿cŠ´eÇõ?֗嘞ś©UÛ7º¾ì‹×ª´þܵ£^ø•Aèdx{l0Ð*æ§ÆJVç–ÔÒûìJ#¢m‡ËÂ{‹ð“L¥yˆ¡@ŒXš®¯îJê]ÇøïզѼM~FVd~\ Èdô— ƒ—S–bêÙ<ÀÔC(÷Q˜1æ× ³¤#°dƒ„P éä¥Ä#.Ù¢ó Dà °1a·s Iqs,·Ê0K¢ÆÚãÎ S= P–¼À§„ »‡²ä´%  Àñ¶Ô÷=@,ÀR¢Á4¨Ü¶ÄlHE0ÂýrS°›ˆx™ åÍ[óˆä C°ò¹Uû¿n*sº¼Iät8p]ÜS³m·¦UÊÃëÀÝ0„òý»°–)Î34T\¤Dt& Æ€•µ€,ÀŨÀ*ÝÈSVdÛcÆl K ˜vGDs$XÕ1†#.ƒÀ’ D/×ËZdvÞfÍRšì¯^k™;cgiœJ„,U¿`T">Þ° …çQ#¥&_Q/\“´ŒžÝ>NÅrè´¬µ ÃRjfwgÑX]„­x‡Å¸î¥wÍsÛ´ý\ðSÙOb&ñV¤ºÄ¬Ú¯ ;4O„-bî¤C·¥àH(yȘø÷C",wE½×.“°·ÙcÝßY_Ÿ™•Ô!csÌЮØ÷¡c7@ôþÝÂa#wõ¦'ò Y>ãô¡UgmªÖ~Zïò½…Ñ¡•Tm€Á ¥÷À–?‡àg(Š7™V^¯]@ÕüçÜ8  %-B ìÚ©{*‘ÄÇA‹dÌX'VZœÙPdc³h¥áÜ´Ôµñ˜›r'ùíïŒ"mó[xôï¿,…-ú Ú¹ÅÚ5…NÏÈ ¦&¢¨´ÉÀ+a„‰YÃó¡‘¿Í… ÚÄòÚi8·Ýóܱ¼Ù™n Ntötd÷ ”™D†jdjéj1€p2¸b*‰` ÀáXº20!ÊP •ÌF±$Ø~€Pv¾éÄ!Áe…C`2bŒ‚´–€à*µ¬§¤ü\Î%ÕqTÌ™ød(9Ö&ÅVôp+8Âa&ÐÁ<"Á`«ADÍp# ÏuC¼˜‘D`œ´|†’á’¡p˜+]á±À¾³ÓþràaÞ&H»)¨ Ü ‰, »U¨G`JÐ ˜ÙìLì.W$sºÏϰ–†mI-³:kÕ)­¢+‰BËÜx‰]þÀF Ò M+Ùa)`Œ@É%“—j+¦É±ºcIca†f Ž3²-Ë‚CLƒ#çˆÁh0c*yh!fd¢z®É\ ÿõÈÓgg†Uì¦æ¨µÛq²©ñl*ÓJBáraÊP%亠¢Aµåš.”Kc!äê¿Ì©¶"[imÄÙ±êt§ØqFƒ0­N\&y[C¥¦¦ÐÊ)‰œªR[%å±-·¦BÑ΂iاªxe¢×Ðéªdì4Ìv6-ŸiK{cõÆ*?™¾ëÎyߊŸ\âIÿï~ÿœº‚™»ZWÈ» ùD²…§ï«¡ÌÖ¤n…[ÖsÕ.+}ö±+EPYø][hE!]›u§ïxfzÇ­ãïK7$(v‰l67·Ïmïm_‚v$=6£æ¯|äŠ0}m8›;rÿ\%sê¸-lèØiâTMu‘ÏÕàæwÜýøSúðŸ|ä“Ówx ‘ž¿Õ|½ƒÏÐE§…¡‘¸¶ tè̘õY)óõû+lm\AƒT­¥²3?Ñ žJs7¹Wøç¶³)LeqÂbé–“==áè„h„„²Ñ‹% /Öz£Äƒ…¹ºµÀ ¶ˆÂPôÏbÃãƒ*Ž«bWŒ™weP,Y yIKXCÀ²•›e-‚àÅKˆ¥¯ZR—Æ÷X¢?g+ÓòYÁ³ÂC‘žÚ2Ò‹;ãà†9+®&K„¬ ™R!¬.×èS†x€y‚ˆ”‘dXE lA”¢‚ä.†r[PN§© Á0:V²b.+üqhëqlSVêt·1T¸”3³î±%RšÛRš2¤ÅØWÀaŸKg@pÁ.(rNð©„’ˆ»š“ ±QÇRt@Ê’0 à9Ã$y`vØZ.­!  ¢´ ˆpOWSÇœ€pSbp,‡Ž°¡FîçS94ëJ&68ÔBƬ(’µš$ žéVf„Ô•ÈVè¼ tä-Æ h Ö<ºÓuóÑß&ànb´ÜöŽZç\mûZ4ïuå´¡Â@™&ápw?Õ ;Ï ;ÿè§>òÉ1àA¼ÀƒJ¢£&³G¤c“ÊHhwõà­š9GÓoÓ/oÕN*Á¬Ò…s#GTFhjZÝvFÞdýnæH¦ßNÔœš0á$î0Q;æ±¹õ$bÂ×wm: }ëS¯ùËж/T2Ü&Lƒ *+8n’"‡“Rź”"¥„8`UX.ápEt-¨…µ­0˃á¸*¢”Ã\“b·YƒyØhÀêZ&àÃ\|·Röàª@V .À0/#fsÌ¢HdÍqÇšKدkVp¬µ‚hHXIá",;ÖCazïö¹¼fÒãr=Dî¡×²Ê.çMw£[.I;NßLöi¢þ}"SM@„ìñ±ó„÷½C‡Œ¨I^ pRD΂!:¢aHv9tuÄiðFê&àÞÑ,Ÿ2ÎõlÜ;!„é©YŠWÙV'O®ò*L^£^3ùÙËgT³ËíÀŸ¯+6`»]hÉ\åX3?žšßD6”]󨫽ìª×~‡Òäö÷Ó=Öƒ¥É§}g•~,G†6-”iV©çØ 8öÅ%U#%rËñ•1A¿öŸü¾Ã/|÷ê†]w0¥fïf•4Vw"¡i%·¢Ü¥´lä4M½x=4Lû‰cמÓ6£9õž¶a׌áO̼ÝàUž²¤xgYWw߃Y€éùráŽ^·Ê`LËcDN9ÃÄéÏ1ìXT! ¦+Ö4"›ÂRbâL@^"V³R)Î LÁàjX ˆÑJÔ¥æÖh'+s,KÀ€«hX¡X³@ܰÌÌ*®.@9ธ9›AÌ‘aXÃaöBª°bBb¬kÄÃèÅ»tïs2N¾ ‹†3v6aÂT dL®ÞÜ#âXŠ×Ú-åIi 6IQ²°¹«ððŽ~6Dmơ쩫t-ÏÜÅ’@âhˆS¹N%ö½3Q*+€cÇ´;‚#À‘Æ.¤`è®èdöŽ˜*Áƶ ˆÝŽþÚ#0]•î=haZ‡Øø ÆÏc¡†òp¬‘s$4+ZBP]ó6C(eB w^ÃÜRßê{Q¡ÎÀ‰3K3IKÓ¸ÊØÜ˶æ›MsN~whÄ-a4¥XÓ¶ïyc^´Ó̦oXâ™°¶×Z5Ï”Þ7I™´ÉqÛ×ßS‹J÷wîôèŸ[A«ûiKmÝàåžÈUÑ‚t¶WºÝðrFüÊ8MtZq.r¼Ñ'Syç¸ågúâ|aë“Nd5ëà$Þ]’»¦%µë«zTÔ鼦 nijŠvV>€vºæ¹¬.eâ½ÛþÞײÒ>lj¤ÐZ]­“ÅÖT=Ù5âžMñ WW•C$’+¾Qš6NÆœ;ie^D¦\+'@ÆËÛ¯¸"mè;¿ò¯ÿÇ>àA¼(„”Ê¡£ìxjWâ½SS‘j>°]ìÀiYÿŽ,ñøï‰~±™;’sÚZ™C ¶ÄÔbt«v“u×trS¦NÆÅžÆFfÁu9ì…ÝyíF‡}#ž <ØØ„ ŒgÌ•‘šKÔ`÷±e(O7(.TádLÃ1$È`Q p0+‚hI [µh¸8ŽU&3’:r0,‹a]l –¨;¾¬Àª†ƒÖ\þ@¢C+>ËjÈkÑkOSq5˃#ǼÝ‹*rŠð1N E/±$@m€YÀê‚ÕV7ÌÉS(ax­l’X&aç¾?S)Pã(½BÞu BÉt®´“!<ñzؼРmœ®ýÀK0^%Séì&+ë‚\&öÛ¾¸úDï”Å‚«¦™ÁUOº»Ó’†”3 ¥(G†TT+Ê!ròg*˜F`¿ãë]ÙL^6èp BiXöwË㎙…–M‹ 9d…’w†‹®ÐŸïLiþEú'Kh÷BŸvµÁ»ckZÒ£¼ ]6òÇ’{6mj­ÕßÀWm°þvÏWiUõ`ˆMžSu¾jJé,ÑjÛÛ¢5í›'8Hüê^ã¹I‰¡+°rúØ'¢ýt¬8‰ÒÜŠl_øµMë%4?•JéÔM×`éô¼Ýs•©îTl,lTôaé å±1ú½SOlÍD ±¸išã­J])%PéXÞ"§„f"õï¶F$u:îxfP“òQ_{5µÉ©(ÜZ?´Übóœ¯÷Úfò£@bs%´t®òÛ²ûJr{õ¿úúÃ/ýþS ŤÄs31wîõ6fuÝQÛ›šŽÍ½è‰0r4Ãù˜×aê C·+ê5¤Û™t&÷ž:Ù€wÓvì:¸±+¾ÖíJÖNꦻ›Ö—ÌÉdm@ Tn·<~´dÄY(÷£#î2lZègÍaÈEËlÙ4ZñÏPÇ\ÌM|ÑÂÚ ´hZè}›«Á€Ed‰R®nÌE0Ð=_M1…»`IÀjÓâ3=RŒnªØ p'*¢(rL°¬È®ÐèP]àsa‚Ѱ`6Å"Š‹)c2/µ‡qÅ0Ž…ø2–›iÛ¹å`‘Ò;  ²ìå“ÞБRX7·GšxØØâO“Ó&“Sù+²A‡¹§2ýÆå´‚uÚQV¸0„–;ò#h*2Õ}ëE˜"QtF%v\çsïwÍl£³D jP%%ˆT®_›†òû†©Ù[ÖuQˆlx.h$ÔYg†N_b33ÉNýyeü¦nš›lK¨ÌÈÇf²9Vɹ“þtÒš¸oá › ¨®Ï¤!Æ]¦£%åùÜàøMšSýÍåÔ7áÄ~35âØ9¦rUÏlíݼ„ÌàZXI8E>›š§žåuZœÎ èØæê^aô¹‘ò*s³AíQŒÞ¹kse ]LhîH{ÞÌhêÞSCLºç ¦j›6«£œ Sî ’À ½¾lrÖÊú¿SÒªjÔ¯ÝvD1o¥$úa)×´Ò ø¹[Ë‹î–&ï­ ˆh9'æë&›Ý>וIlÒœý Êlö;×_1E:?ü‰wÏŸøÁÿBŽeúÇÚ9áiÑÔûDæ¶°`rÆæ¾îãu_ _½¹kˆLb¸@Ý×ûJSØœõ|lûÏHŽ…^ðÚŒMjSañmrÚ¾°&cÉØB7¶"çͤôJ0Úl!çFª½tÖ–u%&cç6toýÜWV3¢ÐåRo2¨Z(YÔ«Ë /§¬èZ\m>Ó"×ÆÝšTl+ÌÖÌ]N fíGœ¡‡}XD<Û3§™ÔÚˆa;ËWtd<~®š:x~è dmp¿„â_îD¢ªK;’o]#Ô£‹Ô린6:ZâØÉ´î\VÑ$Ý•û.w;|¥‡¡M¸›©Un©kÖÕƒ*å ˜oÊ}˜jâÕ®<×X=h^êÚ†JÛ±o:v+Ñd…8vùük_E:?þøÅÍOþÞÔ®,(e5GÂY¡͸+]ñÑÔH»bó\öËSÛEY\ ¡äÔÀZ•ýe¹Æzòvƪ±ñ'¢» \Dî¬)•RœqjÄ«8•ƒe˜h®S éb±­Ê €ñn»^Cõ¼Ž´¯85OÀX‰˜šJ¨QÆæ^~Ÿ¯tŠ"$h™F?àz¡&Dqbª rd™2eK9øêá é˜ÌÕ‹‘”J’Û½¿ic»Bé©H4#áýëcã«TÆ7´KE í9Ô{²fS×Ô(ãÄjÖ8üßYij`œbè&ônÕ†^bp])ÝcáìŸÓ‘,uÏmâ®á"N‚•-åg'áªþè•¿AùtvÜ^3÷´±©þç~dñ|n$.nZ÷Jîë2· -DÃ3ÍIæÎƒƒÜòf×€I{­°ì¦Cfù™ç#íaÙ¸e”¬-”ÚMyoF7¥ù­öζRŠ5·PËÅÚÊÚ]<ûÆo{v·>¿ú»þ©*Œ‘å‘S`ôodkðrÍOµÌI–ðL %„Ô€²Ü.ĺÛÈÍüÀnxðÍËKøFJ1´ÓDZllQ,N©D¶ºãª‡æjÞ™äo°L5:àÁuê„1]q?8-;2äœ^kv<I‚¨1ƒÁ¸Ïæ…¼ +Di!"âƒÂ<#¢8S y@N¢F Ã4‡Y‘†b5ºÔİ0OXy˜”S±'ÀÕ·nVŸ Žkf²J(1ˆ§Ž‡7ŠýhØ…rš¬«ÂܶÝá¼.EqÌeáy1”¥½¬¦aEV……„$!8îL+ò"e4]y'Þ3€7ÏB¹”%2­½< ]ñŽ“çÌ}îRÌ÷-—®z¬aß{Jš²74T‡»P´Å•ô:hz`YcsZrþüHâNµ6¬†8Ð6‰khf9q,lÿZ\â@ý.Ýïp`1He"Çž÷PµBä¡„ 1,Ìy¦.<7Ƭî˜ï\÷|l„‹fàu­gòÇPƒe(wª+®ð4ž†T…Æ– ¼ï’žÉLRš3Kø„‡Rå9\ky¦FV›y†UbgÈÑvŒ•ü¶e Wmm"Ç¡ÛmV7®ºNÙ¬{Ø{lpMêê¥N'ðùÜا})Nsªq¦}ÎO™¼ùøy)M‰„¶§Um GµÊÜàxkïß68ÐT¥ª]t8k$ȪïÑÖsÔ0´½ôf2uMDM£xeáƒ¤Ïø&mU£Z®}—éo^î—hÁ*l>âž<4¹e]U #%TÒV_Qá1R†YeX½u´× !­…¯óé0½ïs¿­'iOqøùþªf<˜žmhW°Ó²êÕ@£?2z’7u¨;+îµór­ 9Õfó„åX¡^4yn‹u6yF9‰ãtÿc §öÝôÝëÙñWéŽÍṴ̈æÎðŽØ:ÌoXÕº7Û]‘uLét<Ýee-’€‘~ß«”½ènWB\*É$.0OêöŒQÌI±ØTn52®+¬È#‚`Ά¬Åó{REÇÄÔ„}2 {/À4Dk.²ÉJÒröPì& `Y×É!ŒƒÁb1M‰Qq\3rh\ŒŠc(ÁC,ÞÝÇY‘ƒ! Š„CÈD!^î\‹—¸hðÛRˆ” ÕÄ&†µ‡ iVÛɉÓ.Ù›qvc;djC(u/Ë‚\傱‹Œ¡ñ,rñ*ÙXÄ5&[»Õ›£RT4–ézÏ)¡ÀÜFýufq]À™ž&‘Ó,aó|Ãâ±´){dÑÌhu¤F9yÕt’\WÙÙWÜG³‰öXšÊx³g´*ïÍ\  ÐrݼªA^òP¾$JudÓŽSÓ ê¾%Ú5ÀÝ~9£i•+¤Æ8êþŒ04¶¿«³Nm-Vå>n]Ú—vü.ò3êþr#au^Ó[èÅÐRé¤Éð6ÎcugG˜ žâ#†1×¾ P)…Í|…†ƒ—¢H &소d±2Mgn‘`ªX’bP®ï8Â0Ã1©`2ÅjŠ£YAÌhš¢Z ²–Îòθ1¸=쀌ƒA–Y VÆðè'ƒ¦€ã<`˜#vH)—õoà!ÈX:6­…â æ4»02‹‡‘q¥4×z¢›uŽQÞv“cµÉô2I„ê-\ÿ,4hWȸ êP)ÿ=T$†Ñ£Ãȉœp{Ø“àF¾ÃJ"°#'"Œåµí&2ª É÷™ÀzÕ1ÃÉ8ŽåqÒ SÛ.ÊŸIݽ^± ar˜X±ô«âa&ÔΊQ˜å\µÔ›äŠ“æ¸c³šÙ…uų‚ŒûN5á§Ÿš4•Sswª¦©#’¥æíì¡ËFf²®˜w¶”ZDéVt:ÉMõi(­äß»7Íõ¸6—®šÀgGÐL¥­æ6ís(½+¾µï›[×V¸cg¤tfÐÑFÞnº]ÛšªJÁz#Žñiét·­„õ­—d….Æö]šfR¤C=jã±¥ŽMåŒ=1FYa¸&ªm²ÙÐØï'Ï·7¿a¤å¦˜;Òqhï›3åL:=}^ËŸ-©CzB¹Wþq×xR¾–Ÿ±#•N¿ú‡G†+@yý¶„»Àág§_Ö™<´Gbl{-K%u¦: ÕNÕÇAËá¢h»­ê4¨ÿ‹´ÌG^s»!3a•©±í·ëÅ\í 72ÊŒ“|ØêÜ Ø áÐÔi#DiÒix èµ´½¨ì l/WŽ…ŒØÍÇ;dJjQ¤aËá¶Ë-S´U†]‚G¾¶ K»KC¶ÓàÈÉàa1CS܈»Á0i2¬®4#z1 0̈ȫa “;ËâW–áV7øªˆ¡Ø}#+>„îf»É!¢°˜1sÉĆ#ŒÙƒ¬ËTvP‡ˆa\›eçØu€‡¼ÁÔÂý©ß%ó˜»äj­º.åzHJ©ìŸÄÛ ?’˜ØqÊ4J³’•Çù3÷¯±¶m[zÖZë}Œ1çZ{ŸsnU¹lcWù˜*S…±]L"ŒD?Pb) I$!$Ä6‚Žc @x„8‘@ÂÄâÇ‘bE„·ËÆ>¶Á.—«î㜽ךsŒþÈþ}½µ1÷.S.×½U[::÷î³÷ZkÎÙGo­}í{Ë"/ ’¨B`88Yó5²5Æ×û¹¼Œ"×éØÔCÜŸÕ; Ð0xhgkÙ|z*0ÉaS|M„)À…’d©.aŠÊW °Ô-Ý =’µâΟ— qê„é^c^1\œhµØ±Wg§5óÆ)Xã$.^üŸBñ EÍBðý—HÕ‡‚xõ”÷²QC;×HszqÅ ¯Y:dV=H²p‘*¦Õzó]± K©ãFsPwø% H‚mØüΤ,2r_Ñ”ÓmŒÄ¦«œ|Â'9 ´‰Og³Á( %a Í(ê›|à}JµJ~ÑŸ˜Û¹ ñ¨³¦'÷þ›„†HD¹ù를ò3•q§•÷A"ŒTØ4õæ1­ ¿‚À+ mQ2‘€{bP$u’ZE3Â0£æ^3(% ]¼([ ¯q•sÑŒ_q—ª7 –ΔÀnX^¡H¹b“€³q¦È™ >‡È=­ãràåÇÝà”‡èèX¥‹,oý=P 3"¨_¡ƒÅsÿæxÍi…<+ ÒSl¥ÝÇt—WGŠÈÈeÖ6‚,r“r$¹¤.{kRˈMÜ.lå.¥èð­û±ö6¼js:à4ÜÉ8q,xÚ–%å6|sm0´KK’¤IÞ“h‰O¢"IºìÖå°&[Sy£&/2$`«‹ç4uaˆ‚†ˆS ¶¨wgåKÃý_çSØE4b"»ûPÄõÁÁ­<üȬn0þ*’o·ÓtƲ»Ã‘ hh:òtÀU`q×znH&Ÿ§úÚe®Ô <ÕÉ…öÇä2¹‰ä7Wît¼–‚?Gú¼KG><ÞÇhD¢Ÿ xX¤ä{õBXebWrÕEǰÕÛ¸oihS¿t‚®"û—hÈXW€œ¨1Yüõ.òÝ¿ð×þîŸW“ôþßù«^ÿßý[Òˆ°ú+&œü\“C; ŵŽ$8L3êÙ³Óe‡Fs³†Ìí3ºÖ¶ßÕä.Ká‹ ˆ° CšX ‡v}¢Àü,]ñ€cš XÉ]°ò3ˆ9°-»ëõÖ%XY2pƒ9¾°[ìû(:ÛfðY$=UQmÒzÝvY/ûHÈJUL²$5Y­H.Y¤šôÔ‡ÖÙš¼ì&µŠ\Ĥt‘¢£•^Ö&yi² ¹}7Í£mhŸ7¬r·åÁþ~Â¥s­cs}?ü}(%I/I¶¥HÏ]Z[d/WÉz•E›,v—R±W®¤_ÝCSð°Á׺¿ÊxQcå‘ÁêN(м×Õ­Ó"rA!¼…¨Ó”á§ŽÏ%ƒ\’ì=§A0ˆœ·òâ ñÜœ ¿­C¸lÞ0ägo éÇž}™6H¦ä' ;VÀƒKŽbÆàóݯm~¡uó¨Ôi:‘]ÊÒÁ#8¾áÞÌ*€¡õ× é“ ²:ü­ÉFî§w¾KÑäî€óùé§/î앳K¯ºº©Ï)7X‚YÑÝjz 5oèþÄw³Ó¤„D¨¸wNŲŸ%`sÂcã~}˜¦ÛƒJs-ñé÷% Å‹ÃiçÜÀ°„©; -`ÓÊs 2L:Lƒá þM¶Nhx­ªØ ÇD-2êA k·³‹#wàÖcT÷ oÅPWnî1c4ç]]°Êh^7¬:ò¤‹'R±É©PMV?Öa÷dSÁr5/ޤtäYÛá?7ë„è0:¬7ÓÑx,?øû~þéýRï¯ÿ?%‘ÏŽH0œŸù˜›Í5xÔ%'87Í7–nOOAäÎ ]£]‚X^œœ‘íìÈ3íízx0w¹1°€Y€æê0‡ˆ~á4Q‰ ÅcRŒ¡€ØæSÑd¯‚º|@sGµNÛÂ>´Ó9‰,Ÿàg~ò¸@£=#Dõ÷} ¾‹Ôû*}i ö$;äšš¤E¥X“Ûž†ÛÔ2žÜšT´gy“š\,‹u•Kj¢ÚD÷ÁìÖ#‹5“uí²I¶#‹ê`u›©hSY21Ä&Ö’”c°½«™,‡É¥ÛðÜ•ëÒ$¥$y½K–.µ,#Wû²KÍ7Ñõ.šv9ú*yëRzM*)õ¿¥à U²s pÂ5ßôvrºb Ë”v”¦ƒ4Õ‹ïׄÁ†iMi$\]Ì=à3‡÷Œyh¸HL¡ƒ—Åáwjªwg²f~LÝsWÞ0a§³Ç²!nòØÃÙ¹®€ß§Ý&HgS&gȯ ­0"1_/qúÝÞóL€»â¾àï‰ën-å)wºÆnrÅ„¤^Ô¥»]MáyݽÈø'=ØfÎ=æzÎŽk4’¦èË-JmV§Õ³`¢xv¤òMÂÔáÿdEÇñЦåøOzhêYn„¶¨wÞý¬÷o…b[äì¹Í¯ÝÎ2V:l…Ýîd¸—÷ð5,X|š“lib#¡¼¹M¦Ð<…Ûƒ=isù soÞ@5H™ 5ÃVÃÝ‚…«ìdv 7HÇí >£Šé^Ñ*ÈUݨŰ#IØÐø$ÆÒvŸÔ;þþýÞ¥‹|±|÷Ÿÿoþ¼»_þÝïúF‡!äóÖâŽK†Å{5ZB±–< vå.éâ¦vøáËËÙ„¿…È5BÇ,øöä©4tI"ƘïQ÷ †‚P"e«OªœdëŒEªïygîÊ„á t_+ÆÔ«ét†ŸÅ°ÞÔe@Ýn”ƒ˜%—¡ÿDZò­Ñ˜u°Ç‰¸4LÊ ÷ É{ncO.Hœ³Ûø»µ¦1!ÙŠæ$;y4Š*Óô‰ìtøÍ¯&²}ÏüÄÏ‹Iúõ÷þEÿ,ž>×"Ê.±À‘/:èô #™0„.)$±TÍâã„ÍŽ®¼:©ÂZ0mgTåæþ²rÄÜ]VßQÓxÆcšk® !Y}W>;· —¦4­ƒì–®ˆ@;DöoŒŸqùdLDûá?KS°×a5·ßD°Y §ç;´·oFa¸ôh®bUE•V‡7wO"’»$ë²^Š,ùÜU®—.Ÿ,M–4–™¹‹ä¥IíET“¤Üd˽ˆdm²7•5«¤|ˆ©É›µË5©hZDŤC”»è ½ #éØÅ¢Pb$²Sx¡0$€* ¶QÄÊ}ü;-ãuThd;ü«S|„šüU¨Ù¼³Î0 ¬+h´/ÈXn0¶°+˜Ü:ŠóŽËãòVäù퀸óÛ†B¹Cãü ÒÖÍÑ…Ä‹Îgìî'—1¼C‘ÖCô@HT DÆýuºÎ_=L€Æ³¡ñŠt¾c| !e2Á'·°¸¶x*/ÿvù½ÉŸŸŽ"9Éc)°y%X@VÛ`±™D¶‹K)[ðìç¤6÷䀸e ¬÷ær#®¢XÈ'c=2¾o¦)îŠåáŽÐPD"›#×%¶*§ ‡ù÷ü{²å×ÞäEg- æQ¶!°'Ü©- Flt]ƒÇ?¿˜FÈõUÂÜ¥8štB$è:—Ýn"¦2ž~öíÅÉ‚íÁߢõjÇøs3â’©j% tˆ\¥ke¾:ÂQÚ@|2«”=ÿ\ò¸“ óÕ•m¹Ž;¡˜ˆ¼AU¹¾ý%DS–Ÿó"]þÈÿäo”/ÿ¿pýL>¯`·n«G¢IðØÖŠàENYÌò…#I*ÿ‰]לÃ?Wa‹·#„­‡O…"ušzãõ—’pXÀ^LËôOwvxsm% L²cÀŒÝ”@üÒá•בì" nk7 E÷À 5‘7߉êV}ûËØ¿­6ŠÌ¡°Ãý¤K²&¥$©Å¤+Ù!–»ír/"[>¤Ö¡vV5Ñ’DÕ¤kÛ³hoÒ—‚ƒœ$i—cNe)iž\¥I6“U³(˜â» –yÝmXœç*ûÝàsœ$­‡”<ö¿Ç.’z—UŠÔÞ¤[F-­KÝu„SY8t4.†„š¤c†2úçÞE.Ï>ôMpSr„¬ƒy¿@o<§Ü.r]|ÿ]aht0°éóΤ©¼úúFÛIÑ-«8ÝX(÷¦aȯ‘äeÀJ‚ Še—±³¦¿°v{ëR/̓$¶> ?ùŽ)jéHãz’tJàƒ2V¤{u ä rPòÈOöÊàÁ=<óÙŠd¡—aF&÷Ý9‡uXö9Ä$ZøZ¶¹Ù¢YkØ+~0y¢áŸ¶ [0áäOßïâIyi{p ZñÉÖî)ÂíÁâ3yÜ•·sS"È­Ö ¶{ÔUÇ hÜ“íî…Ý\&1Ãù€+ FäN¹WÅ^~qÿîŽgf® [š®¯W¸õ±9 ùr¾/ÙW-ØôWdƒ3å*4ËS^¥.qÍ—ð5Hâë!š3¤§ÕR¸¼¶ÅyðhÆJ£ß]šG.ëIª‹„KMþ<Ž/ßì"éÈò ûwV ý“ÿÆç/¿ïøÛ4Ëç儌= ;a&¤ªßB89»¢œät„n-{ìÜì(³'þ”âðf~€¢>oZgýÉ=ÖÑ %\ô gKjyñ=uG~>?orsö_ú,tÄ›l¢Ô÷cw™.ãŸrT0+0•øtlô+HB2˜†í"ùÍp„ÊoG1¹€a»\pùšH~êƒy{i"¹H»›X:p,rÜ7¹ˆÉ¢&¥­c¸ÑŠn“55¼´6ˆb}‘UAÅl&½7ÌZšûÎAj3¹®Ur¯R.% []šè¶ËÖLÞt‘ëÖE¶.ÚŽAʇ¤¤²©çZ§í–Ò¸`èUÚ„dl>óâé4L£ñïº ,< V) æùôà’0¡"Ù*g “WdÌî ‹-cÂ^ñû—O@P!AéÙã!i€¡ÛøÌب9â^½Óýì"c½€3›®(ÂB1ò¸dvì —Íµ®ý/ž« •ar`ÔjÁÙSJÊÌ'Ôjîê×§¨Ø_çä§µºý$aR)”.¢iµ+8ìÅ)“dz—æ€Î†Æ]5Ø€’½žƒ G|oÜv7c¡Ù\IõÀeæ\‘.ÆŸ½7o†§Áˆ8‚0ù'`¸G÷ÂSÌ£v¸†Á¡=H²8In¾;ÙW2b’A?=¸½µñ3ôýŒ>Ìï§¾÷64BÌI ÅªD§1zQ¯þš[ºwö Õ \åÅ!äˆ.J>GYîïð5ðg.ø ¾ÓwB£] NÜrSÕÌÏwŽéÚ¤t I¡O_c+Þ0v4ô+3Ýáµ13 :îÚúù±<È»ôÚÐ:Š;-VŸù_ùÏÿÜé&rü¾¿è_¿|*Ÿ§<âó齊=rt~™²xe[ƒ(…Xü¡ÊW×§r¯K=bÆ4´ièrlÅd…›³móÝx­~ä%ˆã#Kôà&ä-·|O ÝÚ‹œ“h:dXË(¼t½I׳–T@$âƒ}fÉ‚¤¤mLBé5 ºm_—Ûíû@Ú3v‘ý+‘ü™H¾6À®WYömt‹ÒáÕÅRÕ.÷ÃĶ.yë²·$ŠUURjÒT¥j•¤Mž·*k¹7•švY‘Ô›Ô¶K“”Šh2Éš¤ö$Ki5I­]ZͲ¬wY¥KJI¤¨˜î# $™¤Üe—.š»¤C¤÷qk¦Ü§‡.£ 6Àï¢Ã‘M£»Xv#2r;´“i©‹r^F8‰Ó"Eš¼Í+ú°î{Û̳×s ع_PÀn^®Áa‹†›kŸì¥;š>…mhÆÝ»º-#Òò)œÅŽÕLË|ÇY®»'ÂѢテͫ²¾@¹TÝ_Á>gVú3vzÉ'ëáòîa''l ,edZ¯#P”ÁdGS>‹£²,)gƒžÝJR¬¦ªï|M ÈŸ‡0ÿ,¬¸«êWîcm!jsNäW4&åa¯Ü>b4bšèÐÈî±›Ó‚Pt Ÿl>%¦HK¾ï7¼§/AƒÆ{Qá(Ö*ö³Ý‹ötð*¡¡àká×ÆÚˆ1Ž­ ëg¾Ní>}Z Ҩ殎=ļrÿÎP‚áMyAÒÖöî”üHs¦.¿o‹ì‹|±}úçý[?§Eúõ?ú‘E‚-à‚Ýìý%Øë‘Lp€`k®ƒänQ/Ε»[¯”"[ofÒ†½NË)i vìži^@¿fy?´Õ3T\ýa/ZÏdƒ-ì¿ÂN{Nô‹ïŸ¢;NþÄSr úkþ´ ¸¦¼b·J‰JO”ÐÞ®¼ˆØ;0»ocw½^Ðð s6n"rO²\vIù£7Ék•eÛ¥‹‰öfI²­CfµV“TšhysQɈyiµÉEMrJÒ%KÚšT©rQ»Ën²æeLÙ}•-5Ù´ÈS¾ËÅT®É¤h—mr°¦UªªÔe—²¯¢REÓ]T«,ÚE›JÎUòR§Eæv †©Ûy&yŠyâaGYöñ^qR¯Û˜ˆ AÉÆ×X×@RéC3™›ÈD´ÜàéËI¸ŽïÛ*’’:’¦Ðdæêie²¯Á‰Ÿ(Ê~ºŽ³˜0ÍKÁ¹7pP8¾©€€ýYŒî…Ò>\ô1ÄÖ0yŸ6 ¼Ž5»·w4g0$µÃIo3ßO$B°­„ ®x$%-]Û݉|ûD {`>Iö*ÕeB­S¢=ì¬÷ŸE™ yÅ Ym®™%4L™¨’LXôDívžhÌæÞ9èŠ'+;ʪR0‰&t•kÎpVA+Xo¶lA%õ8¡·3Þ«³ÒSò÷¯ƒßBØ8¡²éRp|Bn7%§%¸¦‘ñ-—`÷¹„{Ï!Ã&[Ï] ‘›s}!Nbk7Ô‹¸BxdÁ'w³ìÃ]¿¹¯ø„û!D©;žgÁ]Z}u’ÁŠomüþ„8¾çÓ›;éá6yÆT¿è/þ7Ίtû±ÿÙo¨_ý;¿fÉò9É$šÔº©ˆ<Ë4tÇýï¡æùs·ÜÃn·;´aa7Ãé{²Cc¶,aÅÃÃÇûêìÔé–CÉNòØò˜’Ò'ƒ9IßîYt“7ÜŸX_ç­ï:fG¬÷Ò:Ô miñ£¼WÀ©FÍ!د´¤Ûï†@‹š"ÓEgÅdYŠÈûŸDÓXDî?žF"ÓU¤¯‡äç]>ùž»¤­HÎw±eØrnk‘ç­K²AÁ¿^T.EFÏ­‰$Œ&ªE¬uy³5i5ó—¥Éó:0¹»¶ãŠHîëØ!nER¾‰¦"Ú’¬Ö%k“ÜŸ$õ±?×T¥v•\m<¼k–™=Iîx WìF¯xìãýX“Èí&rG¤\O4xq¨0!«\ÁŸèPp§¾À ³wws;€œ´Éµ{OÊHÔ-8kkV—p(~æcñgz÷ZD·º÷µ.8ÃÐ$ÊN`÷ÊÝëhe©0DQ¸Ó¥Oo‹OŠ ÂYøÿM½¹“Ó±Ê~–Cu¼O’0½_\¾ÈIu>'q·I?û'0Š_gã=æçÈig§ ݱéV…©P|†«?—“r¢þߊ)=‰”~Þt÷ãsÙ»ïaérÆ×Ï4´¹·»àLQ¶0m/AšÃ®9æ@‡ ”Ä|óÖ}\^=äb~ÿ¨½.?Kp+ë0¦iÜ57/àõŽxÈïmXap š¦8ø™¬81V'áN_pp€"°F¦œ•Æ(óî|˜š[!Ö6‹|$qþO$ÒYxo-¬`ø–H(²“éFာ’¨™À¬Š„çí“ “"?h§Aº™úW²¼ùî¯Ûå{åç¤H÷Û’ûúm¿u¹ÈçÓqfÔ±‹è[¸µH°ÿ¼Ös¡÷°/FÎéÜ¥\ATäFÙFïn%w‚›ì¬9´Àø&œÅ Ù©ý3wibwÏΟ²ŠN2Xss˜V„]“…@Žþ.V±—Äå9ôå^_М®£0ÇÒèlF¾Fò¨Ù¹òÀûD’U W*RJ—ík¿âGcÝüŽê¤_ÿýÏÿ@†V¶€¡Ì87dãŽæîû6ÝfÛÂ?ÃÕ»ï²g2ÉêÐUÛQÀzxFè_ øEaÊi)>óÙÉAox„89NÊ÷³.Ñ"ŒÄðŒºÂØdŸ“!Nç³E¤}‰×Ç|btŽŒQä¦&;§õiì’Ó 6-ÝŸÊ€BN7Ù|GcÛhÖKá)#M‰I߃9¬·º’ÖMZlìcWɹÉ%õq™‰ÈÞmXr&ȼ¬ÈÑL² }õ}mb*²·&_Ý“l)K–CrJÒzM»h7I9I²Cî5ɽ˜\s»ìb%K=Tú2¬D—Uä¨}JC ¥uˆ,Ð4ƒä·€ÿ ûØßkÂZ± ÂXË(TixX×2Þ+öV ZH<ÌëêP3µë„̱‘Н;ÿ?v_]à N½ñ N_,ÄÕÏCÎaR‘Ò$j-ƒÌ¥dwõ"éÊšOwŠ©UN¾[ïêÙØõ>VT "–÷ÜŽM/ÓçHÛd „£hFÁÉëê¨EzK_ñ5Ò$ò¤s±åz¦…‚Ua·É1¦*Y Ó°9é‰Q“†=¼ Õ»¨Ì½fÜ÷î!Á#šM直cŽ–÷@zø=}ÐBÇÝ´=8wE…dTøÒwÓözXùõ‡ï§®Mç •.ãgìäÎd‡q§–ü’b -¶wÅØ€ÄÐz“Å«‰›‰4ØÆVÞ¯Ä0 ™‘ð–®n3QŠe îÅ¥YÐóYNÇ5ŽòçèîBÆ=y³±zj0Ê+8$‹›eÙ³+Jå(<Ã%oß\Ðüô<ì“ë½}ñüKþÛÿ¼|äãÿö³¹ÿàÿo¯/]’Ê禞ËD IÄ’À¾ ;î˜Y$©yžìT@¹F‚$š„.0<Øó¢ £†´¸X_ßK‚$ 0'ZËþó¤íLbh¯ í„Ô+I>I´;º6Znu˜¬Øe8‰¥ ôx€ú¤£“.° ½Ž‚*-0j ?CIM½ƒttðlMάí7‘õÈÛ_(RŤ*]LêbÒ’‰¶*º¼HÞn²æ$º’–*&]öf²]rCÜe7É=K[›l×*­©¤¥J³*Yº$¹×"G®²ËØ'$PT)ÒR“m©rY©md?v‘áf´4Yƒ+×2¸Èa^“3²¥ˆÿ€_[‡ÆyÏ€»«k*9­µeÄ„‡=£P¥æ1´¤" §uh¬Aè¢l©Þü¼t =ÿÝÁ&o†}%4Ö•ñvOÂê✉ŽUK‚†z¹äe2\úº D…+•D©àS‘†Ý7ÐÅ›õ$ûÎ<æ« žv†-åÅ¡W#Ë–¾é«ú v¿3ì¦Á*°­¹6Jx6 ž!òWLCazõç°£ðVNÅh„&CùO¦ç1ü€R±“®˜IFÉ›ëi]¹ÑZH*Öš³8o†"á;œÆÌ‰a§é<$éu нvç„÷ÙùAo-a²ßÁÓ`ªk°B åiÇÏÖîþßó‚gA=Î1&qîc®'~?-îÆ1}-Ì%ª‰^âÅõú¦S¶Ž{¯¶Ð¼e÷©çç2ßïäi7ÜÅ{ò6®ÌOÖgüy4D)zit€÷Ùìö™úç¯G çð wÒr1‘í—þúßùŸ¤Û»]oøûßËoåób—%‘ã:’%X·EÛŠ^q{M2¯cA´%tÞ˜’ø[IþMÉ“¨ïK°ê‹N@A¾¥É;lvh*k.÷2@’ÖÝ…ª!jZ9’©hþ¿åÀ¥lÈ3Žá!8<ìÞÊ—ž”ß8\_ê¸ÜoÂyÚú„Ië2¦”ã«q¨$åêä Ïò­Øí(&1¹·á÷l*­éREÓ"¥%馒s‘Ú“tUÑ¥ËqT¹>™$-r«U6)¹«˜ ütQ•£&éjr¹ÜE[’®YºVÑV¥H’”ºX5©}Û^¤‰ŠæCêž%¡U¯UG&uncÝ‘EÒÛC„$(Xý­jƽÕ\Éq(ãrMaWxyƒÏõuœÃý«!£ª˜¤Ö7žSÜ0Ù2G·ÙÙÄC±.=èI//>n% Wü™xšQ’ÈÒQ Ií ¹YuäHaÊ’/¸Œª(P½â3?œà3¬Š]<’~¸k6ì7õâ’1’˜òü™æÒ6Ú“¬´»\f:®¡p’Å›ƒè‹Ÿ—&´á”‰Œ÷,_=jt6éêÓrƒÓÙ4^A᛬mî×ñïþò°ÏŽSnà£LG°å‘Ë0ÿØÂZïò ¥*ÞLÓÎrJA£Ž3Ä[&3k^œ¹#Ö'¤»aí#q-q w^Ð# £éΆ³Ò0E&š¹ðg^U÷ó×ë ÜR%@ÉmÎãÞJl–àÕÎÏŒª… o+"å›h°®nþ”4<3|ºCŠ;Ò‘”;³`w[±þãkÏãÞ›òBE) míÍÃlÈ]Éhpjt‘S—}5¼Î ´kÖ’CDîïÅÞüÂÏo~™|Ç'éÛþÐïYÞÊçY™âYW—_d2[èH—Ðé´Ðd‚(Õc××òšUÐm2|~êÑýOÖbõÎJ#4ň2õÎM–±ûŠ~ܶú%:iöûx˜H·èY 3robKØ¡±# ÎGê!¡ÞDÊOâ‚ÿl û·<üœ0«ÝQ|@^ÉBŸEÖOÆa+6&Í+¦œ øÓ>¹åQºˆ\–&KVÉÙ¤õ44ÒEźI¯&RT­²-E°sž–.ëS‘¤E.©È**Wëb­Êºyzz}b—%wY­J^TÖ¥J/U²ªlË.ÚUROc YÊðÉnihŸÚ<Õ™G@ÛZÏ»¾.þàÔ ²VlïBØÞ ox`ÍW$$Œìß_¾"äbA Z°°TZbºî›ï‹Ó:ŠçìI“CÂÚÝü‚š!£ éMr †Œð¶{À¼Âñбz¦/ʰ('¬€Ä;.vUO¶² ™Ô«_¨Í7ZpNc‘K^™š†Ä'¦Z½âï>¡7'RN¶´zšÂðY·ì¦EÓ*2û4·ÂûŸPdZÂ4‹¿«u Tjî0§­l2Q<§)ˆ>¬±â¤šB±+a*–Ûïáï?¦VY€¥ËC òÈ‹áŸQD§NYk —~EäQ‡Ý=C—6¡ÝŸ+ kņ »ÏŠ}*hPb<ûÍ¥ÚŽf«›f¼Ï­îM¹ÉŒŽr-4ë“Ä«þB ŸgX=0¢”’³úÍMww°lžžÈF1¯þ¬dðP(ƒµÀ%X£™ÆgR_gLÁˆ¢5‘{yûƒ¿îw=ÖÏoû$]þðßø·Ë}tÑÑ…ŠŸ9³Œ ³@¸˜‹›HéC;Õ€CbÙ•tÊ’ÆšD ³›´°“Žd2< ÝœÁ:wÎaO-W¿”à‚CX¿ìã"§ô ?Í)n *ZŒâCv¶"§|‰Nl÷SÞÁÛ;$~U2ס.ˆOK:àÁ½ s“9Ðâôe®\S‘cŃu¿H[nÃñ+«´TFÂÔý: ŸU¥Õ$©‰¼îI®O£»© °tKbëXpiK²,ÇÐ^æ"¥4I}‘¼¦ÁÂ.‡4ݤ¦*) ÿpm&**–Çr)=÷“Ƚ}rIÈ•²¹îûÆ®`¸ëpº°7Ñ—Å÷ªyÅÄÙÕ&²=û%u,"ý+œ+ #^à1ŒË~ÃEW©Çq¨”QQÃ=á=þ÷†ñ´hsÉ w ¶œ×™iqBeÞœM¾\!1ndOãrš.LÜ]ɈpòÓ`dr 8?oîvÖÓ¹80¡¨ÓŠžOï!¾$SoàÛ ž!L<Üø–·ã½>¾t] Ò%2àmÃׄGøœŒÍ .™ï3‰©‡K›p|udÀz(òáÏse5õÕ2ŸÐȰákÕå™§â¼>H¬ÒÃxU“:ÈÔØ¬u *uq÷®ÔýÙˆÆM~p>B–”1mw 们L£Ž¤.ÅĨþÙØ .ÖSÓ¨‡ÂÚ{ìp»ž¥j9èÒÓhä¢ÓªŸíVܧÃ̈v­†Æ¹…àŽÊš¬Òü3²êÜ&[Dö÷È’.~¶˜½^±bí6êÕ>ÎîŸüÀßþ÷?ÖPí½Û týê÷\öÿð‡ÿÃe“Ï; ¨ú ³:|%×îq¿;Ó+.…à"Cþº?vSýœûhèT vÌÓ ƒ“ò:GopjÛ°CÓ½¾Œ&¡nQ§«G° XÝå["¯¯8X€pïô;~YZ’j]º5©Ç€£Õš´’¤‘ãØ†V7¿JíWÑ]EÖ}‰µU4½—Ö7©MEj“¼T©)‰ÊmÀá©Im*j]¬'é:n𞊨©,¹Ž“Q*hBàR·Lxí„ žºiÃVOªãÏè¡÷áÖ–© maŠÅ×<È ““f‘œƒy-?›.fô6aHpµ£,¿Ž—ÁYèð7δ\ = <ôŽŸ‰OÙ ]sum*Íã]UGqËÉ¡Ê.ÎÜ6úW÷HÁŸCÈ€µ™e-nâ“ñ\–»Û‰²PØ3P‚z†`‰vqŸLˆ¿No „'õf{³¢«;”)$_[ÍK7Ȳ,ȉªäz÷3ß;v{0Îák­€bõêÉ,6 `ì58ŽE / xîˆEƎߢ-å†Ë´ùû3½°-4<€véo ‹g½ëGˆG-…&‰ç b²)ATøŸO¨ÚÜdî6íüÚ[”LUo̦èÅ¡ä~ÈÙo[Âߤרi¾’“ä$.)ÈC?‚| ÄTA@Ïéëg˜|þ~ñÉ–kƒŽ"ÃaA¸ªàr ³ݶbÅ©^ £llOqUrwsœ²;Üω{†…`Ò{ð à “| Jãž9©>Œõ[à’ Äeþ,‡7ÏõÂQà:F„rµÑÈ8*3sÏq[ÆzëPp÷î¤Ã¡+þôþÿ‡ÕÑo[‘.üþW¶÷ïÞöžk€Ùã™ááí}÷ŽzA`(ˆnj8»§úÔ29²3ðÊÝeý#hd° ½Ê9÷5× =Þ½þ>@éÙ»\6´ë,xýټط¸ƒÊ בòU Ÿ4ÇKsÖëdù>¹d¨|…Kf¢ÂÍ©¼x—îT+XÍÝÜb´ˆ³\œX¤[hflH”öª’–c s&"¹‰“"å:²ÚZͲ´"¦7iÖ¤iKUr7é5Iê*¶£K–¬],¢éÝÉ-Iïm¬ct#kŦþšð~|Lqˆë¬»ïV@hM7‚ç@ÉZ®ÞÝjqÊ„´xS”ÍßËJ"ÉWP+`J`§#J±:wZæ"뎅Q\‹É_ ÂÐ ÔÝ‹l$ÍâÞK÷l Pp˜èh4’è‘}Á¾U\‡Ê&cš>T‡bë )¤gy ìêêÊ ~é:zeæ)(0ŠOûdê2G-ì˜pÞ³?‹”³MÐêV\#H™ÔˆbÍÁVΰ5t¦÷Â-\]t+ÎpžiR(F&ævzNÇÆ@tÍØîaEׂc!e©qJ¶ö@lÛôÖÉ÷²’0EßPPˆlÆ}zq²ë”ª_»%iBÒ`g†|¢„Zç=µrøÐäAÃWü@4¦_—™Å%‰è¥Io"÷ƒÍÑÈpîùÔ»HUÙr“åM•ý%‰¶*ÖFõPÙ¥ç.]T6‘¤]jîR›È²vÑ|ˆÜ.by æ7»È«3µ³É²ÞE.Ož.UŽasš€€Ïÿ$ùÁ®9ö©ÍõŽKˆú«H¾¡‰ÅåÙ/Þô ™Þ½`S¯Ù½œ‰ÂÐJÓÄL¢ç<.Ÿó³­Ð¾e¾w¾Xž‡ ‚À•’k´ûÝãðÚ>Š­nnv£yì¤·^Ä(ï³Ðh ´ó„˜{?Wþ4X6âòÍŸ†ÂCþF÷÷›%dn“,¹bG8ÝË’ÿL)ûsÅÉvÂ׫¿§LMpfZÁȾrèÅ]°$èÍU¤Oák1hb¾ˆö`_º¹jää5ž1´‡'œí.ïãÎþƒ]q˜g‘N.é´ä¹3I©»‡:WuåîR= >Ô'½u$·»Ú¹" ž >'zOXÚKv—Gz°Os"JQ¾ÕWˆ) mÞ Aä"M÷F’Ã,¬lØÈ¼ºãWI4Ã!O"§àXµü¸'zv©˜ÂÇÜò Ý6h²³º£`{<¬»:XþYÁ}± µïßü滾ž¿ç¿øÅwl’~ý}ÿåÿå-òvа+äN†N3ó÷°#³ûÌ}E Ý:wn°ú3¸ìL,„h´UD?uõ|åÜOma²%–<­eší7ï"ùï~z¹ûÙ¾öêsÜçEÐê—P˾ãøƒÛ'Á -‡‹°ŽÿÖ^F¶´!âò `&Oe ²Ž)¾ß‚)>È gžãÓ!â뀸“ŽÝ 3†Ò¦ h¸_EÖ·»l—&–ºäk“¼ãõ\ªØÖ¤ôÐHƒ×ë°øQéRŠI[šØÒdÓ$[ÙÞÜ$ouÄÄUØnB¦TÙ¥Õ¡J@QÛ:^ã²øÓðâoÁÙÛ>ÎlKÏ^1]b«ÝµÃípjž<%Ð*GâïÁ‚}W…aGyufo-ã{ëij,l8ÈUÿ¦6žèQº ¹[\›Íé›’¬v â4LPÅ«gN¶hZÒ ¾»+#òg¡mØóQå€ß¯9L“éÁpÍ7”ÄÆ{6‘„pBÙ”=ÆøA¬:¨ëæEMä@à4Hïæ9ÑÀxCî(4JI;ë¹+ wÉmêä«­î03Pòú=8“ÉÛ¸žuÏ'67¿ç-¸ZXëI˜æ¬l|æi}`tdžâ~f®Ï˜]Åû%Á=M†ü¬ÝdÆ_’Ù­Ó.}®.Qep_mgÖzôÚ._aµTªRÃý;¡óuå³¶»4Hiû9³>²Ž ‡·Ü€ äñ÷Àç«/CÒËX V韎s²Ò9²ÿ 6„-äDÔ*_|òCg“ok‘nïÿÝOÊ×ÿo‰ØØEwÄòÐJÒ(œ„ÈÂ>PBkå ÅÌÄH ¸“h _ BÌiÅý 6‘ÓËW‚O1I#9¼QÝá5å—‚ç+8÷9{ðϾ—./A°ø%ÃÌ٩שÈÂKבˆ¥aÊ0¸W-Ï ·l£Ø”$9HP’Ë(Ò™.N€÷ú1ö® 6•Ña.yH¸*X¿ëS8Ä:&¡5‰™f IIX‡ˆ#Á*]šØÛ]òª¢’ÅŠHJ*ùÚĶ2¾¬‰ì¿V“>Ã0ò˜{Ù`9(ŽD0¥Ìt8œ €(¸ìc Ð:‚ú:¢&uÙ»'1Èaù‚ïùŒ©Muô‚4'ÏÅÜ›šéRdøOr`ö¦iyF¡\œKÁä+YžÇÖnox‰É¢•pvÍ9 š}Àä&NÝdï2m®HiQù†C‹¶» &5Êô©È·*XºZL˜œH¿9ÜV´÷ód- —å5°ÊÍÃmØœYˆ¯µ`02£îá9’@¨k‰ P,U$‹p†r#…qœt 0–p>§Ï2“•N mDŠ=&cD)O:MãñvŽE4>½ú”ª€„KÔ°z6O:!ü=È]I®ê¸Û85RºÖ‘‹œ K v¼†æ–;\zgJ.0ÐQ¬/wørƒ©ÓæîgÑ®ù”)ÞÃY£J ¹¹p†¸(V«‡n÷§ƒŸÂýþ ¥AÓ÷Ž8š[^>ß•rÃ64S?Žç¯Ê0ùY³Èóþ-ÿËŸª¦þ¬ÃÝ÷ßûþ¦CMÛÀn(î$wƒ£[Ìx µ™Äà¢×Ðí­ êCøÆûq(ÈæœŠÕ™°“|@¦g ÁÒ2È6,;aŒûå¦þ5fmÇ÷ãïÓšé0ö<>øã ÷¬Ni¸B™‡ºÌ«| aŸŒb#¯ãÒ\Þi Í&*~Þ 6¥^=–’ éíè3$&¥  ¿‹¬Q€wKÐPG[„=T×öH¶ŠÈ’ªl«ÈQë˜z¥Ëò\¥ÞEti¢‡È%˜qôÔä`UpöÌ"Æe•ÌY÷Ó¤fñ‹¶Õñà]À#H’’~Ž]dÃEÚ±¯çÌy°¾MÇCÄĵIþŠfÇ8W“'/Õtõìܘ3a²/ïÇûq>gÁ:ÜšðäÔûZaÔèÞH â=)§lhÐÂdF—:þØ´ Š!&²üÖêCõ‘‰\B®³¹ù¼ÔÎ/é>ÆTDL·® x˜9Ð4°80±Ç" T²JV~ BBÅ+ ûnÚ@2ˆ„ V’ŒY8MGR˜~˸O„ñœ;þ^°åN¶ “*a².Óœ¸ú;ÈBs1×jTbþ³wî€W·š44ZM±ÚXœË‚­h£…- d(»êhúóÓØ#wÜßùQFį·Þõ,Œm´1µ®!ØÂ<Áë2-àÉÜ!‡° Ü"%Ó~ÇJ(;û¾@²òYÒ6›ºÍÅr°Ÿ¥Ì’MkŠ¥‰Ü)yuþ¬£PSÛß±z)wW`¤%“4}ˆb=ýÒúÑôÉçò™¤ÛOüŽ¿°|õÍÏòê.1BÁvÐ Z4×·°ÛªþÞÎNC3>.D½1"Í’cü“HQlø°óé$…$­ŽƒØ]Pr0÷ð»“%ƒÜ_ýgä÷fŒf·æ¦Œ¦C”ž»î¼ò'mˆiÁ¢‘Ã>ÎèHÅÃ&’[Èjû°'äGW‘ë×`/j#$‚¬å½¸QŒm˜°è =}ÏgD.€„ùÔR8lhb"çý›ÔéZÓÏ:¾v ÓquQ D9Ûü¢›E9\j"˜”wÿs•,ÖKÈ ÎƒpD8Ô‘Ë÷bÇtÜa‘×–q±çË(~–Öa®5_Q”­Ž)›—M‡Íhï£Ã$ :m®Y õSb*c¢M ˆ­Hïzk"kw3~ëƒô–éýŒB“‡h(}ËœÂÒ@ ;׺ CV—Üðìè3¢G¹‹†\„©Rq"ŽÆ8Ó¸nuzEE ÐpÐk.ß"ÚD–O¡À¨¾Ë«@:ž£„=› fwæ/ÁiD­+â4•Zßl,»›ˆhs㕎HGÂB-2I9½÷ƒò±DkßݡNŸ<ã-4œ*~†ËýºÎgÞˆ®a5µã½ ¤ê?wƒ:úƯÇt¤Ž»ˆîV•»u*7nÎi1‰ªù>8NÆõƉ™~÷"ÎPúL·:Œ‚ ¦@ºžr£cñ.ê&\Âú®…ý-I´°Ã<^Ü@d:)F²öõKøÇXoÐ6“«Kz´ò@øê·aEޱ÷5tå ÏÜuYaóu°¿6œ}Í€š'бY˜‰k*RVwªêÎbµx°ˆÒêrÀ´yÅ|¿ Q×KJ³!È‚_q÷/êt##;=‹±–X¼ Ìjfþ¸ø÷ž“=‡4¬‚E&å&=y£Ý ŽdLóZ€"ˆÃÜ´ ÍKˆoÅ%eKpêÚF‘£Íd­Îœ§N5¨Ú=xt7G£âôl‹7èj.Ab'ëø:dzKÅ3¾ÁÄæ…0ègçÞöpšïlaÅ1‰Ñ…â²+U_tÏowYàÉûû‘håâ¸hâAg8æ‰34DƒyˆÜÂÏ*Á^5¢Ù-½æŒï~¸<¬%çØ“õ0GøÚ|3×þ³áœÌü@Ô›¾ïøÜZ°%‹½…×0Á‡#4Q!+ºïNXÖ—E˜DueØÃaÒ€²Q)‡ó.R»æj¾:©{pÌ»TÜX¥a…[Þ‹<ýÀ_ó;þ³jëÏŽãXyùÝúú.Ÿoß…Kðí‚À{súºä+Ií^Vp  ¹~+c*+Á0„$²&é´ÄD,†²S6¥Uf°¼„½uÕÝ&úŠÆ+¥ á4ϰFç¥a¼ú Ÿödx¬7l p.÷èÅBnŽò‘9ÌŸoÞgæ4?g6s´k-¯N<]¾+ì‹%ð_èƒ}=«Q¦¹8tñjÈ:î7œG]\j#ëÃ{<äR¤™íR¢–‚ -'F9¼YÑÍõ÷vñ»nÌì’(…Qy \Üjî>³’»ã‘#у™‹©³¯ÉÕ׺ÃzZ¼¹ ò€ÏEÂX ¼ÞaA›–ñóÜßgù`âäT”ýjÊzà3‹¼Á¬&x¸A.Y¾øÞ¿ôÿ÷#úé¯ùòÛ>I¿þ‡¿é7µ:ö™]².OÂÊpv7ó—ÝÉë˜E{çmèãÇ",³Ã„½-&¾nmag“åä©Ý_CÀ)ùk`¦tÚ0^Ük`ɦ‹"#ÍeM­ ')9lÝëhì€îNcWBl_ÚYº/5¦áò*ww##û±íã› ñ BÙd¢~jƒÇoUŸŽ— Eé»h&li‚ HHÛS4vª+¼¢-¼Ûê0›¥¥˜žFQ¤Í¦r§£"WìÄ™ ¼&P\`Ú´ø`™GˆŠŠ\®°ÎD^qB$dº:ï ’@…ˆ½5¹–˜Èˆ."é“3¯ ¹œ¼€Tù¶îᄾ;ŠífI”Ñälð÷‚©í G7ùïëÅÏ(ÙÕ­yŒ#szu‡p@‘´:£\ ~¾œÎ,üÓœøÈ(ëîMÅB{ï,m¢0Êа“9M>:\ö‰îpSk¿‘£º8»yºmqÊ,AгB$Dƒ¡Òœ(µ»_6Û§Ú.§ÃG-s}/¢ïlZ¿ô‚ß¡(i7':öò0=G[â¸>[ääSõÆ3a«»Ï„=$qµ=¤;E V ¨Wh«ït9] Ttƒ›P3Çö ÅÚlfùÃaNPTñ~Ó¢¿úyjh¾R ¾ôÌ=¯Þ(MnOYÑT%d³`q¦í.uÐÂ¥7Ýýî»xÎy)ˆ~e€ä°ãut ñƒëIÞu .]Dêú‹ì?«@ÿ¬°»û.²ÿØoÿë÷Êç ¾¥,r9Âc­?ÂÐÑ7F®®-#<ž?õزο ñADQ÷©m¯þðjð{L]b8ÜChûàîê]œ¦QÄæd#ÞÁUø·¶¨g° Â!¥!yHªÈÖä÷ë)8H=ùå`ÁÉš»…åU¤]DöŸ¼ú4ŠóòÆ÷mö©»’ â:Ë{NlCßÚ°/¡+R~B!R©­oÝå'¯­W}'§îúfiïÈd6;í†Ë(‹ˆèGÝaê± X÷†µæS=ä k¹ÀôÃÔÀ©iZ=ÜëƒÝÃGænVµp(¿´9Q$]\*Çðƒ¶w½àˆ?na¶¡¸B{<õ¬xÍ+¦”ÉxA!KÒr@U‘ò=˜²&·a^Ã&SÍ¥*¶ÒOãç!°mL-}ZùÃ$Y9…Š#3ý#F ̰êZñSêÖAüýé1¾xóÉÏ]%Ø•6%épS¨Û*/ä#\æØmÏK€ü¬í¶…I3j•5ü^œBñYßϲ=yýô¹¦ ð‚ú¦¯gyçdx‡Ô5‰ nø¾uwn¯¾o54jõð]²Õ`’vÅÅwͧij¢:- ÆbÍÿOt1z“wŸl%JþÐD•›“ÞhpÂ}w¥Ïuö«|N’ŠÕ5„ÿ¦oÚÑZ0Ûiw™þëÜë мg¿Š¿C&µ‚üÖÚhüo‡#©0ˆq|ÛÅ͵/Û¿”/¾ö«ÿÞ¿ó§Scÿ”'éýü¦ß”`Ñë`ùòáV@Óå½OdkwÏVÌÐõæp$ÃÔ.ñº!»Õƒ/h>1NtHLRa0woa‰M Ý" _¢m÷Æ‚»lÂn=j©-X,˜•D#—Ó?)8½õžãÕ ú'ãÂ,¯€zmÀÌ–‡)áÓR\gË) CêÎÂÞ.£›¶CdyY mLts‚éÊvÁ¥v$½éÛMäöM—”Xw7¬ /"ë+@ň(&„%޵*V…+œÐ<ô;öð&’—IuðjrIS;@ 3øì'¤d Íœ¤¨Ë€ÝµzZOtDêÝ}¿÷˜¤±§ÏoìØÌèŠîÊw¢\lsÓ"tç"Dm@vº 9ÀD8Hd¼FYƒôOÏŽX,Ê$,ÊÅwŒÓf±ÂPäð=)‹MÁº "MŠS]ÌXŒ&út$w‘ýË€*‰ÇP¦.EvNIënã©—7xïhZ´º kC#Ħi~]¤~Šß%ºËxZ0º™FJ þ|$±õ+Ó–û®ß7šöFV}ó{¦÷Ù‰i-¯!ÁjEùS@G‹ùò\µR°­¼ºÜhÞggj EYÏ:ãI²cáz?P¢¬šés]aíi!6“R@úq·(/p²8 gæ'w'mNÆ›¤ã5­”´¶À´²µró—h«ÌZ¼ƒáÇQƒÕíô©Àʪ%Wt I18‰öÒ“3œpjXÙÍLˆMäúCí¿öí/Ò]¤þØoÿË'òy¹ ¸„ý –`ú¡Áq³tƒaÆœFsÌCXn(Ó¦X—™2q˜ˆi$)øâ*X~š³[8è GŒû$€zÁd‹ ÙŠ8kÛÞ8i çóŽz¦ç4—™”cì’gŽéæB}vÃyñÄ-»úJIU[|Yp1´%–gDRÚÓcc%Àn9]=¤¡ŸFa·%°ª³§~²ð ºHÚJn£Ñê„É B+ã^ðûûIÈHAÓmCγ|êSZÅ,ãçßžÆ4›—Q¸jöøFUížQô(»IƒhVa&“%WœªŽjpÅÐBÄ“uOZ]&•žÝƒšÍžn! FÎST zT*ÌõGsVwŒïð%øº4d&›Óu‰æ4`0Àl VW:Øòš)µÊnŠÂ¢ÔHÀ¹cUµÂ‰Î|B·R#Ó€‰½”¡4ÈÉWbJIÖ&’âˆw±F)ßîš]ëNò²|°@?h^¸÷@x‹f!ØÏïÃÝqøêNnÅ]]rGÍ;§ÜT`J6QW2Õ·H;üCyÛcî´$ȽoÆ=ÀõÙiÚ7Ÿ¹úk;îÓÕíËá½;SyNó8§yóÕa ’AÙ1¬‡K"áôè6ŸjÙ䎵@´‹— Cé JÆî}ÁNzýttˆœØt’,c‚)À*®"ÒŸøUG!¬w˜œÀ¨ãúÙØ3ç=3.漋l&røŸÖœ*ÃVTé—KÉÈ ÙD.oÃý c<U 5!§`Ç5ì·/É Dµ qéN@©ÂGÀ‚—ýæÕ5ø=­$tó ÞôtœJ öÄ)L¹˜´¦*Hôìi4C³E‹H {ì⤯ZÏD¥$p”Qe úl¬|  !Ó¼éè6¾¸$Ær` w\NtcSœ‚ùƒ¹m­]ÜQŒnþ\ô+A#”ÝL¤Ázt¦Î!›;Zor·'pkê¡PóçáçD3ÚÆÎK/pUN2Ïî(uíìDÏ®¾ç>™Œ`¢×õWßó’Ø×¡îáϤílÙzbF‡³BBQb¬e«"õ[‰ÝQ·{¸§r`Îïê˜Df]d©Žˆ´wAÒtåœ`'ÛR9dºŸ §xó™Ÿ|Âg¢Túˆ¢ô ²×-¬„˜µpbמ¢H›ÇF–$°W.‡Û:K 5fÜK{ø äMÐl¯œ×Ð\ä AÇyËy4µ‹|úçü½¿õ§[góŸÒýõ꯷U>oeL7Siƒ/-“žx˜<5¡E ©kï0 ‰ŒšPI"özž°5ªýxqȦžôæ;ÜS¼[ò°m[áú•‚ÞNÇ àœÕ%U]ƒÖ MAz(î”ñÐhÇ÷aF¹Û¡^$´¼8¡ejTw8/açoWgÿ*z²y{÷à Q÷'Y¹Ô Ók Epb]|z½ßDò/I7hK‹ïq—ùÕÉ/ì†IF3†\ëj®/ïE¤l£˜ë6š‚u£ºŒ÷d[Ý&õh"ò™¿¦®£°2&tKãVs9§ô޼h{FÂåèÀ_ÝðAÑý×6Šº‰CéÜ µçÔ/ ý€›Q‘Sú$n©¬RH†âT¬˜’ygIaÓ™¯ù„”Å'¡¹×¤ô§;qF‚N_óÿâÒµxÃZáÀƵ‰@×K¶/%' ¹»Ú÷}uhpæö.~Ñ7$pM’g(,é\°©[ v¸ {VÂÑÓÚ‹K*•ŽO¼n0ŽÁç,/¾ÖÐh–!±ãÔ³ëÚ)«:¹öÜBð 9Š5U/a‰úêYÐJ€æù~¾„ËŸé[ «°%L‹$ÍáÓ'|-y€úóšŸmÝÝG¡Ý‚ûžaƒ†ßšC»”uΦeÆþZP¢X;ûPP¾7 LÊ’€Prý× íœ¯cs2^ÃzÇ Ta: ýÚ•Sz˜ {XQ¶Š;냉Ð^Dz|yßÿ~ë]ÁýO~‘…5m-.Ãm@Tò×~ÙJÏ¿D¾íEºü§¿ù7t¢c×ÀœKA#§îgÝšë[ yOa¾øôÀæ4œ0Ow!¤((¸d¹R׬q'GÜÕ‰“)¾¢p÷ÜÝœa:Z„@r bVg3âm¢ à¶LX’CJ3EgûŸ=ül6ˆ&=x›óC?IpÖ°‹ZÇ\¾ò´&ºµé—ÁõjæB(Úð.«~ÅŽ–œ“¨–\F´à>F›K[‚ݦ„i&‡sÌB½`mÔ<®rÊ$«bš¸vU¡˜ÙØÍ5ïSK}ñnzò”,>“ ÏL? mÁ3"¬| “æì4»OŠ?¼y A í$ûá²a’-_áÂûHó]~ 7ƒr'qÙÉ[r;ã~sâ!ó™c\#y]ƒ™Œ=X× ¿JÁñË|Í@¯óÎô©ŒȨû;½ŽNwKÌè6¥$ðnÊ ¯0òþÞ ¹ÙêxÆ”žÖ¸“òóxê (^øÞ‘4î-dSO/ ZµÒÂ42Ïk0øI¾ß3’+FÈ8×îQ•²¸üªðó‡ú# ¼ù÷ÁõÑ5p±Âj†<‚ eCzóé—×ïûËþ?ßö"ÝÿØ?ñ_˜ƒÌ4Ÿ äæ· ç)»ž-é.6;ㇽÓÜq‰ÛÁMg¾CÚ_¾·¹GlLŒúà•š‡‰K»³é­«áišÜà$ Ä4LÐé³Qäq5Ü´†ÀutÝŽ”@£Í]õûø–g vÏ&F\G8‰jkÐÓ’2Wy ‰I‹³Œy'(âõ†tx†=ƒ—3àáäÙJípðÛN-ÑQŠ:dÞt}F²ÔŽxG袅ÉRÁÉ'ùZ룧DJ’È»o¤ýå3%mLŠ PT#vñtè¢*n[ëÞݺ" sƒAD‡Sݳï¡Éøž~ë0N± ç±îr,Ÿ .(‰ŽbÁC~’‡’“rø…•wœã9.LJOz{uŸyêMÓÕ]ýJ¾ˆLñ“•trs“Ô :áßäÏìÔñS’ì^¼rÇ®½>¨*²œ2”OYÈ=°¢!T7??Óõ/ûî^AR«€‰ | ]Ã=õ˜eûé§ð|Aš&EÅõ¾¦> Ô;"wn)'š,ë UâêoZ×3’hW/D$=uH[X9YJh ȱ¸³³y3ßö.…‡Ò‹}q‰Sç{kçUA«¡Jö !KgËÕ"§å9üàaNV;ï'R#Ö“«SÜ(hrB —œ>ÛhrÞãBƒc(BŠâW ¸ì"û7¡?FíS6ÚT„Àœ‡)xå._|ò«ëoû“­·?£"}ÿ‰ÿÑo·'ùœ­çÅå˸<íp(¶ì®Û›FèNt±yéìJÓ£]##+7w.#l®[ ƒ¨“¸4ø»ö›ïÉe?Sõs0™{ææ,Ð@&ÔnÆ%3šEÚÚ:U9ïÚ%kÁ=è{0ªÈÞ¬ôîpåÑÙN34&i“c+çÎ¹Ë …1J“S›†0ƒé}}G±mcúY¡Ûí’,LP©X²3øäŠ&5 –ÀþR^ðÀÂxCpÀÓL; ®r€±+"ÿȨV‡(P ²Äµ‰\ÿ4ob’††D7;0™¯?w¡RrDbÏÂÅÐ LqîÞÀÒ\†³>˜O°=yøÅ´Š%´JÛNŠZÑ“QV´†Ëˆý%¨šÐŒ÷lúåUahFwãNöéӆנn ¢+™SlˆÉnôÑæ÷aŠÓL“kÏí$s™Žå°zâÏ rö­ÞHUÛƒufXWqÍÒÃnZú8+ÍηŸ2‰îJŽ8AGío“S–4ÉD“¸ÖÝpe6é5¬­b³;‘VÁ˜˜d²â™3¹8Ã{vN•Xñä§à^¥HHŠêw¥ØyígzæSÐ(iÚoa¸ÂgžÞœõЦ W6ÏLèÈŸf´Å?ÃI€íá^´NE M‡„×DׯèQV !3ljO¨Có·Ç9[hg\å˜cÏ?ï÷ÑÈǘ÷Q8<î£áúáßüü¶éöõÿ˯,_•Lñ¶áTì€KñÁdgVJ59yÏÝ!˜æZÀ~ `± >¹S–dÀeds¿|¤[Œ).Åã'HpÏ$+¨…¬ðyP Óíáï LN8Aõ«wäGëÍ;·YsØ“¸n%˜#Ðõæð>È‚$šŠ½¼>y8DUïžP¤O^$Ê}å:ôÆý€þY|ª,¯€ï’;˜YÑ×Ñ ¥K˜R¸;Á„÷sjƒÑ]3¸¤wü9𒡈¯Su\fórA°å¯ö¤gtÄ7°,wÀ×yìÝkq79ÂÔÇŽ÷+êóéøvõék»àòe–/¬[Ó`Kñtå’B±KŽšõœÇäš¼3•óñ ÃÎÞÌs‚çN–ìè®´P×vó5¦Oƒï¹X:äƒtÚšþê \) 7î{I.£$´Üƒâæ%ææw}·Cµ¼‘ƒR|ðšÁ'ê“ïl$äŒì(Sð’K¿uÊÏ(áœi½“TÏ3Âp—tñÏmô¶|9,•µ¹†¼2«?_¯ÂÒ0W’6œÈúM¾xú¿öŸù™ ÅÒıãÿæÔT>— .(ÂÌty’4t…örž(pŒŠADçšp ±K¡h¼qV¦Ôá!á&Ù*O€|KèׇÎ58MÛ½'ïÖN{—x1a×Ã>“bž‚QadšxàÚÝÝœDkvqæ¹]¼÷,ꮞާäÀ¼¥‹»@Yô}Ƥ­ o•×JZÅ{¸zÌ®‘ûÔå3|î77 Y°òÛÞ€müÕèèÈDuñ.—G§ù~õD§ŽKŒ1‘©‰3Wï_á êž½ùÉ#,ÛÍÓ»–ÍɇQ7‚±”$ÄV Ù¹ ÔèkòhE úg“ o‘ïx9'2u8Oµ8å¤ð3\ÂÄ•ÂTuq‚þMJ 8û¼¸ê«/NúIŠ\Ý¢q®W¢C–>8`]Âÿßœ¤5ÉýaRc# &pyŹ%yN½Æ*ÐyI¶°ßÓPŒPÀ4¡×ÿ¶ÃÉ=xÙ‹9¤«œøB ¡IV{HÖ;9‚ËÑ(³é݃3Ú{4‘€|Óâ~ò²ûª§ùšš¢Øc̙ҽ{3 šfñß›HhŠóaâûÿ¸:Ü ÷꼃W5¿~†þ½Ã%°WuÐÒy®jzp+g“¡9ªºó/(Ñ›²Ûz&›1C»åËê1—Ó>–<‰âDdªs`©Ýï…ˆ˜Û×|?Ý!ƒÍ€ØksIJƒÕ͵ŽÂíîÍÿ¶¿ûgR¤ÿ¤&é¾ÿqÙ¿þ{þ Â7‹áŸ'hïîk:5Ϙfè $Ù½žØ‹”ÇÌ.O}WMM¸ˆ7ìÍf!2Mÿ¹bNú oT7$˜ì¿§Ô¹¤sBWÇ46!>¤±{¦žtº× ¹h^ a×Òî®#ï1êî8ïöR˜;4Ýé‚Cši¸;IHé}õ`’¹÷…“õëåùÁe4Z—ïß;#Ô=?ùN”¬jE7žψFN—±ëžÑ‡Òž’C_ÇíLÖÊ(öŠ‹D·Á$±©Õ±ÓÎpÚRÊŠðYV|n˳wÐSvoã÷§F¸»iŠV p¦[68§]Ãþ».B‹Ôˆ²±HX»äM$¿¯\ä7ÎJq˜«ÑBäb!«…&Åžü2Mh*Œvˆ¯¡85g¸’íZöR¥©S€MO²±¸‡^CŽ!çŽ"h|Ÿ7ð?ä0Æ1€ø;Ìgôúð³DÉP~ Vµ3,mَ纸ãZ ŒàvÓWÏÖ˜-4ÑqPÃûö}K·B’Ñ,ø*ðþ°Åý¢·ÿdn¥Œ¯ß'…6¬0Hr¢a†–ókî‘Õ¼‡»°x K»c-ùä+ÖÏ2S>OZ\&Øv?†| ®rX¶÷xï·3:bA=‰ŽâÊ-Nc£6.¦ZÝÝ •A)óg.X‘¿Ƕº#ؤ8+ž(hB]˸ó ²Ê1ž)¿Sèfg2®‚X5‘{ ?ãÓ÷ÿ¿Ë>ù¥òm/ÒûúwýýެÜÕõ²–÷E¼øÚEf¢ÓPf¾l èQHƒ"{v²öp™X4åW‡…™#;÷…í$åžn2­£¬,0P‡ƒïn’]x0æî$ìšûîæ„à§û¸w»ËôçŽ|îMñwó&Fî¾'ã.ž<€ˆ eww4^>¶…‡î=B2~ç[Ûê9Þvñ×Ç}¬é˜–ÅwJIÐd¤g‘†ˆÆüÆ5ìL{Zð™.Èj®Øß¥‹K<$ô,) §¸-+5šXÄ0‹•ZÞWt¾›C×½…Ÿ+È,ºŒŸ‡£½ûç"É‘ŸǰÇö ä×À ÅEË&ƒ$´Z€@rÚ À”D¾‚)Ε2£ìË©R²Ö|ë®v¨Ý9ÖÝG<‘ü5G0bq=Y'F?ûôÐä¥ÃÉ+¨0,NfÐüN#æ*£8tÊ‘ŽPôÓG0?=›CÌâœÎ°ädtï!³HO¾âýÆTÜn˜tWÜ#—P4£"£ÙÒ«p"UÖÒ‡î~*>ÚyïLyR/Zì a Ó,YÐhÜ‹”wd‰É*ç8`M÷‘w܉õSæ-@Ì&ôW 5H[q¾*Ts Á¤DÝåήA8š»ÿ™»æ 5¬¤©Q0p‰q¦‘@ÈøÉvw‹ÑÖýŸ4‹F2x˜(×'„|Æ]öH³xTË4H6%ÃÅn•é¹ê°Uf"X»É—úŸþ6ùþú“*Òõþïÿºt•Ï› ÛÊÞayx¡¦X4Ÿ´€ílÂØdàê$ÄÂHG¡Òêx4mïX“ˆ=Œ—Ч2ê 9¶›C“´²‡ PÑÌ…¥„+[fFèâò.A!žñx1ƒÆ:²Â§qÃÝ3—g"Òê=øÚ׸oÆä ÏšÒ˜t©ß»ìo;Ï逶'*€ dš”w~Y0fÿ–…tì²ÒXt"d DgÁ!JÓÖæžâ ·"§;Ó#…;=;ÜÕªû|÷4 ¹¢«O6ØÓµ‹,oµù“hžÇE}û& %hŠ£ÎF}Üáʸž+‚營ACc‘B$|‚{Ûœ>Q¸˜ŸÌ £!3¼=¨êª®æjãõìPeŒK…¯|EáÓ§`•É‹<˜çœ T´©9å<ŸH;zÖ÷* ð¾ƒ/âÏz#aT\Ãݰb‰JÓçÐ4ıP c¼f/ç{‡%*2rG®¨Èðæ¹ü`J—4(,ÐÝ ýl6®8‹ÛjJqW.AžðLr’€ØÅ8ÍÅ¿çT»P‡Œi­…}saL-6Œ'†:ïÇgÜU—òQ·Ma‹ùÑ´±Å¹«ˆæ+®°»m‚d¿YNö¾Å®¸Ù=Z8… "CRá,äj7ü|ËSÐ:¸…ÆîƒX®o²×ñnW|I†Ûdw ;n@ÚÌ5㵸^ZîTœÕÚ!3Ý<Îxûìûþ“íÿ%?ú3-Ò?ítûæ¿òg‹5c÷Öm5¤ ìÍ‹"¯è5/#ì',=jƒ&´–X£˜ŒBÂ:¦ d”ÍŸ¹º–q¾Úæ—X$Eò Û©9<ï’ùû4K ‚LÆ^V»Èþ=¾Üa^\Ç&iêØu'€3 á‚&žÐTQÿ ­6QŠdX™Óˆ#û*€„EÍΦ¦Ü¦3¡ë5ì˜a:m.Û(Xë“§ìXõ˜È¬˜Fî!ÈB=G`š¡Ÿº õèí¡I$W ½ú$>§wñÝ,&ìÐ܃zîþâa´«µÀ¨!GšÄ2zoÏå"µ¿úŽ}\Œò`ÌCžHr=0ïX€*¡}X³ÒX¥n\àß5|O q}hZpr YÏ”ì‘ÄÖ£Ivˆµû6ež=-ã]ÃÅß³'oŒ¦Î……”pçt8 ¼™Ùˆhø>«O÷¾?9kžnÖ‚å+l–„FûžõX¸È®.ž&¦ÕÉ“=¹*¥£é)Hšê×1$ K|Oî!r/¦®9¿“3âaÅÂòžgPFüMÒïòðžMàk+»¯9üäIî£m=µ±¦ensá­:1Ï€HæUäþ‚{§ 8{Ý\»=W´‡?”ÈöÙñöGþ®¿Gþ~ý´'éûþ‡þÖ®ò9cÞh±&¬×е6 ÖÝ¡âVDä« ™Žbû‡¦ìÔ¸vœ¹Ï)0JÁÇïÕž¸Ìbî©Ö¶¦Ê)ÝŠñyÓµ&„`è1àÕ¹ïi>òKÃÎ\F‘)A"Öñ4Ÿš¡4"%„¬ó@Ïî4ùß3NVh>zrè–8¥4qï$Ýý³iÃ0æ:§ B6ÞÀUÉ\O«k°rÄ!]ðÀ2¸€¬în"—_àpçq÷÷c}‹Ò™“NXL¾¡de’ëBç=³ÙáÒ€Á dáçì’™p ÎRÍ€?ó[Ð0¹Ýè œåÍÉ1ñ¡jìÅD(N`¼²pM¶ª8©Ì"ä nGu÷³6Ó†` cÈOOسg'²Ht¶‹ÎMdÜ—šœ ž‚ÓSu•míéþßZHÕš¬`8ØÙ›Ð4§#‘ö ÙNaÚÄ{Ø´´ÌŒgÓÁ&–Öº¼ì£–y¢ éCyO4ª @ê¾7Ÿ¯—+0¼§¤Lº* ‚8è¶5 gJˆ¾¤¹Ë[ñ@ @ÊýœôÙ–w!È¢{ˆÐܯÃj¸ÞÆkXñy.ÏNÒÕ¸r0¿wl9k¢[°‚é]#‰ÒÈšná„÷‘9D›â`b¸¹oï¸gzÏz)l®V4)Øõï·á2ÖAK˜ª¹©M¤,ø3v^¯ª‰ì‡P-ߥrùÓÿ†ÿû·½H÷ן”öåÿë×åÍ]rßò¹h ýˆ£¯Ì:N K€h‹Жúœ»Wã^ôëYÊ»ËÔð1·¨|^2kx¸Å? † *÷ð縋ÜÑl„Iñ$IÑ1™R‹ÊŽ¢~¾Žd¾Oäû1ÍÜ3ȸ„ A9y·<“_8E®cMÙ¡QBÖœÀò¶6¡©w~Ñêâžêó} Æ2åÅÙ‹Ñ;ZCái7@å-HáX,0OÑàÃ|û&&ZĦÅc— hhÖ¹ÔHž!!Œ™åŒÀ”ìö‚ Aõ:[šä1ÅíGáç›i¥wŸ¨¥zv¶^½á쫳6­»¡‚…`‡¹7;0ªT,£¹…IÍÕáÒæ¡O”yó9‰@Ðÿ®e¢T„§;öúLŠšŸýå#»Þ({J¡@éY sÊ‚—ð qW™ÜØá2Ø‚­%„˜†÷ãÞùë…©º‡uQ>³£{˜XéwPwÏô•ЋKäN“yÈOžð,¸"”|õâëüÆ'ÐüìÅ^¹~éò: žÞs8YΈ©g–“7 u4eÁ.èä|›ôÒ¥VV+!Q·Ç¥¢†p.¿7YÝZÉbÓÓ¿›çNšÃò æ}x ‚=LËíá,%_±yµÈ“ààgõ%|=?|6ù3•pЇ.MÏ °º Îf^ÆN™Z~BïD½è–W‘o[ñ~ÍÕ^’Û7ä‹ë¯øÇÿò§øë§U¤ëOüƒ“2Ìêa‚XE£·ó,õ(²¯öªö`ôãî_ËÂþTÃa¥:oEòvó¯mîßË®‡ '–j>“1fÑN¶SÏ­Žy±SF%Îl"’¾ShÔ™†Ž»7—îÈÝMWhjo‚Ÿ59[°aG¨Ñ"„2ƒQL»c¯ 2ƒEÓØqî099MB⤑&΢d»Ã?Wë`çí'ÏF®·ëÇCoö6¤Lqƒ1Š9d$âž¼LÊš!=ÀÆ(B‹SÕó£³Ý‘(#’`|ÁŽt&í¾Û#Œ©¡(sgZ¬‘‰$ÜT/.]£§9 Ýë+Ôäï3ý¯3ºtvžܜjó“?”Pô¾„ì;ÜÖ-§ YÏ ".?D‹â™2˜ÌÔtfbˆÃ³?<‰ˆ lD£ëqœ87åQtmÁ„\ð0@>Rpñ-Ÿ ˜'?\²k—·n:²| Èê>­R){«¯çIp6›“t lû%8$Å {LhSš×Ï{ÉIÌá±y@1úlàäîKƉÚÜ5ªØ]k˜øY>‡-B×ÐȪЦÖXÄóÄÃg¿n83ÝÿÔî N$^šøªhNS±±|tc Mþ©‹»Ps‰ ‰cœˆ"ã™|zŒ¤ü[}¾/Û™Ç2MA”I™Ð´¨Ä÷ÍŸ8SXöýòqn¦V¿7U%@#Uî³$_ÝI‘r ITpÈbãù2ø%ÜÃpT¼¹Z€ÔÜ_†æ?®ù2xípß b v&Úâ6½ö ^(äó#SœÆAUaFÑ;“,[ 2€‡ l4µˆì_A¾ËÏ2n7—°Öz6”©Ø=ŸêÙ1tÖÃeq“®òÅ'?ò·ü£ò³ðë?³H×wÿþÛï2•yÑ©8‘aîyï9»QÌýQÈOžÄX`rò¶G †'âÚ¾ #ú˜E8Ý ê#¤yñ¤.e#s+®'ž»sØž 2£/ý‘·`f6í§5è´b¢XK™‘`ªœNP¸Ì"°¿za‘c&òD¦eÏB.ÁÜ¥¼z³5÷Õ°Qµålä@OÛã[QÑ$-[Øã=ÏhÞ–‹œ- ¿Â”,îpF÷±N«Êg\«NŠ64 ÏØ•_0­Ø Nè§ÁÍ(¨H\œçUñýQüó§~iV“ ïâ{üª¸¨>óËÒ0iw Žrµ¸ã SíÔÜc%Bø³Ü0•–ÅÂ]¬ŽXÐ7ÄN¦'HïÖ@îŠk›Gô£¤JÏ\ r:NÞö”Æ¢ºº³X?¼Á­/>á(mNŒ:íÆåa'Üø#ëƒ>ç¨>O[(XôáÕ ¯â9šá<þàûGVò-8œi˜Ì›K’ ÈL¼À… Ypº³7Œº<0Êš!¾Nk»Id5¼ïLáCÆ9I¡Œì%AL ¡o!Óºßøy¸­²Ê(>lB3^:¦-Ÿç8ñ†ÕbFDD ¢ÊD+ѶŠìt\ÄëKö S/þ>dEæ5* Æ¡’F‹H1orUE î˜ü/`ù»ƒéžGËm¼‡™2Júã[hnä.}yþ‘ðý)Òôù[¬î†!’pcÀ'¹¼8Bu>_×=Xla?¦ÔyXQ„[Ø7ÏŒöÅǤ,v¬ÌÄ=ô»” › >¶1&s꟦‡¹ÛjgW¨ºéi: nÊbgÉM0Z˜žz9wít ÓÍ ýÕ÷—­Ž’°;íË€h¦ä†oMsȈ\^²ì𶜠—q§ø.;ùðk)Ö S´Hf+³¢¾žy 'ûÊ8Y•³¡ãÁð$š•À7©¾ofN;=·Õ|u1÷ÎbIR=Àè"dOç9zÎö½ÚÎ;n>+ä%Èî«v6?G ä¯ {kH¤«h‚Ù$Ï@‰x­@Ù^qW§Ðt½€“ñæŒpÎóÔ h‚f‘Ë×\¦%W±’{RCTvÿœ˜h5SÊøZ7‘vqyêtC\&]ÜzXcÌ(d¾¯Œ".Æ&Ÿ¦#}ŠÏ]†!U}…ÒUd[Bd.¦h¹ó»^ù*·Ál¯ 2Ó.ÒžÁ«:¸¼Q3©7ùâÍçý?õ!™âÛ$ÁÚ¿ñÏýUë–ï7„ÜcªÈæò…F¨iw™ÉŒ˜\ÜÑ– I–3TCèµ…)„;nB7¼œø5;wÞtd1m¥Ú)Ún —a‹»c@t-°ÉLä…Ê&ÅÚ‡÷L?¼¡éw@~÷p1QòðVvÉBܪ»ôu¨{æ swü"¢Ÿ`šZQ„û8`óïÔ`™ ˆ¸‘g*OÉLÁ¾°wèAÁšæ…2 kðÀ-W7HLëÝ ª‚ô"€× [õÃ%^]\7­ø»åâWv~¸Q ­X¼ÞÞ¼Ó` xãØÙD½ lCá •ÙPÁQˆ(ÆÌ;_½ÀÖc\\9øX37}\ð¢z ’¹äÁŽÔ®~Ù'N,Áûû8ËõHúé\Ì";:D=ÎÆõc2«¸#oj¦OÉMâ:s[C$¿öâyŠõ w ïÓiç˜vã‘ävxcCt G¸óÅc;.û„?ÓYð-TÄ]vyÅx%.sí¬Ÿ56½zckpõë5ø?G@=/]BbsÅÙìß ¢-üÌð²…ì鹦Ãë©ÈZ ÃZoaêÁk&*ÚÝÑÀFïp՛𺺕6™³qj`ÄcÒ®Á纅5Æ4<Ázk>ÓD"‹»4rHK`6¢F©íê)oõ=¨¨1 |µùåš·ûkʃäÆFY&ÐÎÜq,ex.˜ˆõ&½‹¼ùUÿàß'?K¿þ„“t{ÿï~’íÈ~ÛæŽI³hšÃJF–%Ø¢í^¼8!ÎèÉh³Ç|Ï<ÿ“ Ù)íêa_¥íLËoaZiv61ù€,f!´`÷°)–©'¢-é¥ÍI«wwG›„¯Õwaºh<0¢éŒÄ|ÂBô2g½ ØT¿,3ÉOÝ/Š®TWgÕò¡Rè-»ëU­îŠÕBž¬%ûMVœ¢ZpGË.qêÇè:3>[ºúá>ÊËâøã.‰ ¯8 ¯fX˜„<Ƚò“'¥ •XTó ÈÜ®ÅmdiZÓùß·0ÝCòEV÷îØëIŒù.68 `Òæ;Ävó¢NèÍ‚®˜r»tsÂ[£Û”ºSA¦†{ñBÐ@`Ó'  ëƒ)ËÖ>íã럓äH‘ý<ùµê²9-î°%°K5ìM§;^HrÓÕ‘•Ìü/{—]Ðä̆f!£IºÂ‚÷ à>.Ñjv·úôÓ–&çÄ«VzK‡’ùÏ]ï-ìF5h„>hw´Ùlü1’-)8µ ÝÕ*Î} ¯t7J™Ÿëáa‡Æzò&’âó—ÈxÿŽ—±>êÉÏXÅ}«D=¹êçï9Wޏ¯èÇ@Ó æm·Ý Y‘3a k;{àDˆ› V‰’ü÷=6 ¸×úWãµØ'[w‡‚\a]½>Á¯!oþó3Žä"²½*"G•/>ùÅ¿ —Ï~¶jôŸx’>~òŸù µÉç¹»Y5oÚ|7Ò1͑ᛷ°G6滓œ sL=Éh~Oñý„ ÷àwKìþÀÈ·KœúLñÉœp˜mñņ äq:ÕF©×4—èd¸²+|•S†ª†ŽŸaÓ¥‰šo†¥¡©ˆÖŒÍ5Ã3rmÓ› ò±©ÅV·²k€ »¤„âÝ'ªØã´w¡ù¢n’»Üä œÞ9Eòý@gMRPÃÄͽ<áõ”ü C½#X¡wßåßÀ{w…¹öõ)9âr²Ë\C´iF É{_[´ÀbŸ—3ÏÊ«ÛBöÃã:5:r“ãׂqHƒ›ѤÉaHa/™Îçx¢Iw?'ä9ô~fWGsf4³Á˜‘ vÐÏgSž(ü@ÞÔB±or².X[(âÉ5Æsbâʼn_ÇôÃGºT-˜ÈÈÌ¿>H¬bó'yØ/Þ|ÐÓ¿—±+&9‘#)ÒSÝCŠv°ò<.ö“©H$ÇÉ-A1 Ôà…­1« ¹<³I šÿItÝ$X,ñÕD6Bâ—éèU]ÎÇ)»ÜÃÔ(Z»ùxçf,ß/aêì áØ|º¥y‰†³@×@ fMŠsªG ¯0‡Ï–E´…„DjßMÎiT³Á/¨ì.y5xÆÓ&•Stƒ¢-p/d’’3Š2êYÇà’q5ùeápDÓÔ; ƒzˆ\ÿ¬àÅ_Â"]ÿø?ý×uÒÛÅ3”™‘iíL€¡Þ·íÎ@œ˜Jæ!ãw¿B ~÷Bo¾j>ñ ý”Ø™PBMÝôf=‚¡€<ìÂ#t†j?üRš0hª»H½Cwg>%÷[¸ÈnÎÌ&ÓФ6Ûñ壃°"b9QG—° 9Y°Â+ÎÔ´ ®..{¢]`ŒíTšÛ‹Oª´-$j¡Å­7gbÓûðÅ)i ~¸è²§%$wzãšåY„vŸRÓ[ŸÚ î"^gƒ·þàö®ÓœauéJÌ‚1‚|¿U`Ìî:‘„ƒ¼îö2>ûNBò©@Ÿýb`<¥tñ"ñ½*QŸ™¶ÄÝ7™£ï™ ÿžÍ&r|;GPT$EH;]šN“j ˆ‘}Dzô¨gµöw4½Á™¢9_k‡7|©´âÜä«;¸vÍÆ%{ó=ÃÅefó‚ïÁW‰YœØ[¤/¯a_Ji$D”uÚ–‘Å: Îî;àö 2Wwôcf/kxÏpIE8 äJbsÂVÄJ¡êû`’ü³Ëø³œ,d áîÝÉ;ÔA¤‹Ðiz a't ³ ÃYJRƒaÎøG )nÁBòT¼ä4„ ´Ãù¼Dz :Ðë°V¤ÜtÔŠE(Ê­úÃÄV>2aGéË Xw]ÿ$cG-,>ïD†­¸Ð\i¥‡ÝóþÖø~ŽþB›¸É ÷ü„ßËWX豈`½º™ ­R? ‰f–÷I³säš&zäýHLm掅”^’d$Ó0_ÏÖ5mù\ÿ÷Œ-ï¾~x'›:6Gíuqòf{ÈFh0+arY*Ða"Ôák@˜¼•Kv>@ÊN•zh¸1%®‰ÃïU]ÂZ%9¼Ï³Ö"TobFr[?¼@WLUEV8&’WÌáø•+ÉedŠ7 yyuç¸#z²ƒŽT$'‘õrë'R›|ñöWþ̃4þ¤‹tý‰é¿ÞÕ~˜SÆ*`Kp¹ ÓôÝľÏ?à Õ¨%ø¾ŠïµZr¹”܃ÛVx@­ƒzsÆ«Éä`.—™G {r{0ˆšLÈi jöÁIJC‘ÁÅPßâr|çTŒz{¸&LB¦}aÔPî~hcã¡ê„$ÚŠ ™’/žf ±m ©_®lûä»Û½Ú’ŸšX} …‰„/29IÞ{ ŸŸ¿ÛÍI‡du§g¸r]œh—À7¸9O †Â‘Ÿ†^»‡fåT¢œÄý=Í'Zq×$5HÂ`TÒ«£BåEðÜÚ‡)Iplq-‘Ò§Zº2-N(›Ž|à0¤Í§ ëbâ”Ô IEòw‹Øg2sœ¥>茪'¿=H¸,ïÎÂÏ­— ½õûóT}¥EÉO‚l§ëƒÃÖz~%ì±OÎݦ¹*bÄ”¹¾ûgN.‰«´2í«{ÔùH$ MºÜ ó:ü=ÓêRC£‰Hñç’÷Xc3§hÎŽoc11ØíÜPM¤&4s'G.‘sìhØ÷ ´+‚ÖÆ$HßqzŽ÷"r'¢uEjÿJ¤| C-D‡Œf*LÔÎÜ•xgÚ#ïÖ õ¼Ò›?Y(kÖ™ìl¤;|4 ¤tiìuØuÎìl¬fÒwÁËøšôåÞ_&O0<*û@äŸ}OøÝDê{yú¾ÿÒÿ#í‡o?ÛEú§„»÷oþc³Ö×Á,ƒ6­CZbФ–Õ Ÿzsy0w·yRˆ¼B  ²x)c)$ø ²œ§i k‡OÂdûIÈÌmwÀÏÁ1‰“õ‡bN“…âvzÍšœc(áB53’£´—Æ„êK“S°g|^¥ã‹MZǨ¾ ÖsÇ(n§D±pâëèæõ±qÅ%†Ÿë¸#ª:eºþXvö¥Ð‚ïóö‹Ç¡¦}SßE¶W Vexµ÷P8ù\€Œ»žÍwŽü¬'óuqÌ@ä™V…8£]¦Ÿ‰¹êÐP ª¡‡H.!Æ“ O€,Q‹Qƒ9ê,ç]êL‰Ó4§)Isd¦'% XôýÈKˆ5¥/·¼ý°é”P0"IóT £4«~„MýàRFÚ³dkôLîæ’r*8 );iò´;—°£_^C, ûù=ïÉ›mã³ãŠÄ2þZ çTÝ|é´w>KuÆ:? 6å«,ËîsMÅ…ÊØû®¿(¤ÅS_ïMXë™°.+€o)±Ša@ ÏBÂdYŠO¼­½v2Ï—W Å›ôh,Wp-Xû´4îrO D=:NÞJwµÆ)Ê”P5P­ä¢S¹[ÁM¹'‰g)jh¤÷÷žREõãî¦)VÇyè2l†Û݉cÜã7 ¢¾þ4½:º™)Å99á-]äõõå‹§þí¿Q¾ ¿>:I÷ò¥ô×ÿä—¦|‡£¸ä¨ë”1é6¦ N—pà©‚0o:íÅ=f“¹GNÁ]Í-;ºç¾Ög ·r¾Ðm ¬Êà ? èôQýàÌ.xy˜0úÃe˜0Uâaï-LBø€û£æ´øþˆpÐ,°!–m¾.C%´¯í›N ân¬¡1èAf0w±%äÜÞn"9cy†õ%¾Oíg©¼w(‹]çüÚÐB×Ý÷êšÏPtÊ"úÖÉe±“žšk2•“ÿ\öY¸° èæ!÷>\_Ó€$cýö .W3,-ÂaW·BœèQr6ú\%؃%âòÀù ‚‘ZÝŽÉ©§ÑÕW'þå%d•3ñÿ½DÒÒæEáÛ>ÂÇ:š¹ìÓy~˜àðs6õ©E[š±òryÉVçyJ9[êG­t†Ö§i€œdÉ^±*B³×’3žE‚æG=Á-.>ÇíCc”Y`Ð8Òš8æÅs/ª7?“L\ÓzF=âÊÃ÷{ˆ“5át3 `˜Òû ¤}ü{F`ò£ »ó ²%}°SòÁc†P%C¯p4Þ;Òz „ln&–Ñ´Wo^'A¤µéE!¡9¾ÌO7ûq°ø=:£M¤lhÜ4íÓ#ƒ–'yQ”Mdµwž¢ÇiÏx}»7Ð+V’ë‘5‹ä»sÕ»Èý>î™ãþ"Oßÿ_ýùÓ_ýå·£Ht’nßüþªÖž_Zmƒ™)Τ]@ä¡îVc€E;ø)L˜p,ìœ CMØO}Ø`šPCc0‹T`_÷8‘6×Ùö˜¾˜¶„Ãÿž0Êá%1¦éDóÝûœ¼ŽvˆDqïÇ´&L?ÙÛÞ…0€Å7¸²ï¥£4†ìF’hP^½ËÌœ€u¤95 îNŒ“Äþ«¼s(GCºñ" ^Ë á$˜?wK¾t –™ó‚„4wSŠæ!²V`÷ǵÆ- ˜Šìpë,Ì)fGK•þ” AJ–Îv‘éRÖÂÔ©mœaE£c,ŠûÃåÒÈX”!Úy/{"f‘U» ÓþÂ9°bHOΧ³°9Øæ¦§"F‡Î]j”}™_š“ÁÛÜ,¢s#îgL^²Ã¥ò§íŠýszh*û¼ýȘî2Þ·ÐXíNÔ\ñÔw¸vo¨¦, ¿]Ñ”UG.D¼XLD%"Ví¬Û¶È-!ºµ"…q:þnm9 î›Ùæò‰H„Ð1Uë<Öé×CEðý–+, | ŠŒ¼eÆŽÏZþ?Ü­D¼,…b–F1!1²ïã¼.Á0§#Õ«ØYÎ77 »+A”d»+þ÷+r¶Õwêå+0öñ|/Üå­Pû™{ÔBƒÅ†ícÀþggfì‚ ú×kL›4ÜGˆý¤ºÇDn¯Þ6sÒpÇý¾4(”’§{É6VŽô1×]äÈ~›9·§<‰¬O«”ö$M¾%×_öWýséÍݾ]Eúãp÷ûé/Ë×2¢-˜£¨µ×À²LØîa:Ž„¨†ÃU=wºÕ ‡“³ÎrvÉ‹Ýë|h椀éý îùak¼’w~“ÈÖ>4n˜Î<Å/Yrh S »)v½†êzïyèj4ä3 Èc¨©ì`´»kˆg+&Ÿiª`¾³ûÃÁìq?bÐîN´kA~”ß„Ý=,D;XtŠ¢\eîÞ¡³T\hé~ÚÁ¹m¾C34&4L˜ÈÑOšHH MJØ'GÏ™ò£Î5àÇ~ÿq‘ã'ÃÞ·{3ع[ÃYJ0¤è€®‰ØîÖ•ÑÂt&z-þ~ØæI ÷18 tª³Kù9ÐhÂ0É•ÌÑÎV˜Ró'@ Ö‡ ¾?•´‡©jÁQ(Ëm4[CÇWŽ6¶›³ùc^v«g$ªá½–'W­œò–°6¹r+ŒE$º/V Q¡¦BöaFr”àF¨"í:ÎF±CÛʘüåpD@Ó ƒ4zá=Ddk@,Mœ¡NT&%'ÕŽ€¢"Ú)·ã‹Ï~ä·þ6ù6þú`’nïÿƒ§¾—Ü _ÛN=ó¶ó!ØÜö°egwò‚Ð'‡¤'´sw«·i–!^ôz;?Àíîn`Xt¹ŠdŽÈC™Ù»k0°pC±¶ËYîć†Óì´eQC¤ZÛ|‡”Ì¿NÎNâ†ÿÓ]'„Ìɹ‡ý|`®ò"¥¯6ȳ!èáu°s~ YÇGØqU'ï´w>Qg]vŸ8f|ÆI½Y¢ÌŽ2'Ní&g—+@ ÔŒNyŠ„5:ùüì¶²“›)’Í¢AH€céÎE’óþß½™öF·µ#Ä€î!óHGùfú}ËâþÖðßÛy em—“joé.Ž8-‚Ï­xS¨òF<½ì´×Ó©R,Øõ|&O à.'›ÚG_M Ó-!™Þåæ2‡O4vÔsg5±S†¶y†Š¯ø\’8JÂIXŠ"Fßsšû°Pjú)vóÁ¨ÂJ¸S€²„Ô;uä£bo\kR¢OCÿÐR—~æ4XÆ.˜h‰¢a/àÚ¤,l«ÈñÞ p$^Jq”Š\Õ`˜’FQÎO£/ÏṦgB÷¹ ûá ͱ²°QŽ{Zp÷n€RIL܃ZÆbÜdò Ýð,„æ‡äÝk»sR)9½øºï¸‡}{“ry¨·ù€×û(ÒëšÍ‡rµe[dïß-Rì‹ËŸöë§\ |;‹ô“týú¿þ÷—_Õ»‹ò?È›½¸‘æÔ2G·{çD·^Nù›‚Ä ‘ÖpÓ0"®y M6ßo+$?M{ãÄðúêF C°æ+¡¡yÈͰ?Yœ®Ï©%JÁTÎ;Êv ’ Dž1[›I4n y°³†Æ$¡çޤÙ„šO|­ ‘½ÄýÑâä$=a·Ûp4~°´9Y‰SAý (As2‹@;¸‰½0HWô ž ¦‘.‹zr=wÝ,â ŸEŸŽ”x÷rÇg±~Èå»g:ý¸É¦”«ÆFâ5˜bˆO03ç¼»tM®^ò4­8EíI0Ù‰f"Œnd²ž“ÅßïˆíQ4ƒiy˜–?¢#~œž>€¹›3OA 6è^à—äØ-2þ©w]½Øéæ6´ ò»“Ýî£A{`t?’ºž^˜ëGð@èÁ^÷MëßWÏèD{ ô݃Î=Æ×ôœ›9Ék6ÐCê5Hûl„Ë{jE1„TL×iP}(éÍe…1êtf7¯aï\Âݯ"$ú%qéÏ@§>ÂqŽxX pš6ÑØI]¶t²2Mî]1‡‡v–ª’45üâ÷~R·ÐéÌ~Ÿg c5 ùXÁÚÃhb„ϵ‰70µ7Ø#'7™ZÖ‹g µ”ânã{ï×'¿ë¥u1K¢*ò]î?ö7Ë·ù×Eº¼ûÝÞzý^iå­¤‹l4¾·¶›$«Ã! ",svâ”åømõ¿ÛjÐŽrb\\ºÅ‹MûØY´þ¦ut¬‘¢G 'Ì®ô¢W¿P­¢Šo€k€UÑùi Ö¥œ®[¸ºïF9ôîð^ñ8Ë) ³ ƒŸ/ yv¿\Øæ,Øy¸ª›ÐäË€ § Ãî¿‘-´ªôwöa VZQèðyç<¾n«ãao¦‰ðžT"±úØ“¯ç3|šjwߘDDÔaÇ`¿øÁ=~ êÄÓhúYyhθK§3 " (Ý]‹\1ÙŠºGK#aÉ‚ Éi÷ÜÏk¬ùÿAö$‘•D;ˬ´·¸´Î™`Pã"gH„!LGƒ=e-Mçým†÷x=<ùú}¢fy æ„ië`œG#2ðŽúÈîí Ä¡«?§yñüŽéñЀ r8 ñ¶1„ˆÅõ” '>(Í|uãŸöp·Wê‡Õª‚fë´ÍxŸÖ"r44$Ë 5LÛ­‡;ŽŸéÝ3­DÚ›¯>*¬å"’ìIòö,*?ñ£×_ö~‡\~™|Ç‹t?~ׯ³t±¯f2÷å†(AqH¥£Ú†NG«=\É¡ëöÕèÐZH)ÑàëMQ½=^@»{6·˜R.ÛúÞ'UQùÍà˜X bfsq ÷ÐÓPåúМ>D”#ÛÃö.§0ƒSÒSDêkvyÉÏAšß´‡¤¶Ø2XÄÎEÛšé›7ñm„<ÆÞ|íÆüæ¬[¥g¥„éV±ÎI›sfâ\Oï]0™ò©æg§ -¡Ù` yz$áŠ)þP‹ÿÞßÎpØ3ªÜqÌŠûrÓ³Ìf³àB¨rÎáÆ½Ó¿ùн¡|õèÕFD¤Ì”E¶·£ùîÁºÅIxí9¬˜Ü¥5͉éZöädÈÉò.gò£]CY¹Ó–´”ÆëHl>Jpf[CV}öõå”uSvümˆ» 0ÓG¢É^w‘~\¥–ï‘®ëþɯùÇ«|~Štyù£R¾üCß/ú<øðš¶±;üY ]D‹9‰Éô€êÙ¼„[È•Ф„éu S¨Œ‡§ïþ°²ÈÌ ¿öÅ™Âñmn_ò ñr­iFäî-^ûL3ˆ榦ŽÝ%õŠsÒ¸øÔN6¹iÖ$Ä,!¨!:é/°jÊn‡ï.é®EòKºº½j»ùÅÁ0¹;B/o‹Ð/«²ºe@E –¸µàÐ…‹1­` &gg[ð祛V'» üÂMƒ­lu`¾ºä¨®NOãb¡#Ív,¤A¥5 ;«?ÀT&Ì‹<‡`q¨Õ"™)¾CdRÝÙ'r iI+ìGCMÌ—˜N|žunS{Zˆƒl•³?w?›œöÂG`s¥-n‰žt¬DŽH÷|èŽç}’ÚÖ 79§Lµ€ZÐ[Ù|(³»9CyòG ÛÕrÖiÏõ—9ÚtÒeÓ4zûÉâ6w¥cEëÍvÕýpøœÆEMÆ}©›'ɪ;ZÓnNj£ÖhØêÈRWÓCt@¿-óÌ.(ŽÞô82xÍËòаvuœ;®zHš3(£“bl´bôiÑ3Ñl&råš¶¾J DÞР´*’BÖºÁ¨äõÝ`a÷ßcrŒ ’ºújÉÀ›*/ Ž•±gï/hÈãÙ°»VÏ@ª¢—'9ÊüÅ'?øWÿ³²<Ëw¼Hßü]¿Ö¶Tò¶H¯W'ìD«¶&²ƒÐ :$=‚ NL$Ãбe:G]œ8d˜Lú2BÍ]«ú„ "i8„‰“` ŒA EŒXh´ö°G ´9[ë‡hº›…i£ÅɃEùDÔª ¢…Ë#ÄG ´‰>¸Ñ«–P/v¦¿HŒ9ÌÁ>µ3˜çd¶{da‹;+@ÅÓT²== ÇŒi=$›I±Å/ìvw—ºÖ=›•úÆŽË£*ä —:La™>ã€Õóê]0›¨úêûbž—ÆKöâ¬ç¨4kÈã­ÞPÍUD„~A4Ó5ì˜Ûƒt)4˜r pi:ó,ȯè7\ô± &Ï®®/A1€÷ŽÌéévÇ,{~Ð9¨œ$/õaï»ûþõOS.Ø=ox›€¨X¾ ‰[„Q‹äl»º½ëTdš²°ˆN‡Â@@M¼útÉ©/}†Ï—öÛ‡P÷ô¾GZÁ”‰qÓ6¸\‹´Šbó;¦Üý³™Ñ©øž "Ôìbi3Ë;„ í€ç`³8é.gr #= }´.†Bõ=¡²Ù©4=y*3Û™üvúµ<ùì–ºGnÊv&Bv ¸äç2gçÉô¦XP>°Ž$Ãc ìú~ä=N€ºbzn`õ×ò¸¿¨NH}Ô´én"ºuIéU–çïýñËŸùÿÃòúu†»ßý®_§½ÿÊ^¿”¦¯ƒUÈh3@?Í_žÒXÌô¼ojÁ’ÆEÔ4ìôbç{}¸ ³wë4L˜2—°;äd£Ðï1ýÅ bàã$ç¤p—“Õ!åìò&û˜;õŒ× tóýéð˜²fø|€ðz0£g—m蚦ÉJñ.vB½%\`ê…Œ._”vqgg‹GÁI˜8;¿o`Úvtú”WõæJ¾wôإ渆&ÉFÅA1uMf>|ÔOèˆù´SÆÃéà TEè˜4õïùüZöwø^—Ð,Ô‡}oq‚õŠ3bO=•¨Ò4é®kžŸù Ø%瘽l¾gNØ7e¸pµ!°”E°‹$÷¿¼ØgúÖ«œýžÓÃVÂ: dßNÔ% 5õÅu˜4|¡WChZ(*º"êórfŸ`c{˜ŒMNQ‚'Ù“ör ’è" kò¹´+4±$).áõó^Æ„Æ r¢".Äf'¤ÒMñ†§aÂ×êçê”Ï|yàªð¼¾ü÷ßÔúýp^š¨s'jXÞK©@r,ð^3ý¹‡Â&‹4pª“5LÔ¸lh.bæ¯Ú|:N°Õ´lH·ÂÀ½¹Š;ñÏЄ¬qf'“i]ïç.|’Òºäùࢱ%è»™;|÷ìÉÍI¦¯4ï.Ú Ö † ~¾G!bš,a7nx‹ïÈ«;=ñïÓL ôÐH@BZ}ÕõÕ¡ÆÒ\>§ßA¯(o6j­â¢ÕMQ̵ÅóŒTó޼íÃ7÷xÅîþÐ=þnÛÝñÉâÄ®®çŸ’*4œlþfÎ1àGJÙ&”›¼>]ÎUò‘é5hZ5„Íè”rà@Ðg¯‡+&~ÏÚá}ú°s¶°·•¹ž›‚Ò¯j(‚¡ØÌœe8•/ÝJRú˜2ØÜ)÷…¾¥'_YÌU3›•ýšç{t÷&-zØR&/…»R"EóRÊžá^ÏŸ+']}ïÊF¥CvI‰§™VÛÁ±ØjVRTƒ_@Ø¥§äÍ0å`9ºÀ~f{FNs„ð9A¢‘ã–á9í;þr6Ãa1§Ž}JVñ>´ÝcØh-(Ö‡åŽ%L£@‚(ë¬1+˜µ#Èh³k“û݉•œJÉ¡¡4m†’E˜Nr-ïÛØ×Žìeßäâf%ŸÿŠaaESÜ`u ø‚»HnP•4çèHë´…}COkIôú½"é›rùž?çß^¿ç¿õoýœéþþßþ³Õ¾÷kz+û £»çôÖ×bþååC7±ÞÇÂ~ÂI›3¨õ%ìa1‹ôŠå|(ðvgQ_GòÕô… û\Nè…²—±ci€•4¡$…/õ$DØMN¡ d¼JˆÙkðD6è4µØÝ¬cæÅæ¦7-[`@‡†‚2-NÕš>¢2 ;:÷ÝOÞ½·®OQjt‹ˆ;$cÝFažä¿êÞßr÷FÈ81 kΛCЫ;ÌoÜ-N¦³aˆF H±áŽØÌ§Fuš£ýÍnmžjÅi¶Ü|OmàUäO¼]Cqkgîļh·ÝE‰ËCh §¿zw“òC IÝ}z­ÅII\×,«§ŸÍïep÷Êèôïö •ŽNu5¤„Ï}ºnÕaq|½Ãé‡~÷ô¢>Ynªœ]ÎêÿÈÉ€hºÈeg&ó¿Uè„Û²éá¬k‹Æ$T5É[O>ôêk0NRtÌS ^”Ka?Ýkàu줩rJ‹^Õ¶º>W×qºàu`Ò¥KÞD»‰Z™¹?õôý/a}r-¬¹§%¨=îXGéÈ…îw‘<žŠbŸ±ÒT›œþh&,ªHð]°ÕYõ‚;¢×‡•>×òâCMNÞ‘1ŠjÇ^GבÜùËZ×#¨G½òn4G ÑvÄQV’Wo!l°¹n8så> ð„¬R·ï•Úiå›_¼ýsþÑß,?¿|’þÖÿû?ß^Šôò Eá¯i*²@“X*öÏØmÎorXä8ð&ÖpO¨OΜšÙ½6m÷à0\¹êÝÆ$P‘ .HØš2:d…"Ü%H‰ ê/xXjР†z²­vpðâĤz¦75ÙØë¨8Qešñ?h0g3wÙéÞd4a"™ „ûéŸ~ =%BÛÃD˜ýÒ ùÄÂÎ’Å4/žîÂÉavÇ0ãg(ÇtG*cI— 76({h‚4ÈõÂJÛÈ{U»:[×@J¼GÅÉ1„àê1öMZ±þ¨Á»ðrNÁ´ˆtðgÀ7W/LÒy‡JÓþäÍ‹·øj†SÁ|ÝøkóõPGÈ w¢ h?Ó~žô ÝÏÙO˜÷ëÏtÓKhn¨uÆy×zýuqZ)_w$‰3õìÓ„(úD‡¨ÒÉfæDXƒqÅ= oX_Q¡ÀB¢ux'÷°éñi~3åEí,±ÑègM"¤“$ qu£%=£&”.6Å÷¡m€¼‹‡³”o޵aER¹ùÖJpŪp"cz—¶èrûïìÿØÅ›"­n$” ûÚc@EˆŽâ9:üïcìr'ó›ÙÛdÑ/Ý“¸&AZÕ Ð—ý¡¹ ( ­wçç>A‹œ¶­þŒ×TLÊýîЊÏþH*•$isßïŠ&GË@äju‡1ƒä²STq¯éÕº‹®oÅîßüž~ñ_ñ/¤·ÁòsZ¤ïïÿ­ÿ‚%µoŠåæÕâûB$&è"ENi?´¿Ûï^$ .›?húµ™†¤çn¿5·×£ûXg—úô WΞßÜ[°nD—ŸàHÃét’³°Ë•6Š Ì¬‘ÕåH 0¿m¨]riâºÊé¸cÙk˜"²Hǔߋ§hÑ+xÊŠh²q¸îwæ —3ÁfÚ96w2kÁv³Ý Ô¿àRHØ5ñÁ~ñ=Í„°V9{;£ 5ÈZÚûÀxÉc ,sB‘,3ì$²Ô-Hæ­¹Ž.xvðÝað¹'— ÿ»„ÕÉêݼiФGûÅh\ÁÂrƒú/0YÆx„ÿ^åäãÍÊ[˜ªL]ê7­[“ËÞ,Lî˧ÈÓ–‡ÂÜÏòšÜþø¿c9{ŽSEq R16goƒÿtõ)9aºâù¯”«-rŽ%mMŒxƒsø:úžáî>ßÓ|â}`ÿ†z tìÉa_ƒ<‹Í2C\â ‘`V[ÓŸ †gܨ‚]‚˜>Ú‘±T>v™ŸÉþÀF^²¬_í$uóžºN S²ÒêkËýŽÍQ•Z“cTÍ-=åc»lÈ—gÁ'Xƒ¥mWq‚gB!¿Õ_ zùé/ø‹7æßú}§ŒK>ö+¦õ«HÿcßÛ4·ðæ%PûàÄŠ*ŽiÑGãˆâÞljy¯)5H´p YÌ©{¨'ºÐ~„‰(tæ1SZA6‹kÅ:,¹D@árUïèÖ’k²OZz¸ÓYï9}³õ<hˆšãÎŒÙiRCaÏî;Ý“Kufž.wpæ]¸ì®íŒ _r_ÂÞÅÒ8=¯¾?²ê{Æ©ïa/¦sÛ:¢ál?jîŒùg&9%HbZ`ž¦ ]opjŒêÛB“„KŸ—à”³-Áš(µ¤ó½ÈÞNè‘+õ&iú¬G2X hðŸM@÷U 9 Úƒ/ûêÅ”ÇX0ƒ`zÚîEÓÈ!@3ØS°«ÁImJµ4ñÕ÷œÓî78¬õ¨ù-ÙNí3~/]ðcŸ:[Ä6õ™V<›š©CZiqoâžj”ÂÙírŽslS²äYÅ™ý{›Ÿ9£y½3‡¢Š´ž¥™ÈòÙ/”Ö™t}ûîú+ÿ‰ß"?~"]쥲IÛß‹.ïq¾8¤ÚhRAÖ.ºs59›;ÂGi„ëL:JqWù"çœéÕÉ…!fR· k$ôÌd#¥û—…‹¿zGj~¹ã@ÝC !÷F?ï¯üšv‡Üó¢ ÑÚOtÏ/P$ÁDeqÚ‚.Zðì‚®—ðåÅ€IòÙœ0! °6ž~w‹ÎÖÎЧm2ÝàR‹iÂ÷ŸÈ{LòâìÏ“ï2öhô­1?–¦sš2«/¾³³%8€mùæ+س÷[Ôâ{e‹¶>LšÑ®Õœ,Ä P/AÛ!â@´¨MÁrv 1޼\ºÇ5¶Ã­E ±@‹0õÝÃ<ˆ‰{0/yô»–°B*{çþ@ä ûiœÄ†0-aª×0Û¶.æ¬éÓÄ®çuÔœ²çr5¸3˜Mp$¬ˆ$˜I„_ÕŽl•ÌiñÝ¥c$F˜69hL‚_ö{‰{àV]‘ PRÌ&•Np,ï(žÅt œ„p·L[ÛdÃ×VÞ?4c@œê}Àà ‚!ák*Z¨'wëPˆº¿›×Qïø{IÇ4½ª»µÍ»Býn‚5Þ9ÐÐ#=2‚¼æ"³èûÝ“óHP®PuðgÑeè¹ëîÊÍãk'LÈ…A>”c¾àka!’Ø`°wö†À½Š4)’t“dŸH’?øÅ§?øwÿµgùùS¤o¿ÿºe©G—ZîÓ¯•ÎYü@‰$ÌÞÜal¢>÷êS$æô»“yãÞ@šóî ˹㠋UM¦ì«û«Ÿ<Õñ9Oû<8oÙ›°'йà!ð~6i”ŽíÁ¨¸Þwî%ÂàlT^ñ n€éЉOVîá:ÓÉGÊÎN/ê_wÊ…‚ JIE{0·GÒ†³ O± ¢ ô÷ø¼^qÆ»£3¹;Ÿ€—Ú‰… ïøù³2Ú1…hQ•£$£aIœä÷=-ú„º—óç×¢}dróžº{f¸¢ÐöÛ‡†“?¹=|Ï8½kø¹b£Ñ ç³>Y©Ÿ DÈpOW~à´ÞÑ8؃‘ Éa ü—Y„˜G´ ä¤ ç'¿‹ò“`¨¢(†øÉVÇs«r–²Yž¼“Í‘o&&G&}xæ¹Ô”Pî/¾Îâ{BR¤­N¢*÷À€¯²Ä]öÛhP8,b.O.+ ¸–ê¼’©kÖQØòSÈ9éªTXx"ÏÙŠÛ¥rÐ2 †çn 2ÿݽÈìJùLó>àw±C•’cŠâKyà²Ø¹û}_ûa4†!xÑ´Šö7Rîìß±Oõ¿·üéÓ¿*?O~ eÔË¿÷«ìR$/U¤½ws"LPUô f·Ýx9‚ˆEÛº†7ãÔÆÕ1!5s8ÓHüYœåJ!>»0 û'ô¹;»»ßƒ5(“qÌ3fé85÷w7ßU÷èVƆauδî\ϺÎy6ŸVZ€Äz=ßazïЋ“h’³ÞL)$ìª ‘â!Ö2»1)6óÃ:å\âd¦©•–‚U¾¾-ùŠ>×°cŸLzî4sh^X€ñùfs&8~¢l9ú…—€°à”¦ýàµeL1½º¹òØÜ\Ÿqº†üqœ5úz7sxmNÞæfz«‰†)PqÏÏžiEWìu%ìQK HƒC®™’eVÑ­†B'¸H8l>Òvqº†5?ÿÓ¦Úà,0êOë &:-ãXœÉ yŽGV%GQ¸Šh`¹sz-1O]ÝL‡Í-¡m¹øŠŠq—à‘¿³E¿F~žôÏÍW3H‡CJžwÞ}` —`ŒÒy›Ç!NÿmúQCÛ¬¡¡2ó;QCÒf4±×á„—Ÿã?=£¥n¾:²Ä»²W·Üd#_é÷€¡CÓ€»+w¶O˜8%¬€€|%4î»ׯbB9Àõ„ÂC•BÐÍG¾£€œD)†HÊþ´V}ïÎd*é"òU@J;öÊ }â@yÏöÑE–7hNîN KähD&¢ò‹¤åï—V»¼ý‘ÿ믗ŸG¿²ˆHîßýÒºXîbfÒ÷!t_ž|H^Æ$¶{Щ½Â”àdü½P÷ý|¶à†4§cÀèÔèN’E4¨Ø½ƒãƒb:>\!¹‚»Xqó|Û‚F¦÷Sà~8×@›9µÇù¢²@8bã’jЂ~už"º>ÄIÖ é ù$£L/m4>vñè@^ÎÊ1í k¸Hš3礂 ¢ëÜ«SD»V|_yò@ UôkÁ*dÛ†„)Í(?ÈhÂ3°óTdn—Š~uDÅ4Dä©Cèäð3•$’>Aaµà˜¬Ig؈I²£‘Åì ûÛêò8[‚Z—Pïç÷‘jN½—%NàVýϦ·ã³ì öH}˜PóÌ-‡öOŒï­„‹þ|ðlT¼7$ŽÙr¶Û´ y×)§4Èû'ê{REáTìIâ:Ýáug=ß. -aí궬-0¸ ›ÿÿÙû÷XÝÛô, »žÃï÷¾ïZkïýf¾±Çc Æ6'ÇI›ˆ6ä H¤‚ ±¥*U ¢Qš¦*¢HUê$mIœ¶@•JR*¥)J¢hJ+§r)瘱 fרÃxÎßÞ{­õ¾¿ßsèÏu=÷ý®RHƒñÌ|[úôö^ë]¿Ãsß÷u_ì†À¥G;à Ϯz±f!øÅÍ­¥8lÈíª¸ˆÅÖÜå&ªy ty+8èd&6ý“J‡0iUM‰¡Õ\Ô»FOéJͽ)–Á•0&L­€&ÚÃpœGqBìîõ…“«q-0#Ÿñ ö»¸Ý¾¾vy3šˆéœyˆ|5¢s´ÓÜÁ3&qݦÌojhï.# J?ù¹ÖÈ@:;›zžý¹Úx-/æI^¨ü8²gZ@À=ßb»ü…—oÿ¢ó·Ç›þtªÑj¢÷µ·Ûã=~hL6˸‘¡ÚÁî÷.z€š+’!Á¤9}£ ¶r& ÇîEa s" £AQJáÁ[#:ïaub¯G²÷ÒÁACÎ褌ŽÛîmRWžÝÿÙŒá}ÆuoÖ¸Ì ^ÛËȾ™)Ê$‹hßæ?[s¤¶f„Šip²Øx¹³Ë]œIÆÙ½T0æfs.MÁuÆ!9Fîj¤¯žà.BA\|Ý {61q MÍLbßÙR"ý¾›;Þ¸)~¦ù¬l¶Õ‘qªMÔvÏnÚn¸~áõŽ'§ÁF| «í'Áy³â=朾óbŸ'en‘%É_H’49ÒU¬k{1{XÔ£&퉑L¶½²à왥PeõÂ$aúyºs÷šr3¿^ OvÒÙ¡R§ks›ÀµHß 2±.fƒŒå+PwçK8óÐÎîè­INvH¾H(¦Çž<®az¾óë3K¼Êdù‹«3E>\è£è‘Ýý"aSëÅ+ðÍŒU$a iú’´Òlz§Ï’Ø{T#…d?w[Hì*ÀÍ‹ñµ÷`ìèžÜ½t÷8VšX½áï£>:Ýò_œ*@[‘8Ð$ãégÏyÇ.auîÏßó*ÙY5fzídŽW¢j\ö3¯Cæy¢IÊ+²ú›“‡åÑД{¾ÇÇŽØßÅ^>ã{ßýçÖýÖ?ˆŸf¿b¯gÔþÉÖØrG¿|~ªt Ìêºåt°½Oæ¾5&3$áÔâ|©£í䀸œŽƒÔ2¼Ü£¹bwÖÌ^ì k ×±‚¸&Åf».MÞ’yÂM:°ˆ-ÖyëÁéÁM–ÅŠ³`#]/¥…Å`ú°˜nw! Wár4K¦)Qmʇ\¿ÚCø¹uïÜîwºÚN¦|1H½wgm*•M<IEÂâÈ[þWrD½úÄXƒ0rá5k½ù ‚dùÖsj*¦$7ÖS˜òàX¼xb²QÝ^þä8éÉš×F»ÒY˜$7ꮃÛû_¬HÊGXÛâd…‚Ó×Ó’öèö¡é‰¾ î¯íö²'2z;‹X*6±…Õ–zϵ8¾\݃>%ãSÀÛ©žÁ8-¿šsOÌ .æP0{ y¬{æôîˆl’¼ÝÚ„4I€«cx'®Í`ÀñDÒï[tïxìôñ/ t ôL¥éÝ~¶çfBâÎm.ÝÀæòß%«Ë ØßÐsÎærbDÓ\3ñ¤› ˆÅ¦Ö@ҖΜLï ¤19®;gÛÙ wÛÒ Ád]LÑc¸Š—Š©‹;_ƒsæ›d\ $±ñË|ç“j߉¾Ø¾?eƒ«F-Xo¹mž·ÍÍe¶m ‰ˆiâ~¿Ç±V r>îÜ 9ËiLæ"PÖí;îÒç^>û®?ô½øiø+¢^Ò»Ÿmµ#Ÿ#įC ËXÈ‹¢_èuª= ­Ú¦ÇkSwÛèi{`qvñ‹!Z²ŠfŽæ0a0æ< ÈLLÑi±Ïf'wFŒ]ØîY4ÝAÝA-æòœXTêÎ.þàØËÉ ø”Ÿ•$cŽÎ(»f‡R€‹*'Ky§k4Ì—wj®‹uݱÚT+KÓ =i?F ‹ö\rjëOÉî½XW3¦P‘.kKçvÔÕ¥gcÍjœÒ%B’uçîÚ7`º ÅíQ§vÝÝW!5 ¦P¶÷<ðƒ»¯,–YÙIºf><ñŠ÷.XÐ~xR0a¶˜þ¿G'“LÉ;56ƒ¾ õÍÔË ÞoÁÆË“IOŒ9‚C ʸ;¸U‹³¥­¯M³Ý6Los­àHuenb…úuŠàt°_’ ]Ý ÇMä½5ZÑg0;iT¥×@…3êáy¦`qkîÐîgþå4ÆÅEQÎ`•bÍZl‰Ð{‘ÏÓetùf¼c…_6ÙÙØ×Íe+Àå}¾³•ÝžýZî7½ºÙÌ÷³+ØÍVD³‘ŠÃÅ›6Л­¾^`ªr`+—RIaÐÄ«÷8Yc¡w¤À~ÞitÂ+ESá@ʨ…V®làg&69'©ŒF:Ä9+õªSA„fÉwûÙ ¤¢ÖE›½72=Š+œ•{ïlÒ559û›AV=Þ H!¦bÉ?©}ñ募ýÛ~{<}SûéX¤s+oP.—ãV´íóÀÒP.;p‰ì“Ú/hqÇU¾m/„|6F­9¨×OÓí'ºð Çn@û‚N½ Íc{0=©ßÄÎ7 –Œ–lRxЄà2«›idÅ$“dã2ygø˜Öµ•ņĔX@Ц÷ .ŸøÊ»:á#+¢jThÕøÔÍ«Û~¯G»fÝØ Кk*X@Ê…+‰Q™¾”*)ÚQûey7wò‘žìæ[»Ö’ÖúD[ZM*Tu½ƒÛõ/•9]ÀÒµ•à•Ÿv5÷²ùììæÞ6î|½$ÆÏ„vÏ…gÕ^…8Îp`c³;M¿ŸìºǤłS;ÚØä./ÆaüT\Îxû2ìîòîŽO†Ño¸xxòsmƒ;Ñ’‘›fú[}²ÛæuM4èHéIãŒèššî2 iÛ“Mý ~P&¹éPÆçêO¼¶ãÁšJ¸XUDÓšO·¼åæ´æ3AªØª y“xtþüJ_Ó÷ÄN£ž7i5ô$,ƒS!w¬™9¿˜¡ˆ }ä¤÷NõÉÅžÅ9‹Y¾¢Öƒ%•ÍMÖ4XZÖaïo€ãiìd×#pVx—SV$:Ѷ“éÈ›4üÚË?¸e£Â<ò“v{¾å“ß6¢±´ïÜÎãÞ.dv&æIÆšîF³œ¬y’Õr8ðskJ')ó¬ÏËhB:SÌz+ÐOö€Þ*Úò´TÐÊ_xy|ç{~pýæ°ÖŸÿÙEz»_=¶Ž)žüøx ÈL,À’Œå GןbÑ™(¬üÆ,ãæ åœÈ@ŠtV‡r! j”ÛÐÔ{h2š°ßOÕ¶ŸRJMxtZ×ìvRÑy:è7±²Û—kNº»ÖÃñÔœÅçbз„i¬"çlÐù—ƒ›Ba21/?I‹‘¶DXš¬Q•p~tæ"üÝ^lzš·';ÿ@xw³õGK!¹4-gÂRÝ8-Dƒ>*„Ê%/bÆJß L‹Qù Úô#«ZŒ‰ÛÙXÕí╾8~ƒ_È£4Áì¾a©œ&¢‚Oœ½eyd#ÅõG|„n÷œž¨â—¯|“ö%ÒÓŒf™hœÍ¶Ö{¿O“žüi Ìûw|n7¯ýr½…k½î`ny…ÖåšÐ&&´V9Í5i7ÆvyÍb¹Ž&6sE$ÞÇLSÚ¸ç ¦ƒž™ÐÌeÜÊá,-xbÚø2°lbì瘮y%"l‰ ¦)Qìe±”Ëvý,I:š2®ƒOªƒè}NÀî¢\wÓ­e´ŸmÈ"Ùxf"p+ßµÍÆQ«6.·±¢7µÒ‹yV ò› ªæ+OíòN¤«ñùÚÏV8w9%€•ÉcE\XG)Dfö´ŸÇ;”ƒ9aj¸¡ëΫûxf+wЫT1[¹CXž!â‚^î¾ã~/~ÿŠˆçcYÖ_½¬ PΨåCˆí8`ÔºïºþÝË–dl¯èÃLÆ_»ÞSŠiؤ}+î,R‚Ÿ¸¥ÓfºKxÆ‚S-³uB˜.¡qwÀ@ I²Ï 9ÃDò2tƒÔ4g Ó\PÜô îvð¹ÃÃûÓÐÃ{)!ïfK*óúNYCsŒ×À Q¶§!Zæ.\IâˆÅ$G:¼eÜ0ïG²ï«ÃSæÚ NªÁˆWÓÛWPófrM?bò+/zí¿åkOŽˆvv,·‡¾ÛÙd'J`“÷³ ·æ%K>]È'JÅ'¤¬ävªž‰ÿ”´EóÅ:&²e·©l2Åâ¦1M¼yb0RÌÜçtñœˆ_fÒïO gOêrNYEyíDlÊæÂS<lâ¨_NÓctYÅWú;®ü³û½]Þ¾ôs_锻힅 bm݈añâ!•LiÅ*2»^¹öp¹ñÑE¯‚M„PŽH)aò¦Dûõ޹¹Ð™ŒLéWtú¸$¬>š÷v¶<êÙŒ'×ú-ç3îP3Ysv­ÿVÞË0š‘êD¬d½°ÁoѾvèôÈÀz7š±JeKQXJ4)m’DŽg°2ìcgãÙɳ3?!iæG¿fÚufÛq÷G"tô}€Ì‹âØ9wFI …-÷F0-Õ îÌúÌ$†aÛ/CfvÈü³G6pg Æ÷p¼[°äˆÐ?û—_üüç_ÄÍÇ:×häë|µæMo¯ÐÚy\pvSýhð^'ì’Ùm—‹‹Zd€vÜÍäi@@\œ‡ðÁíªÖ¡s踓-|¡Éðž“\gš1½ÜD–¡i±35òÅbþÛ“Y½¹—;’Þ¯!ÛišâºùéæìR'«ü`°ßLºrõ#8g!黓Rv·³Öù›ÍÃ7À¦~ÙF™òó³¦%•SéƒlFüéÅ"<0z6vîDCœ4J]~ZLŠ“©È[¼Ÿõauò:B‰U¶“|Úã0àÏÁºkM)HƒpÁ´î´¦µ'®Qø¸ŸÂ=Ìì®ãÕ®ú‘{êÅïhr¯°8ÒX£×ñfþþÈ ZĬGXóaùKÑ +ÉUÄu<¦ÿÜOC48™(Éh½±É1z–©O=±¬Ã±¨›#r1ujÚÜV;¼ÅéPlŽs‚ÒVz÷Y4}£ÁèYI®¤]þéNì˜ø=™¦V’¯+ã–6VrÏX£B¡_ 9Štæ“ßÃl~|˜N\I;ÐJ799©à½\ËÏæ{äÉcݽ‡„°Õø­‹Y™báDMò_ ½œ¹ö”µ 3‹¡1 Ë uu:”ÉÇbF_0e#guMëÇQüõß­Ò-»þF[Ó¬±Ñõì p¾Ø³Ù ›[Qдr·##[W2³ ëO͆lHžnx×ñujRNÀ^Ù˜–ØÿÓ—§¯û/ÿÕõã?}LKþŽ“tÛnbûÛ@:¢ž­t°m@ ÙäQuÒõÆl0%úoŢݚhñ¤íƒ9Í=t=]xºA;²p›QŽÁ:°^,õ$V—+ܯ÷ss'ÔlzŒÑ2š±¹á!Ztf¥œó0žÝ¿ Ô›'žæ2±¹k¹Jý¡'ò4[i§ÙÝaÕ3ºˆAí¯2«aÝý4ï—Õw¬}1ÉEßÜÀâ• •q•´L¥sú™;@2»Ej .V²Ë¾”?§Œj¦¶{·}’¬T#‰k2ûAJ™°X—®½b•þscw {1'±«8]»¦ã®"Añ„ ¿?÷Æ Ï4í¾Î(¼nSWrg;“ÍÝÆÄ¶¼à>l}25÷'«<Ù…û]9®"àeQ3yéWlD¦â¨{Y3B«ÔÈv“…Œ´ÿOìöb| Á¥bé7¥NQ¨&©“ÎL©™xtúæÝ Pú:ÖK•²Á¶YøDê.øÆ5VíìVBÉÐ oº2 ,ø ¶è ÷àþYxuùö|_ûnΆ!»¦“J›çdtÆ3΃¿}‰k…ù#LÄ‘^Ô­þ?„j/Æ‚n|ŸvúS³ÁˆÌ«žQŒ +YvnYšŠ^”ìD…Rj¸©Üÿ§ƒý\¥3¨ e‰£0O™[àøÌq!xMóì"µ[E"zeýièvfF­à2]Åhš’ž•*ŠŒz^P//2pû þįÇWÀ¯Úß =!-ï#nKÒ^9  ´ÇG rðJ9fEÞÎP†ôœÚænüf$98lnO¹¸bÔܲ9™‹¢¾ww$1iàú£³äT±;]g˼}&Ò°h§4`%ÿ‚…8`wÐÂQ‡mÈÀþi2Ñç‰Ì(CÍŒvKb¬ÊÃXî>b  ¶ÖŽyzLW›¥án¢ îlnW]  ÕfòR·K÷!&Qf)¼rùÂnŒÛÐÍÜ>p/¾¯dÀËöo»f7êÑEæ‹G+Ìò4OS¤ƒuÙÓYªØ~q6y‹+¾Åý³UÌ%yâM>/XqÅñÂgL:ãj,û¶]+’>ëÁW«øzïOväO¡m×lL’R579±¡•°VªYÇ ÒMÉ *d©B4¡i7½Ê¾XzÕyMÙ´è`ª&X¼dCÙ\„«4¹’f–×öl´àš eß¹g2OM¤Ý˜ð½ˆ+'¹‹­´ÿÕJgàøžÄL“£ù3%Cý%ze³Z a $¥nºø9È/¼œ›Å8ê¾äÕž7­Š0­QšÓÏÀ¶»Õ_Tü}(.}ÀØp†/;}²sºf‘×f±±UúlšôÔ ì¼OUÏOΟ§3Ú³ñ3Æ×G¹Ðá „×ã¬h<‹+•BesÅŸgx ;˜”*Z»h¥XwJãv34I·ÀalhçÊ"ñœŠòŒ n¼ïã믧Xoß Ÿ_¾¼ýŽ?ýË€»¯„cj=Fôú {,h%¢·†Ö*°xJF!,ÜçˆAÜWsæòæ Q;ÄlŒd6b[Ïýõ„²Cª9rPtlf¯ÅUá“YS…í+úNM4ó{£'/•¿›×KB(•ª÷|3 Є˜Þr% Î÷ݸd;usD-BØÊ• R÷(œ7ðêÈ90(M…ãŠxÄçS•¢‹6ì‚m–X&Ç©àM4V³_¬gK%Š•ó…{4X0(|$_Ìš[$DÁ´Ý…K°ðæ'É[2×WaS³4¥X—kΗL)Ž08‰MžAŸ²<Ѱ Ⱥ¿¾Fzàr¯åUÞ6`yf5뽫Ëf¹‡®ó)V½. "M+OJsÄLžªˆj¥ÅM¯e¸¢é„@··Æ¯Oæ7^áÖ/•2’ï]ØÐ:EÂv1ÙeÊcr+»5ÆÙ˜ÞÚ,RÚY묘Ï9ÍIº3M|`DÈýÕ ±¥Ý!’‡.×r¶XÙñÑý³k4ì™êlršË†N:©@‰i_l ŸäI>K-ºç≱?Â9üD§DÙÜ#³ö¥s\†%Áíœî3Ï^™‹‘ÙVCE Å´ýÚKÊÕ4…gãÌÈSÆBÖbë«òz»³dDw;ÂêŒ7tg÷,zÇ®ýÉwy25/øꉸD÷|žÝ[yhž ¡©{¹eó•\!Ž_ÞvÏÅ—ìÌÛ“âÝÏAË'\]Æó ƒ¥]iÒŸšåä†jla±oÓjÞð ˜&."6jǯ5L$cXö§I$ÂzrVw×xôkOüÖF±,l€y¯$jÕ…ÍhØ-]¬î\»]8:Vùâ ožãÿ›0´*»5NôžèÙÞŸx‚à8ÇÑAÜÓ½­¹÷„ Ge£ XØÉW™ÙAZ`6N™gtoƒ?Ô4í;ôB.‚9›«ú(bQV¬ÑI*Ù|§JKÐ Ÿ¾ ²ÕµËlPkä5[‡AJcîs¨Ö¨uBâ­§;2³iÜiOŒs§ïöáÖyt÷q^o}|ïtŽF`Óçb×oÐñúö‰—éôí?tüÖ?ô[ñô+öv×Ó Bx@<äø­&´JšîqºÔ컂K¶yC"úÀλ‹­Xm"h.°#ßð̺¸°Žf{¥VÍô?e{˜¦-(;jÁ¤Íææ& i‘»Rl”†Õ,!¦ÓT¤ëkmÎ5û_!!Ù¾W‡´\Íf^sw‡óæˆtj\ÎöBÂR³=qüÒäÐIˆËÉÜÆà Åʯ9 4Á¥ yÄàiÜ^½–~àb¡ÑM¤ò¢p¤—8§yeÓ^y9†¼²ž„ÛkÞó~1{v¹NÛI„Ú½¥)¾“ÛÞøeŒAÙãšd$ÿ9UüÏN.•LþS/¶ûïšòk.“]NW!±!=ÈP…&\Æa¸®éÙrÆûFBŽsàò’¡|°‰=Šc²šzZCn.k›Å©½²´Þ“4Z™Ë}bvý6žµý¯ÅQçcR))›ˆYu««b°swèÆ”}R²¢Ëß^ =œÍÜÙ5?Õ±ÁW\%ÍIº¸g*Ù ,¤'ÏçîØùMë´ÄÜ/Ö˜ö4Þó²HyWŽ3áþýÑY7?‘Ib²&rqÄAçç0®d駱úN'Ê‹ÒóØø©ÑZ™ÐÕdý¹;¡é€ÇûqöædMñòlÜFc“ÆF¤Ó2z¿Œï•y}÷=â²™±TVóWÃká}ÙŽÀ³_ðÇþ|…ýŠ)Ü<ô˜rÖ(éˆxx1“j§¨•f;-ó#qB±«8Y}JSršÓ i¤Y`·¬/c7W-[F˜„B9¬3µ¥;º‰ºW;,ç^¶Úgi²ôôR÷°ª£ÍŒÃ›)Ib *Ÿ]²aéø$G(½Ä]ÒÚ\*7:øSžL_’49¯æ¹S¿˜Eé 6¡ £ LJ.걘öxJÀXP® I³‡ÕåiGËvÅj$:AÝ ×Å18~AàaU‰Æ´èÂÜ^Yûõ™$´¸Ô¯Ý™/TG¤Zžs¼S—÷·ö†¿Û“fµƒª¸ÐÈûßàÏÁ ýëg‘]žÈ¥ ?DŠcG½PÖ•´CG ïùbÿäËg?÷ûëÃñãøŠ+Òq -´Ï#‡Œt|ÚO à f¸7÷¶Ì!Õò`éBå‘7÷𥤘F«EÂ5Ù±–%çØÜÃÛÃx(3:†óéZç Røgú ?cX¬SUq˜ _ÒE¬ÇG“¢’c̵˜ƒ Æà™ãržÐXvdžÝiäÔe¿Ølï;mnx*ÕeSKúäd<³è‹ñzá¡D“‰@~¥èª¦ëô•oV#UÊDüJ1=±…°ú¾¸ ª»(M8xŸ¿g“–õìP’àÂX„e[ª\f/¿šP7žè½Ý§ÿoýËè’YøËÙ8óÚª(uS%tçÄ¥wéÉ! §ÇíOšç}õ{º{¯<‰,8/§+ª ‘ æ&ÉìrÀûn‘œénÇîôæj8ƒ›Tûf>̲øíÔ¦VçðÕ(yÒŽµ>ZÖîÕçu«iÊ·#^°¹]|« æÉ.™«_Ýúƒ³mV̵çne|mYÙvŒ?S”d¶¸]ݽç{Õìýš!0Ü/ÇtmPâ÷ËíÑÅq:ŒŠšŠVM-“³cåŸhÍüÀˆ+²zÿ½²‰¨È´LŒß_·¼éäG„JPÎãë–Ë …rÍéÛd8òZÝÍZxú½æY¦wöv|­JG¾Ð€’GI?©·'d%&ùª3"9¯ÃI-/ε–Ï0Ix{J?!W,èo~ôåñ#¿á÷ç÷~Ýà+ðW¬åæ¡ï7hµ£´Ž¶¯højæE¡k•ߘ-È"v›¶â‰ˆaw¥:~Ø‹[ ®£á˜ÏõzêhC×;£!£É;ÀNª;G£ræÃ¯)29g¥lÓì4'ÀèÈZ|Â(ßèã]X”XQzp°¾÷änN£Çb6-wgƒÚEØšVzÇ›K{JvHÊúOŠ¸Þ®ÙÊ=]C°p»â’3ÅØïmJ˜&,î[VR±¹«[ŒtÒ¶/cgšMz¥Lql]ãÑætØz&‚VWlìä®àÂåIRS}¢Ëwû¸/‰z ¸†Ð´t±‰ºmÔfÃl3ëÅâ99'™4ÛÕÃiнaÈUCО¬Ažì­Åtž…\à §0¢5É»UÁš+Õm¸DµbdœÝîùWéu3ØÆ1ù•ÊV‹ƒ€ÝÏ“‹8Õû¸›w@kã}Õær&³z±ÏY•žDG©I$%w¡uÓ+O´m±žæ›§‡ÐMòS7×€lÖ¢;ï…n0þLy#±íO’vÝl%Úš¶ÍqÑŸ3Gó6˜¬úÕÅÕèïùR’Aö×F^íô‹¨k¸*óÉÒI¡paS5ÏæÇñ9Ö“M©ÍÛ§Ó#·2¸;’¯í—aó™i~S ·çu캷{u¡blD–G,Äq5£,qÉ¡m&t‹~; BЍØö1¿‘—¥<~"½ý3~ìô¿ï_ÇWè¯ØBÀŽb¾Ú 1¨áÃMÊâT±±uCJ41öÍ®_×°ôL(«6y%ß x’Ìæ½ßÉÈãrºË¶nêäu4ÛÖË€7ËÅ®‡O'ª¼ŽqSW”œfeDæíøK‘«ü$6ÈgW¹GùÙ3-*­öž7’Îj3vy¢o¤f\^Ú÷LÍÅ’‹–Õ\³Ê+Öò˜ñ,ú­ÚîRÄÂNMuðÖ®Ë@ìv†Ðä~6XµÙ‘Æ"g6ç)ßvº}û^õ¥ôU²4¿niÖ|Š„µ×îfê¤ÐP Ù›rÑhE9Û}S^}-£`ÖQØNÏ¡*rò¾¼ß{ã}QTeU>=9BRÚ¨(ï,æŠÈLhÇÁèÏy쵓#ʯþòŠJ–“¨)`¨´ùä*)sÅØGS|¡dJ_¯rà¨&Q‹´Y=¿NØ·ŠxjÃÀ%¯HËÏDÊߊ½t,§ãù­_òÿú¥ø þc/ù>‹º©¯ˆõÓˆµÍÃâŠ+̵ڮJÂuÁ®ÅIÊf$’òhE¶Ñª­ù Š/OtºÒØŒ¦®YVÑCg6’{ña n§-6åSfm„%4Í=Q4©ÌB‚`ôbä’ê!¥â˜¥Åìùdƒ¤Ù0­AµoÓ$]ú”`}ANý5'|·³žaÍò‰L¤1=¹LQoà$_JÚí}Û=#) nwÝ é˜o{嘕ÜäË¢š‘¤Õ”h5'éÞOvot0DÅËñ¹ê²&ÝÍçj‡˜QNý׿ˆ3Õéö°(Ñ9=·k_è(¤ˆ“.Øì哺º÷ ß Qš„Æ–{¼<‘Y9 ?ð~Ò¨:}\ÙÐprÞ_±‘~º»ëp;Ò‹¤½•[`PÑ–RÁ™‰DiÞZ.ºõ>±:Æn÷M:¼N]tËÆ~.›Mµ"#Æ“)Ešó.hN_ë'Øî ]yD1Ñ“ã7Dó«×3é–83é» ò6˜Êw?u „8Hó¿œkŒkQÏ$¢éL­®ø»5…¾¦|Zsìñnç`âYQ©ž\jPÿN"¡V ùvÜû•×Hsªi¯Zh)Lw¿…Í`>ó»Çhª²Ÿ‰– M"󀞫œÞpÝeßé?‘yt’b$õ›šÌjä58Ø8]E’™2ÍZ=ˆç¯ÅiŸaìaA¸ÊïÜÝÊ®6Û™éìt•Ò%qQ$F„1»HÓÆÉ™6¹Ý­©úƒþXÄJÞ­Á˜R¢hÍbÄhºËÙVùA’$¯3øìÞ{­>êh,BÆG:o&ÈÔ ©Š«3ãhNMm…Gº Gú}ïãàoôaè}·¸œ%± iXl* nÿ+Ÿ‡^]蔑ïätÁó¹ÔZ_œ]xv¸«¡ñȳׯÞxà´ÛóñøE .ÒÊlaS^lEiB•"ÏT2ìÅèN D5˜Üj¾ B=›YÿÖ3PÞ' %m”}®7$ó÷oL0ÌZOÑ[CäÅýB„£ØN%ÓùzçkÍ÷lå× §Ž”+zãºì_D @ZÞFÝòåñãÿß“ßý•_á¿"Ò{ŸnÛ³WHëÐh·ý8 ¾Ô þK%K²Ù.i„íä 3ƒî“uôbþú.vj¢“ÅÅu+ähB{1ǵûšÉÉσ+Ð+!'Wؼè>Šh&c‡ËuVl»˜Ñƒd.S.£êà´‡ÉAË'“NÍla8½s4¾9{ù?mÿúµÖWÆbÖë ‘tª²šnQÉò±{¾ÖrÏI6ùað‹MçÝŽ #óƒÍˆPÓ¥¸UÜ$ö4å)²ÐÁöøTÏ“âE§„.¹Ig7s‰§$*/OšD¬<&“Þ¯ ?qá3ó`1…‘2Ä©=ÝmúoôëÖ„'R`ðyçòìîš’m[/ÚWCÐÂ4wÃÝ–D;ÝÎF¥nnçÝÜ®þè¿0šS—B6õ@8¸)™×_PñŒ"­Ž}»\ËÖb4Á#kÚA†îÞ1£è}¨”íyÉÔ®;%XpÍ)%¡Ø\ƒíЉÖýÍØ…vBäñ@¢•ð›1™G.8õMƒ î¤‹*¾hÔæÖÁÄBžèëa„­ˆ´ñÏê3æ¡‹%ß‹ñn‘ƒJq}pT‡0")å™.e"?}4xuwÄã ã8ç§ú¥‘nZ R‡-²ârâ1Ùíë­T·´~Ÿì9u0Â'°°aÎÖX|©IŒ®[JÀ"ŽÃ2<ÂPËø ©®XŸÝa #?¸nŸûóë»ßþCÇŸõï~?¾ ~Å”WÖ’ÛvB‰”½õ½IÙŸ^ºîål`2V¹¶&T,aíê¬H»7¸st²ˆìvº">%÷{«ƒ%A@trç‘„¡5Û‡ÈRSISØ'bb2„‹#-“¯\1ÃW#àÄ…v§:HŠ›ºà\»¼«‹„TQ½òµpÉ2:¬ÂÉô¡š%hd¬Ê%¸=¡>98MÂ[sŽ“Ôõ΢m?{8÷b>\ Ø´6Ý•š»o²Ì©˜&VÌÒúÀfB½÷oç5ÕNø ÞEHÒÚ,2Ýšƒ~qûîÂ0ø9‹Û›L§'·›&+?ae°6£3d„äÒ•Ãkh»H"Uùµ›ã\Ä;J°Iãg¨÷câ©g#6©¡ËL„«Ü'. XÞv&#×¾òÕÖ7 >¸>¸)ž åô:àûÓ’åcOË]Ù×F÷s¹}«²¦•u»/Ϲfˆæ1Þ߸µÚ£ó’×NÚkN§ÉÞ´Wî†õFªJ°f-­öϱyÛü\g”³#ó %ƒKóyÖÑ!„D†ä ®k3£uù¾TBþ2{ ôf¸E 䂜¿0Þ³”9óÌ:žlhºy‹$Æl6§MÑžO ò`«Ý—@®A8:$á4¦àÊgg\ØðäeLó—n|Ê8å×p?îkæ¾;¬ã™­eH«DF\Nä+¸ä2 Gý„igÛ¨3¯ÐC nB¼ •#¶x‹V>‰°Ævû‹þÂ?ƒ¯’_1ž¾-,%®¯Ñꊰ®hûÃ< Û# `-1¥ª;Y=Z»èr±rH¦i•ÏmçNÙí#fv5ø‘¼ ‘ÏšbMë˜ZI‡y¡ò•XWrHXËdkOÿjî÷Ë ‚•‹¡@JúC…ßvÓ‰ Üa ¸=ŒÏ"W·Ô+–ãÐ\§ã3ôõc@ºCŠýå³ïüÕxÁ¿JŠt@âÝôi} [{½~à c˜®:ìªÅ¦Ö~WžÕ͉Ûuàà@÷¬î¦ÄjM:Ù(©ˆ½èüœ N²)J]õܽ®ù7ç™=_ØæÈVÍŒ(ÔEwI÷$žnþ?g#%#<(ù¶óÅK‘M pSÓì¬:›k>‚cSË  o&U“)AX¬óœîkŽÝÛ)ýlœª±6;ì°í^Š%uð¸Øô§´*àšñ­©læ|—kIPt‡× Há!«{Ü\s—`¿wêô‹ÝbÅÖÝÖ,Íû$W÷L5#Ô…j¤?¸\n%{y²{î«‚F¸B(”çÕ;gäáveYmz×Î?Þ˜Œ¨y—´`KÉ»úN¨’ ‚ û^ŸLýtScÖEü"Z1½âõ³=öfEh~†Ý5Ù­¹üÞ—îxÁ1î§lowyÔ»M¸"pAÆl$ÊÙ6ƒ‘ÆÄ IëØ.ÉV+ÓoÁ›À4 ¡‰‹ù×·6 [.Ì%9ˆ5²Ö„Éþ5YBØôÓ† ô挂T¨Ò“ëí®{(4K˜"B˜oÇׯÛX™þ¼ûƒ…ÕÍ$JÚKÇ`q”j<#¹)MÍt1•H ÃK{;[]ç^y¾»4«RÀ…¨ß³}ŸÎõW«cX‹ØßE<¹Ò€¹@îÁ¾çþ8þ9/ã÷æld´c÷½ÄÑôny|þå zô6Ö|FÜþæÞ~ÛïýÍù­ôÇñUôkxc„»7­UÄòˆÞòaCŒ?1ÝjvíÞØÑ2¦·G›ãÆî4*¡'íÜ—WV~Õ%"•G§öÚÏj²)uSÚÕ…b]S|™“|É%8»P1r5ÅORf°—>ˆ•¬ù˜ôöh\:YÔ¦˜‰v WŒ^7…wvàAËõ”ÝŸÚVê³»=œö©δš™@8˜¤KIJ@"FlñO‡¦l»]x9>Ñ,kÉ¢ØûÐmNâÎnÐiRq]lžBY^Ó¯xu–®Ýd>è–Ò3¯q0¶g *ˆo¢(Ú±,Î0g6#Ý´¦ÒOYÞŘ´SÚ× ¶×a•“|b‹s®jll[´)¯7ƒ6}öp'1¬28W䜫Y£”«?%èÖ”êžõ@“5j„Çù&c”wBé2®ñ4Ä…Süt8ËVÔûÅöºõLKFo%Ë ï¶qBFª*$¿‰HämBç¡´˜ímÙm UC¢(’%]¡÷·ukrê+ÛwIJw;‹ \ܨ§z¹ö%Ø6k~{«‡JdQŒìî«xãšïh(O)c¿,ß5 ¥8‚]ò§X i5»Mm˜V2öÉáIËØÓnÚsº"gØÄ‰>23½q}¦p”à¬ÕˆÚng3ú™ù6þJ ¡|¾ ›ƒHӤ˜ƒïÔ`<òÛßé¯EÓx¥OGïKBˆˆåJû(jÚ°=|âåá#ßû‡ó7ü¦?¯²_cHmï~¾Õ¡mˆí-~1<›‰>ˆÆ(íMgBQ±s/.ŽÆ@u/™u¨|)ì)ùÔÜ9²è´ÝIVª¥ ‰L„ Ô÷™LDKÁifïŠQ#ùKû¶9AIné6ÍeNe'g¡s-8´¤š,jz°/nMÁÌsM®mú Þò2M™ÓaŽÏ-ºíå”èœÈïÞÑSìÐŽ¬5˜Ó ½IZ%‘¸ÕÙ …ƒ½þéÀU lÝ©ÿ–ZþÒBÒ¡ËsR5m­VC!›IÆáÀÇ“ß/¬6MÏük&F56MX¯6¬tù P3]«ÞHž×w ¼²³prlÔT‘M=ýÍ7@ÂÂæPÓã€yë#ŸÅe/‘é’ËNÈâ:$‡9÷»ý‘‘çP‘¨HY”Û±Ô4ß³‡ƒ)y¢”„Ø ›ærÍÅ¥ò dXG 拎f²Ìvf^-›¡= ›Ït’ä-±ØR< Wë×Ïþõõë¾ûϾýü6|þŠnŽyòé9Z>#·G”ÇwÑpç3Ù€=›¶N{j›£39P ßÇÞežÏ$Žˆ©)Sƒ™dÄ©<K2Qo×6,YŒó|G&µ &¹©)b(¢ ÌíÕ_\xD²ÃPyÍq¥u©ƒô§”äÙ‘^y‰ :Ûœear2 G"™ä7¾˜‚M[±CS`}ã¦m9~98»Ÿ­0„d)@=š§txä^$’ó ŠR“ ¼Ú:BÄ48ËÒNç§°š~uF.#64–ÑŸ™&‹sHå•„©9‹Î¶™gsŒÒi¿Ießxˆ z¥½aå½h·#ï œ/féÁŒi¦3Ó½ùÀ+Ÿ7-nßß­©š×Èûr³éêg>CÉÂgZ7ͺà¼Ú*DHAo&ÌÅS8r_xË=ñã ¤Ð? ô/8Íu1™Í\1ɉп'Q2¿è Í#9(âˆtkjê£ýI«Áú¸¼>Å=úszŒÅßÔ¸Vzþ×kw±Ùø7gLCS汎2Hhíò_FA8¾C_ê7VÄÂi c= Ö ŽŽÅé¿«1åÏ&“}i ÚwJƒÇ}O4xÉÙš 5ZÝ %ýš¤K^Ÿ@3…û4ÆÆæÈ »<²×Ïå,ŽÐ36?»AÕ…Œ¢vu-7î¿K·‘tË=Mi‰¯¸j’A…î,7ÆÁHÍbmãäËx&V&âU"kòœïADXïÐ㇀p@pó]ÿɯÁWé¯<(îÇs¯ 1\°].XóPòP/h£gÂr„(Áºá`ña3º/8½­Ï¯ÍnÏåàqÖÇ“{«KBzÃŽ‘ñt¸ym²…&&úÅÁæÝëÕMû´›kŠH\ÍàÃ[9¶ÅÁU™Yµ2Ó€c™ŸÜ>.šCVBŠÝ¾;8ÿbw#ˆå~q’—îˆ[ÍÁò,"µLö½ÂVgîQñLp*¿gwÎr èOóµ»íöÃ2²bãÉŒ$I…2bð?Ë 9!k¼2!,À®½·#]š!Ö­¶ëkj ƒiì¡{I¢æzûº˜lRJ«;@yPk×'(01ÎOÖ‹ˆœôìDW¬}Z7¦o^ž¸ÛíŽ,v¬“Ls‘ÝÈopr+iK»b%1ÌgúÞÚøó’I;}¢=‹B!$ÏÉ„›,Oé=ÃTN¶Û—<¦{‡>Q36CÏz±Æ)Ö]nFSl¦8õÚPNUI3DG»pýsŠk ™ »[e±±nätÞ¿Ë+C¸Âná]Îb$ 6®Fªc®÷N Éïäó€ò—•÷…ß¿ž­žE‹ïQqœ”ýq|–Î&¹W²Î·±ût“™ ÈfN„¶¡f7Ó&˜%oLfçΔLe»®ñ2þr¸oƒ¼[“Šéô6Ù‡Î'ðÉ„äMÔœnF‘=n=ˆ’é3°FCVë(ôZ£Tò)Úb¦ÆyžZ-‡çù‚VÂòçn¾ã/þR›õ¿J'iÖ_o¡ §ŽV†óAI rxÜÑ<Šsæ¡3ÒÝ2bë›ñÿö—ë4 3‚{Eßœf±ìNÛÜLê!‡©² ffÛgx1-e'C4î®1pò‰Æ‡ôŒñh;!Ðs¾üÁÁyÒŠpâ ;‚ݯÙl2ò,ðq¹†²»#”Ìð†r=1jÙa20éCëÈü`˜©+Å©pÈ ¤w¨6Ó!_­"\ E k´^,`Oöt¢Í÷ÍíÛu¸F£De®CH>Úeõ¸—U²‹°rBM¦ÕÕ­@œw\!&úeNXr¼“½c{ä>3º(¾b«øyàätÕñ$ä@æ]óšAÑ©{TÏfëˆæ&R/Ë[œÏ5êÜZÁAûŠ Ìo‡·mÊW³iïÙ»™ÑôGƒ¶%×+ïóýrv°)Út(æz/£°t猅 Ägcï« t/´g’ÂÉk}a¤¸p0O°ø×³Ûƒ7\ë4 ¼v–»™S7›­Êýz§ÜGë„x²âuùÜڋŪFïÏ-çÄ#™ûG"ˆ$^õ6@¡™ —ýÌ”ÀbÆÿyø*þ5àîÓÇ~|¿¼ö/"¦¯G>㸠­VÄ4ºŸt`G'˾bqiNŠQËUrþÉšW³iÄ%-p>ºÝ$7w¶ *GÛñ4 㣓9Óg=M¨zã÷8˜íd>ŒV÷~ã.k4¢ož<õʤDÒo‹$\ˆCsž¼åÞ ¥gDgº!ƺKÊ’®wþJ„Ì’©ˆ=Dö'zNÿ=›1Ê£¤iŽwÆ*Ê?&¹Y¸çgg­kÖÈÉíÌÙåƒk~šÉ¾šLMxhèœˆÊæ AgWëñND­aR/½sjÊ—ÅöÄyµ?Íõ`>Ì$¸i”Ᲊ×ÊÕ*º@ ÇYHÎÆYàŠ>¥OÝö‚q!ÄJØ®°»ÕA\‰ =º• u'ÔÄÆ5Ó‘‹). ÒÉH—ƒÞn’&=—žà7÷éÞ¡¬Ò+œ¤¦å`¸pÃæà0ûÿáWÿ$ÂS Žîˆ~Bïf–³kõBä&Ûk¦)R¶)'Ä<=0N/ÖŸ,ëGQöO½\Ö¿øïæþ7ÿc|•ÿòçúâU¬ÏÃÛëh¯J}ˆï¢ÕáfS”IÜDSVÛv{ëJ‘Å4˜Ý»tpzrD/çB5È‹í æœ¬Ã›ÓH5¥K겕Á®:«Ø8‘¿XÉš\üô5ó^ã€êí–WÛaNÝnp¤f“Ó4iÑÞµ:y×庈úèÇÖhoHföL`zx¢ûÍÆ° Üi‰á ·÷ݺ×¹#žˆ[ B%[DMyùädDk¼¦Í¡3|T´Ó+×ÅjWü46rê9Ùäx]smuŠ`Öƒ[aD6uÁÁ¹^E“k͸Éb„ î]¤ž¾ôlvßeî— íÖü¯È™ @õL)Úlu °´ÅóºøÔ¸æØæ—å[¢ BÊI1y/1[ù>ö'„EÙ½¶âtçÍôêíÌi¨»g¶á9fÖwgPF¸áŽuÒ[‘šŽÎ9ÍWÈÌhjæY8[r÷‹rªêLUâb)S½L­`°8Õ{k"L×ÃP£&çãí<Ý+¹ ‰gÛòl4R½Ä ×Ð$Ý >k…8üªÆÄÝj¾y&Ö3métë;³œÏ,ì4þ¨DÔpéÙÏ”™ieq ~yã#ÓѶÇÏ»Ç1iw¾“ËɆ1€3ÏêýÞ\Ïêµ ž<~.Ö5’S3söÀw…;ðã;ãϦgäil4ëË@ jAë_@NF8¾Z*.çÏ¿Lïþêô³ÿÿ9¾~q’~ïÓñùÛ¿·„}ßQ[Aï—K;¤eömtHù”ÅŒãc5X°C ›‘%:qA7­Gé—Þ—º]ŒåØdþN–¶&…SôGv§ÁF$Gn×VœÓû[nZ-ι ÅLE&¬-"Mp¤Ì6æhýd¯ªŸ)¬Nup¯ øä&|é‰n—¬”§‚«ô¬IV#y­o#™&ö׊ D3£ñ&.BZ#dÅ—½VÇ!p>ä¸ðfÑ ÙL¦µiwÓºXâp²«fqw³¨“d⽫ÃnH‡×£Ë‘ §äÕ4šõõ88¦ùEw†7›¹áÍI­Ú_ðF+Ž„ë0{˜Þî&>’ÛnÓï\ù̧Áø’ú ²lÅШ頖š£èU>G“@lòí$ÎÉÎT9âí}’ÅÎ,R.1NV½Í%|ÉæW)4—£Üýƒ»f"Þ°ßðYät˜Žc KG[Å#áØ€+Ç®´˜7q8Àûé!P<*;aŽ(+g`=Ž„¨…Mf:æ3eÇ–ïüd]Üßé“Y;ÄB³-ºˆ×x c.]zæu}Õ›^ÞçŸÇ(€mE?Izd.vd1vÅ4’¹˜þûN²,Xyò‘+ÂB™Yî•9]kÚ’*†8ð÷í÷ƒyãx?×ÌD4"9Ûé\òji…é8ø Êt –ˆ%®Xp¡Ö4Å·z7úÏ|ƒ>ýòîCùôÝwþŸ#¾F~ ÖáCoBÏEVC‘†ÚKÞ&a#ˆd’GgöñÏЇޡz6B’Äù‚ͦ-hv0«ÌOi I‹fŸ¨‰J“W>1fî1ÙNëÅÕMy”ÌôûñpJ×Åž,ÎøÁyaO’”k&Ü׬q˜ºAÉĶWí›It@ætmà HQ…-pªïÕ þ¹JÐT§Ï̓$(УÚGÖÄ6ù6ò0—÷w°ë¤7ÉP,üñÎMŽ“ ƒ¬ÆšöÖ¯fOî å5‘ÅœÔá$)`è½ÙÈhAT×Ü8u$#6¬æ!?%c‡O5¶vç¡´3/îÞ‹|”,G_&à!Ðâr6ŠÅ ùâ¢Sçup+‹)Ó~48“n!ó í–­¸AÙ҂щRF”}4Õ 0@£Z7l~$ÊÅX•>63¥«±ýå W‡|èù<™„¨sú\„ÁL3äT†BÉP²B9F>³“+\Àá×°Œ!Ýy­¦WÎD\._ nw±]öÔs{Ûb˜’âÊAfÚÏsu’n]6÷jˆŠn¥» Žnu40ð®íh<‹2W')›áSák׬6BæG÷ž’ØØ²IBó !ÿL­2øçõYS`%qõN’b}ehàMèåL™V­¦ìèãçlO’ÓB½õë낹k7B–~DŠ/RÂró! >Ã~¿#>ôÙ›ïþ߃¯¡_òá#áχ”žÊ )E´¶Ié@ <áN1`çÁ°867 r iö\Fî©°8xK!q5ßêiŽà ETˆóÁÁLÍ1¬ñ„™ìv72S5—ÞŒB¬ö"X§áÌ9„MR׃{›%Wáxí‡ÜÝáÜ2¦•j;;#ÿêÌ<\¸‡ÝÖEdudÁÉdZöË“kÀÏÖÜäáÅip়À§/&©éƒ†UÜ&Š‘­X$)KÒžºxƒéë- \t6žéhžÊ!R{›¨C>Pʶ;CŽvݘ‰0WHZ*÷üçdŸÙÃÚáhv’i©ø´3¦½éÜ'Wçê&‰ ÿ• ÙÅž7e‡x­ —í ñ/drÄ1¡›ý¼ú«ÂÞâ¿“—îÆu,Ÿ2;I g°YxC;“àµ9ò×3£9$¥\{r‹i_ÞÀBd+»8]p«$G†Ë0¥Å4êãýØ_;„#[1M‹5Ê!/+eJÁäXãžÖ/ŒŸQ¦>ñ†ðs׆2D÷NÈL‰Æ+É‚N&zAC£ßaFXvÛaÃy[/GÊ÷še-k=¤5N§d!Ô|ºÓ³´äa'±go`á }±ù,¢±¯Õ«ñXÔïãþõ7ä ±]W`kcÊ®”šU™ÞÐdE1üs³M½Ü“ãÃæ¥ÈåÆFŸÃ‹FöVD|¡¿^.è@}…eùôË¿àÏü²nñ5W¤‡ö¸E¤-Üá b¾E¾ùz´x7ò…%ø[­[îÕ^zð¥PŒ›þ]¾Õ!ÚaÐ5Up’ÌÜoö§ÙºÙr•u–É2oNyÕ˜©M:Ê ÷(·w&!G¾¸¦ñÕô<É`ûðOŽp²ÝçlÅ¡U“×ÌÿWœS&½ -›"eÄ =¦Óô"MÏtvä‰Ð•´æs÷Ê\åþ`¿êw »Egø<Šá¼ _쪘Ïjv*`;roòÒä–u¶æM;G̹~é$éÌmu§ë¶§¹ œ,)kn3ŠÇ’¹Ò€ëb´Õ‹žÓ¨F'Úß›¿p7ž•®–'Ÿ¢_tJ\eˆ\&}¼é|íVÕú`ÇFß8ú`¢A™Pz¥™GŽ}¢l%™†»>ðg8;¾åä‡ä„HZ#}õ4ás)øx*+mßUï]ï'<—5ŽÜ‘ƒ±´ä äìråÉiùnþ³¤i» æ)¸Êÿ† :)e¬"VŒçoDÏpŸzÅu}A»É›ñ{tÿÕ (X¥TK–›p:ì]îüù&”½»Á Ú»ŽãYH«½­»éX1e4yË2 UïãÚ-ÚKË‹»D^ë(¢ÆUA0=¸¦äÂ]ð~1´¢î¦˜É³„E´‚O7¬uK: KÖ ß‘Å”í½ë7×Ä—Õ,Uó óõÏÊ+X¸ xÊ@o#ä;ìÛ=úý§_Þ~ûþÞpó¯ð5ö˸ ñ£ý¯¢-bxõü­6¤üõˆëßBoçÉXl”-ÕJ3ØKÛÒx¸ZÓÌ<ˆªQöç›ÜTÂÎ3± —7ƒ¤Õ3 >4e·5Ý—œ£à›ÉüÌ6ÑÌïIÝîÌ®ågÕ9÷Ñ";iïS¯_nyJGí£ƒù OÏ^—»Üœ-æ 18¸IØé6càápp{ùèd@$8É¥IIF±ÙT3Q…ÅMÔ”Ÿ……¬yÃFG5&Ó³W;í'k 2fSq)6ÅÉà2ï=Æ„$¶ê¡Î›¤ÈÔ¦›¡x%WÜóêLmÈöÍá:,D{0^\nì¹›ÄÅÛ'…>æN–¯ýÌçåhèOгäƒ$éÖÝàâ¾8Öµàf8(³Y€L"jÐ釞d êL4¦« Ýâ’5³¹N‹,¬°ï"Ð7 ;~€çe Ú×Ð^U)]½=ñþ@·5 e§õ~¼vÔ;¨¢,/ïÐŒ ¦Ivz¹K{.›Êj(LÎÆ)hѼœ[ö/r? “pŸœûx.f’ÝņŠÇý]k¾õs‹K1É–‹qlÀA„‹£K ìi¼) º’´wày¸¬ž6"X·®É ã³ëÙ‰ÎK k˜àj§ò}N´Î"£zø=ÙÔ›²­Ô!Eõv…¾ñžFçUЬÑ[WkhZt–´<‹ã™gÓÁ©P/ù0ÿ—û#–ç7ˆ1¢„gèáˆtøÖóß~yüùÿöo ïüšÄ×à¯9×äã7þ¶/…wd­ˆá)=kÔ+bœRwGEä ’8ô04§)NÁÁyŠÅ#l’é»<,¸;&øb™àÛÐ>ÙMÜñà\qg9²štª“‘K­å”hù4-j«ÁÄ ü:ÙãO´Ø"Ï]%iR<#x67L–™YÄ»Áj(OvûÁºóx´˜BT°1O],œ4FÓ¦²¦gjP5C†˜ :͵d]2ñ²4hÛ\ÈE¸žè§†78BNv¦îÞˆñ­‰E)A!+Á²ŠÝΖg´ ¤sTXŒÉÃ9䔵ñù8 ãÁöîñ@{W1‰ÙÙ\h‚nL`‹>†Ôq fAÕ5 ƒUƒÍš˜âøümuLågã¯p4»Té‹g®úÑJMã1³Ð]ܵN @Æsß8ÿ9»wÖÝg5³³Ðr‚nÛ•&±‚A×­ÅP(ýyqJµéuÆ>v§à·¸Rü¥ˆJ½’á êêó˜à4õ•G[1­Ï‹;º ñåš=¸jIwÖ4å;7ÉóÝ«®9ÒÙ'r`«ÎÄ&Ø÷KÊm/6µÖÍtÙèÃé«Ëü'š.~6Þ‹Ý¿¾]s$u¬i¤MÅÀ]òƒq/b7/Å‘†2¬A‹,T™0&‚pëÃtIks:”yJº¶\Ìo½Ñ7\\¢)£T¨F—ãZÃ^€ˆÄÛ¯jFÀ-b:b¹ÝÐ/Ÿ~¹|ü7ÿžüñÿÁÁ×è¯Y¤ãágüX'ä° ì ûë °~—Ç1&›Ä`ò†õdžºáb…yF Ó¶4&£ªäªdñtƒ¢STsé4´Ÿq<ÁD“;èPO„k N£ð#)[U¡8w§öè U‘lÚµ¹=Ú”(¯dMbW22ZýåG‹qÛ!ÞÝîNÚär1vNKn¿ <õ©.t#ºÆAûÏéîVMÓ›‘Ë?Ù¦íD7¦°ñ67£É7>° ŽÄ8ÍW`¶”‘ é rVÒtÓ Æ?˜ìvç¨ÖÊhäµ=ýúÝt)ä«Üók¹Ð…ɶ†R)>+’Dä«FBìþà>×~ýÜÆƒ#Þ_l8èä²Ä£‘¡Êe˜( y9ë-rï„'ýr?Ú×nðà²Ä½yM¶¦uz¶?òY½3$OŒè¹Žó9äZA…Á4—ÉL ÆÝÑNéV‰‰OMya£TyF¨é‹‘Œó}4ùΈf{5äBª„¡h‰nj¨ W#$;žïÙ±ŽCd•ãµZ´E "KAÀÏ¿?Ð^š €õháä×nv„бáo¼Ì/þ©?yø¦ßýýøþ5‹tXÆ…CüzZ—[,7ÏãâšÑâÝŒ+¬—!z¯„æTìv’„D<’A~†iErQjÏdMºÌÙx4R…ŠŠ’m&¼]x£“M-bœo|¯»RF‹“L2‰r®“íÏuà\AxѤBÍÅWÂ}Æ)ÃaAhÜAÅîH9rã!”ƒÙ®Ê\ zßjØd¬ŸYQcç=#w7½,ðd ;ä,„^Ä.M†­¸‰Š0VóáñÁöäš²âéZ’&ÏçVl õ>èSæäÿžDX5Åk¨9jbT\91¨Ø˼Ì>‹çþ¥z虸ƈÂxE74d)‹NX`CÐ^‘æ)šoz¸å_Òog·s—”íÏp•>×q åhŒv1­'âC4¤yÔ‚¹âÑ5 Ñ_Wéô…XÎNz'IØfÈy¯ÉJ×5ó ælåQï‡d§-,¼a<…6¤7wD8%!¿Öoö€€„õxÄþøÃ/o}÷Ÿ»û…ÿ§ß„¯ñ_¶“>}ä‹@ɨˆé‚Øî€øi¤¥ \"–ã ÔókÄÜæEï…;_¡ƒ;ž<ˆ -Ë;ƒÈÑ‚e* öª.\b:^“)µh„¬é¢• µmÜáF‹LD¯L}£$=]Sêþe$$x¢qVçëˆ+ÍiF§×¸³ˆbcŸ>wï<äA¿àî5þ;¬ìêÍ›ÒÂÃô1ð Æ“ÂB¿ò™‰ìvm=™zRǼ»$1g 2“8ƒe)—è¢ô.®3&I/H&‰z>x3Ýh{`â‹›÷Þ0/îöÚd_x$„\÷^ rT”£&k½©b¾1iêƒÛ“IÇ‹˜û“ƒ\o ã{2“›Ê{’Ø ©Ùtêrb‚k8½Š×¾ ÒEú™FÓŠ)WdAÞφNÔæÌWQ ŽEÅLhÚFc}MŠÒAc%‰ëÆ 7Z3éWç ܸD(²€':X´hâ3U˵‚£oÖ„«ÉœŠÙŸz¨?˜!ÊJs~¡—AŽï² Ÿl îT €k9]{s€éY,`³¹?º¢\GJ0NKÊ4ô$@^ç|0ïq[BæÔËæ}aî·&`8Ÿþx ÓùÂf{vÈËB^Q’NÓ´ðüÛÜs&rº`y›ï9¾™ØFnB>Z°LƒmeOŸ¹¾ 4‰¤Æ*Õ7lêE0 ã{®à|PŽuÚúÚò6Òí µý8–ã²Ý|÷ÿý×àƒ_n'}øzÔööç{^€p‹ý~Çþæ=lÛ[ˆñ/P׉ûÇÍíU[sV‰|Uë+ó§«i|'„ÍÃ<'w îOˆ<>âPºæõR-Í:Û²›ŒD;ß¶‘xÁâ‹MºM…çâä^'¹ ØçT MtæQ:Ó`¤Š¤ ¤Ö顜T‘yÍŽ›^œíΚ{€ä'5“œåB„4N½?¹ÎÑ´”ÕåKÏÙŒ¬XË9ÕD“gȰCšlmBÄÊUrÒÜÇjuïvS›ƒéÁï±Ø¤£‰zÊðx*÷»}±`—*&õîôã«‹águnRñš-®‰Odkð;Æj»ü¹3u¦7qŸ!Ú¾5$\;çyw¼ä r8rßàs@ÿähX*hìÒ Eg rAÚæÉÍpë 56ó^·#íY]³»»æ¯ñÙÝ ªIO¿–“kHä®_K¦šK·óùïºRr„>œ«ÐÍ_|6`ôŽ},/Fœ;½à"˜ÌnÚͲv¢?j å îí2òIDµ.#Ú±Ôñžö—ÉA÷Ú÷Ï{A.E/×Þ ÈZá«“ˆyÔªŒŸa¯£¸)ºt߉hnöL)f´ƒJutHT¸L ãßkÆÍwÝ-¼¤—¢“øg6¾ƒa7îDc㡦#†KÀøÛe0ù׃0FrazhÈ!£§·ž½ ¾ùp þî—ü•ï]￲_½4¼÷™¶ýP"âé͸i½"¦€¶ýØ”At QºY‰©9ø²ÒëÚ?M–1Ž. NºúÊG•Æ.©(¯öðj7-6ðœvák²¬£±n5MãÆ™:ˆÀ´¸˜àóìvmg~]GxjrãËÚïITaÑNçöõÈŸ-»ïëX®Ñ»^õ±WÄ?7X°>7 ®¬S›qÆ)r2Ò@¨¶ºƒ|±Âé3ƒ› •ðÑ•³àRœ8Y»¼wán´hç“‘€";û(Vz06¼ò¤ÓòäþfÂä4,Ì?^Ù_žÝ®Q&ô¹ØêÃL”qås.6}cÌ PŒ™4B“peòáð*ëEê´ ãó×ûñΤ2ç‰.ÔÜýnÃý/¯Ü¡QÕ4ÊÒþKë>5Ù*0çA›¨L±I0Ò‹Y…|@~f×Sk˜L¤EAq56w?ü3囃>¤>à¤^.ÜÉÅèÌUÞ¸R8 ñ Ó >lƒ…÷¤ßa¯µ¯î~U#dª!šž>’¬ívNl¶‹<Ç&ášà´·ÓÝÀ²{:ž(Ÿ¤%oÙE楾¸\÷Ýx9ÞrK"Ÿe“…VOÍsèš9EvîÀ÷B”C‰k\¿åDÇI"}¸pÚ¦F^‘ÄJŒEÏàÊK|¡«ÙH½#Ä€¾/ˆ±¡Ç€txŽÐ;z~T?õòî;þì¯ 7?{û ôw„Þj3‡¯Æ›¹Qçè÷‹ +ÐC@×·1eø¤›ÝL…M@ln/ùý”œ£É.F‰?Ú‰LƱÛû)¸>ú+À”dF‘2¦I¦éëÑ®‡ëýÙ|ñYÂÊ¢å\ª#ª°¸^±iáö”’ŸìO¦­}ü÷òà&Wøôý†N’YàßäºMiš+àb‹3Jºc,'[È1I­_lOàc7 zâÈl¿ Sè6&2³õLÈb°;È 3QÀËfÒ·è¬P¯&d-Ùî­Ñò hËÚŸì±½Å(¸‹‹žÙÜϲ¹øR Y¬œ‰<-ãYKëuªV‚#úTc+“X0µxb2Ë®wwXgGtÞ×óšÊZöB¸–! bn‡ƒåfW¦%)ÊUZñè|Ògœ æî"Vƒ55⽄•kzÅ×2¦ÇÚóûÀù¯ÉXoÉÄVÍ—¦[¯EžL>%¤µÚß˵¶_(_wˆ¸C®šõÆlö`×»u ŒH´Ó]Ž|GF*ƒM™7ôsX,Æ+¹Æ#&™ùÑ*ÅÃ6ä’ É Çþ3cŠ+c+<‡¥y–gx¶G\1¹•Zvê…åÀy`(J^-Lä]‚]ús Ÿ(Ϭµ/¨¥ã‚ñcÀá]ÄìŸC;êåÝ/ü¿>¼ûýØ¥ùïP¤‡­ÿ„#BY‘sBZ‡él @^èXgªÉ©' ÛOñ­›ýbçáEòB–ÉûnuÓïYÉŠÉl¤åÛUèÁ±›ùõßZµ,`ÌÄ«d_o'\åJgŒi£&Yuw)•H.g5:¾²ÁÓñÈBýÆÌ6Êîö¥‚Œ1Ü.[’®¹B(f1ýѳÁùSʃ¨Ûfucî·7wȸ \ánÝMw³A¥“G¨\иVzrD©3Ÿ™ƒÓè&÷sVGlba Í‚[Z$,M¹½ºû¾à*¾rBÉÕ­,àdt‹ÝÏÞØ8\ÜÄ{°F¦j©Æââ®Sz²c^Ý$¯ekpIXØ ó9Í$Â…ÅÉ¹Ø •$µjŸ³WC—ÚÙîk÷ûöÍÏ©£š‡j#!•…Zò¢³­£úNFøjá4"x-ÒRïO ~e¿W‡þD+Ü3Ïœ+„Ú€¼]jÛٶጹg]ž1aëh™Çj.}š\sq$êÐã^Ô‹5B)¿w¯füQ©-/˜‰~34†_£Ó4&q7¯a£²qL´Øa,F¼c$/%ºæ­Wz±KEñ0%z"N™Èƒ6 Q+¿:Šc¥h¾EõDò£ÐÍD¯îÐÆ×éûÐm÷Bn‰f²¸MT»$%kÝ&$3R)”[í@Ó,'䎞#_xµf”~ƒ¸|ê募ó?ü·ÂÛ¿ö>(ËÿEºÞüâ¿Xp<#g´ô.B½EŒŸE:~á˜ÐÚŸÄ%2«uàFwàt‘šMÛ9'Vo@ñÀU¡{âËB Û£•â á…ž±¯1]’¦&ÏOO®ðIk\5¹ñëË‹7€]ØgïpÐîX‹éúpÓ{îjƒé‡Kq;ÎÝ´ØM Ýå@_Ì`"FƒÆ¤}¤&38¶útqjv]²¤rš‚‹ „Åö¶ÓoýiÓ’L÷Ú`ìx} ,%ÚÂØCÍkª‚Z¯Ùž ì´‹íŸg¾v4d!ºÈÓɪ…­9|^ùÔ)ûâ'Öñf }$1›“Î"ùà¡Í}_¸}òvfL5;tN¯žð-äš'r[ºN›'¡D\ucï,4N÷ì&ÔiæœAÌ]oþ,}  ¡qmóÆ®Mƒ)„d-‹MìM _ÍÖíIRX÷üãcïäv±}²Ð«Ê¦fßÌr5­£0¬Çk=|\Ý;áO6gÔÒv²Âi£¨ÜÎI5tK·ÒzMn†íèȆtN›ÎmÛKçu¬ôº‹" “`ÚýÊLj©[êf¾=ÔH¸’Ål_ÌÚ´( EäA‡‚5lQøÞ×Ç‘÷\^!TïÁ…S爨ä4ŒéžèÞ¨ ˜Cfò´lNÈ=xXt¬é€Ð,¥ ¯/°í/?ó·üÛéc¿ý÷~P’ÿMÒ·CŒùT¹\PQÐÚ[ØÏï`Û¾9½‡ž£Ä<&XÇd”iÇÕÁÊbªIÒ¨@FbÙí›…-Ù­\ÌõGÅ·r¿4w;Ùò烙ñÂ퇯dSÁM–+Åûìš[´î]:MM S« Û?fš¨XO/ò„/8oiy?ð3ˆQûÄÅ ›íšg*ÒêØ›þE,Æ‚Ÿ9ÆÍ z{$lø4ð¢8˜\q> lqåb½2µãvµ~Î*“‘`¤Aþà„ŽEº“¥© ©ß£ÎišÏ‘¹ÒM»Ö~¾„Õí û—þ=f‹¶ô·V*sªJ61+PEÒO©S¼†ðgî×äG¯q®ï@í t!U\æÏëØø’JEM˜4’èÝ5YÑ®epq’¾#YÿÕàþä_š>› u†²$F­v¯:ÈfÊ£ rJ‰¶h’—w Qp¼­D‹WO£mg‹•Œ+°¾Ei]¦¢;'À“5©"ϵ'á8±Y‚ÙÞÉ 1Œï§Ô*§Ff8 ¤²ÆCS·Ô ûnHŠvÜ!ØõÓ™#qXtžÕ•“*åP²²­Ëø½ûk‰¸¹£cwœnhîCï÷ ¦ŒGfÃ×i¤’O´k…É2å.r&2Õ«58˜SšÎÝBïý5io¨—‚–¶Þ‘BG_^ ÞÂ-"~ìGùÞ?|øæïÿݔ㿋" éæÛ~-!¶Ž‚[ìûuÏô‹}±¿ƒˆ†|ï^Æ_é@µReöôÅÁXÍ K¹Š’B¢òxø’eG6Òž$®Þ);)éw/dZžØÍSž§WÎ7¶ŸÓ¯¸Îu¬FÝ#¥Á;z‘Å;íí¢KåÚÇx=4-H½3ÜoÍöMÑÙm6½·Ggð J.^{Xœ[‹¹ì[°VHæ‘>-)*òϱŸ™4uèÕˆ|½Ôåc[´©h¨vÝ I0 ÒæA¤;e@Ï€:3 öžƒýš½?'16]…@°z·‚Q/.ø`»†›eÄÒù†nô™|Ö”œÖX ]„ã´4mnÇ땉7µˆÉ|ï;*¶¸Œ@êÅMäÍ®ùŒi VŒ£IªsëöÌõËîâBÏfСû[Hö”ty5žÍ®¦ûΤ"wvo“ŒÍ]œ±P<š+]`Ó³SQ‘è>¦À’ž€ý2à×ĘÅÈï'sÙÀ*lê÷evD¿†v°Û ×/e¥ã½ç©›:$ÐÏ]ûäZ€ížÈ kÀtÀÒÇÔªõZgòß,¢‹½óüŠŽü(Ëâ\x6)Ù V, ýÜ…(Åu4àŸ}Æ›r‡]%OmfÂSζ¦Ì‰m0¸»<Fù.BâÈÖ8´ÀŸoµ Ñ>ÐŽ9ô„%#=»Ázw@ X_@ÏGôý‡ÿúú¡oûÄáçüÁßúA)þ»ÑI«jß~ô“};£·bƒ~x@.{ÛÐ÷Ï#…#bkSWN‘.G¸ïㅬܭµFšD§ÚÄO.ð`±ƒ9f·¯Ü c%·GK!•G7õ%#¥è²‘³LòûÎ'÷YÌ×ÝÌPj.b+.NþÝ)ß*Î}'ñ%#™°ÌatåÂF¢¹Â»Óvj£4fN&gB`d´7ÉD—8:†p73‘iÍ©´=¤~ ìfáçö0Ùè嵓1yÖ< óÂo«x§–÷²ž@5 Ü–œloî{åg¾¸B(˜ÜÙ§úþ”HQ#ïáy¿v÷twðñsv’˜B³CA”1üÕŒz£•Ý&œÆC9ÞYCØ©UÕ÷(ޤ¦Ô¯ÈUI”‚¢ó÷) ;Ùßn~Êóóuµz x±{éŠI°Ì_¿Ðª6Sžñ^¢Pì™ÔdëµÄl"þ„â“#oå< õÙðì&ùÍ)ÝŒ³¤sJÌM-:M°ÜùæúäÌâÊ\äÀïýð¹ñL÷Xšˆô8  Ò™öÈûµdk9òþqR^\.è“ Seá2ÆÛNƒŸhÇf³’?’äŠ÷À©Ù}‰Óí( ™þûnDÙÃa4Þ†î iÌ4؇_|¸5ïîÂç6Ÿ€MþöÊ$[FBå \.nåÈAlQƒU–µÎXUl@Oo!ï {}Ä Rx ±ÿðßû®¿¼~ûÿó-ôßë$}¸û¹?Ô÷Ïÿ‘;"6,ØËet»‡ µ¾šZ",³_œ ,éÏ+Ó’R™EÚM©X»Ùñw3ø(…kÅ‹%Eÿ©Ý.ey—0ëÆ—r1“ÿÓǃª?:‹Åݘàžý=­ «›B=A(:' Åë=¶¦À9™-„ðÝôÕàôÎ"5%×u7›æ as0owÚk_H(r"íÂÃuqºÑèílŹÍü#ekXà£AÅŽ_QÞÚ€íc'iפqN–Ø3÷ò_‡IêÚ…“ûâ&f„¯¼^ÿ÷Nhy†H“)­+'è8iô1u77u£k¶±öG·¿­”F]äÃÆÄ‡ª8g.Ý£¼v A³Ï'Ö³²§å$5Sؼ3ÛâŠ< ]íÁ2¯…’L£Ÿèìqi<ãÃis„å¶ñVŽu¸±Üé~1óxÿü ¦{ÙDmŠY±ÊÖ´zç7~fém¬×7f¾3 bô«¯»[Ay~ÖD@†FÙP­àøœCC±4§NŽC“}1‰®açTH~fj$°^èª6×rbnóÌ Gž{Á؉òl6ùÖnò*¥å)‚3­ã÷î»eÁ×u0¬3©Bwd5^ûÌw¿ðY DÔÎD‡’î¡ïºûoÍÿ_1·ùv4,ãóìeœéq5›Ò_ !¡·„¶¿‡7ä\Êa½CXŽèŸùËÇg?óåú?g‘ÇïüdmwoÊöy Ý¡ãía ‰>¬èiø­¢sÿÂà qºI„V¢3ƒ—¨_S¤ºàr]› @WAªd`í¨w'bA©<,ήPÁŠ‘à°VF° öt8 Žlå¥CÍìáõ§<à ‘âOF°#‚iÒ™îU~ÔáÚݤ_͸D;žIÒ’}j4Öw9Ûô7íUµ^Üþ¹:ÃqždS‹¥Ý»ò©_Ü å®ÎÎ5+S·xOäß\L·›v“–ÀñòbV‰’™É^Ž¥ #ÞÍë´ÙpQŸjçØ¥iY¾Úg×ôh~¶¢»›Lãõ\Iˆ¹ÜäövÆUœªï˜â$ЋM²JcjÁŠÌìg©+Îjö” -¢dÙP¦Ü­çÀæöå‘îPé0b1eÊRïs¿8¢Û2¦Ë¸ðçËVl§Bbw:k^³Þ\ Î: E-cϸ¿ ²y–7Ý÷šãt·Ê8»a`·Õ†”&d?óÿE60)ô >á €ØÔ^.„èAâXPüzërTNÔ"»ABï«´ö²F,,F%ár¿0ì¬D wòRbß;,iòR6£±“ÜWÆ4¼oÀöf|þ¤L¸kIdÿ‚­TòÑàíÈÆ­–ˆ@ú%­Ô˜Ç!]P[ðMHý€”ôcDŠ*Öåá/®w/^-?ïÿôå÷?ïNúp‡õÙÇ ½ ”ÛùŒÖã ·gh—wp‹ZÂØQ–ÒÐ56’»RäZ.3a <ì\Í”<¤'œ`‡»,ñšó,–dN„.Å'¯CÖÔªM/¾èOئµ´ßšðä5%®Ù>C£Ôa²W»5é`¢^Öà,½ã• ~ó¤»b‡ýœvtÍNn5à‹’¾öÁåZ üw²Ÿ_šjíó˃í|E0êÁcuÕ»AÅWngÕ mAƒóÿ³ð×ݾÎn_çŒF”!y0dÓîz©ÛtûÚÜ„"%ú<Á¢§Ž×5ý ì*g”²¹ÆŒM¢ß cqŠ„hïØ­N}¸+T¾ ‰ë€u;QŽÀ ¬ì”³t^RÝtÞ žÆƒ­†"¹ò ðá2ÚCO"à~Í8ïdn+39=1eDG–”QIÈö5÷ÝŠ¹oLB4¥BwÏjuÈPo¦ ï4-ÒÚ,8¹F·R“´Š 8â[^Ì Æô¹<,R]OÎ.?SûM{ÞúÊ2ºµwëhVZŽÏ˜IýhÆtdwÑ ÉeŽzÕ¤'ÌiÑÛÓW F +Å¥"H+5ãs½×Pöjç™Î°xdÓž‹I/Sd4ææ 1Þ,ÅHb¼ÏÝcCIÀz6™¢4Ôä5aÁ[¨ÛgPâklÛÐo°Ü}Ð÷?›úÛŸ?ý¢?ÿ…þÁ¯¿ç" áî;þR?&Dœ±¦Œ°&„Xó-} m†þÐúŠpét¤á^èÑ›Žc®2A€í“ê;\ ¥Xxz;›Ñ‰œzæ>w7Ù잣M XI†by/0*;`E¯)2rq¡ÒÉ6g»ç %§°bŽX Œ9„¹+ÅÕðSÆä=£ùgæáÝ­HN2Œ˜ÐG·ÃNb$âƒKDÈéÍÜ¥Z°=·Ò‘š QQj®Rïy’ä'OõFÙ$S’ y‚ Xò³+9“øœaŽbòFWƒ ¥@+4yXž¬ `Å[æ7iµµDKÜ5»n:€5½f'·Èi_©A0òà•Q‰ûÓ¦µÚd¨ßU¨6§ãå= 'gX êNŽ‹ îÀ¼ŸºÖ"~IéÀ¢6ƒü§Zâì>wrˆÄ!m6ùÈqdÑLfç8ö‹{q­ë ƒÏ\ž¤¶`ŠåH3­ øïý5‘3Þ3õ9r© ‘W×`ìFZš ýÝ> û¤°à’¸6Âé{#t{;Þɪ¼v†Pìe„X\^qÍ·ëÛ@~ËÇ”]òÚ‰h[tÈÏE1гŒ‰’AÏa#¼—ßNâZ¡·0&årÚ9M½c% ÆvLC¦6s­$á\¹ÊçºîÀãã¸? íõü. ÿ $#Ð;J¸E\ŸuD} aõxÄ€åøaäeA8Ý`õ9„ý3ï¾ëOÿ2Ä}Pyÿ~¥ïû¾ïû2•{{,Ÿù?Òé;cH@½Ê,­ ö¿…”ß ×"" ’uë° •Ä $úÀ^¬cëR§N¶a$„%צ.»ÐJè,™abÄ›lBA‚Gð¢özÝò[#!8É–º­ÓóvW ;¸/wR–ÀÃKºÜÚøçÄü–g0!ËýÑþ3h šMb:Pìû~ó8…ïNsë`Þy¯‚M\r«u6×>(˜BŒU6# ;è‚.óYÌç 7£lzXPë>ˆ`QгÁˆÎ ß‘ª„¢+édÌk/+龞+zXi|÷Ÿ¡ûŠ]ÍF¢SË­Ì[wº#ÄuÙqfC**wáó¿Iê³:ÅÂê’ dÅè JrÜøšû¹‚y½ÃI˜ºóf÷p»š!ºpÆ/3¸á`Lpº lw_0‘I$ëÜï¶‹9ý¦•Ö_’)„ëÏ«Ýðlt“±• W{ãN—÷.$ |~ rÇ·Æ9¢®GF£„+&‹Ïíî m¶ÈßßÊHÉj ç¡‹[ÊvD8kŽ‘ª›b‡ÜßüÞY.lŠ€•|®_O£A!:ÅІƬéÈI6‘¨®:"Ð(F©°*ØTÜ–/ÇsѪa5T)tgôL­È"Ï׌e;S¸Aï1œ‘–‚І–6¤´!ç3–ãס÷÷‘oH¡àõOüØËçßóù¯¦çßùꃲûÿ'»°~çËÐÞý|Ê+zxÊ#Ú ìí-àüŸŽNÿð  —áÿÊ—¸>šÕ`“ µ{Èc'­f¯$ivÝdÀAØ<¯LƒyÚÉsäÐ%× îâe·áä:JµqÌÝv¶ýøµ_ì³^Ù˜6û{߆µ!š#£)©i¹6i. »“©Ñ=Jv›Ñ]÷òÈB]]ÀIsÄÄ“+ø'P>›þÏMüÕMªœˆk3 P&#þ‚Ó·:ò½=RÚ(#›‹¡SZ1ô3 9‰H3ýJ„=Ö2σn‡ýN¸TÞØRXìXn­9Ò×åË7+ÁH†€”ÍÃBÆõ-õä.Vµôá.—±{.—1EJ(i\àž:Ód© ÅÖoÓû¾9"íjMW\ìþöËY-j7\œX@y:_IÞ<Ï¡²ŽdÀoŒŸ<§¡¾;§1·2®½U¤¸j>qç5j–ÑPiÅfEø®HZʨ¡`]3ö~Ä^w¤ú6B¿GŽ·(爸¼ùÁüÓúצÿèPrÿ *Òéð6p÷ÞO–Ëÿ)f¤µcõy`éX/Pk@8$ÄôÅùFÞЮz…,Q§×ë`¶dÓ˜Š\}vˇîÁxŠÅ¦fS+oµ»—Vˆ–ŸÀl~—-7§ê¤.špî›ßø`«vûGx<žÌtÎÙÉç<÷L#ûÅ‘išc#Ó&|[‡lV8¼>{°¤šI‰PˆÆÚnN;šlTئM!'íëûS’\¤S™ËxÖB/Fk&fôçNM¦ƒ¹#ÌfÆôj¬y_$AáA¤ ûæät‰°ïÜÏߌ‰L4=7º&YÌ䯩gsò)îúR7£˜pp;ënûÿZ”ˆÏYà4%&¸¾G+¶>‘»”<áåê6eibÏL ÐÏ@å»Ðqå¹£§¼éb!#rÑKDgÒÉXØžLçe€S=QlŸ>!䤧×) æûC¡°¸¥lH‡v»‰Æ#õ2˜Â õi,“‘«|qÄêÙß.Àò–E)N…ÃÁì®…lïj ‰Êz°ÏÛyß;WµŽŸ 9›4¾÷žÄ&Âj`ã¦T+ÁÀ ½j'!h­z¡üñ²ËÆŸí`ÍOéÃÙ+E&S=ÚÏVØ°í¯­aDÚA¾+)Œï¿,¶¾j¼O NY\ä&:3ÔCú hýÐn‘âs¤ØÑÓ·Hñóè¯~èîçþÑ/þñý Üþ¸“€ðü»þò¶½ÆåqG«/°Ü~Ë8DÂÇððê]”û åÕè„Sä9¨É‘)Dû…LDº]•ÝrS£ô,šµ9»Ií.ƒAhWd%g¢ÑœQCsŒíì´·‰ûlNÍMzý2v”Ù[’úiÊ%>)2qî¾uÀ6³¸”¢M“9-¢Ø]¬BÒÏör‰Ü.cjÉ.‡°¨ç[;UÀ¯|¯“É©ú vÈ*…,-49ð01‹oqk¸í©¹Mö$ÉL%ç­^†TNYŽ>-R‹±¨µW–dj Vð{5¸ºÝ;ÖûÙAÖÜ;á+BNö{w¡ý¤ŠSó“q0µÀ$žƒW¡B¹›Í¡Y<¡HaÒŠ÷`°¬öú3˜£Ù=™§…ë&rîä ‚ K³š Fºf†ÏMGÔ›*†nïPáT]î]Óšqq]“êØÙâ}ÌŸ¡™ZÙÆyÐ1îOÜL‚˜T±næöä"h"÷IlÝj\‚’˜úxg -S—[[…T¸½X8H)üýu8-·£iZoÇgèËð+¯$¦å“5ÆR·¡+„ü;ˆ|ÿí"$Fë¼…E™„­£¹¬8w Y$<’°¸Úž^$ÆL„iÓ³²ådÍ@>Ë;pÂHNÓê“e··Çq=òi m cè §‘²Õ;Bxްþl Fìõ5€÷ÑÖÜñyt|êåÍÏÿ=¿ïü“?òA©ýûP¤/þK?Pï·?‘°í¯ÑZú·|@ØÚ§à~{òÅöÊ Ô6³Žlpc¨c#h=ïfá«jG“L¾0e/>ÈÆ\ *:‰û¸ê´œ;á¤ÊŒ$ÓNa— ¦vx;¿¦CN=‚ª}2Ñ´‘dQè°F¡·!(Lžš“ÊjZÅÙ„ðóȇZWt?ïÜUË~°ØnÑÛûùÐ %ÅãµÙÅ„3“‘|&jgt瓾q/é¤ÚeqšóŽž9Û+Yû*êgC) Qr†p¤ mIå4ô{dý:0£­¶rPH4±2Ñi4¹˜Æ82t9p:£#UPÊ“ØÖ; ¯\ÙŽ|Fk '”~6-m>º†sµçU¨øóFMò7®(=ŽŸSY ¢ „Ê#U )Zc9Õœ ˃ktŠ©$ñÓ=TêæÌ¦ew‰4Å$—Eq&.éEšòð‹Žu",É´Ÿ\àˆrÉ¥Ýu“*v>›!Xîty¤iσËJãzÈN)ãß ½Ïëëqÿ{±Ìmñ÷z¬ºmݸ÷+qmÐÓµã^¼,…k":!âô„3åm}0®Åû¨gf5³aÊœêWeÍoA7g:ׄ­ó °=Žp’ȵQiÀÎ$ÆqÉW tÓÐòß·Ü?2. ¡Þ2lä)¤ð9ÄpA8oHkBZV¤c@I½~æG?ëßÿñ½ÿÆŸý Ìþ}*Òéî~þðÎ7üxZvÒðxAlG´Ëû8¼Xó-B¼AïiTÏQjãÁ­©ZÊ‘º Öl:ÆaÁ«|x¦g±ô”‹“Æ8øpf&+káTÃB\N¬H-šŒÕ,ˆ<¶?Adu$“ìÔÍvꚨxH³Ø—œ×ñ¢©€#î·s²Ét²,4¾×DºL¥½TuZÒ GÕë«}_iOâÍiÆáH[¸f)7P$·Šm×qã.t>4ºGÀ•×w>±˜]Œýý–ÿ,ˆQ{|M}A{hù®ôË‘ûÔF¯t°¥½Yð×SM‹QdÓSÎÆVV³×ª™Ls—w<§|ï¤Õ€úþ¸çý‘DÈȦ ¹=ìFNÅnE>ñpU#Ù2å74)÷Vev¡èÄÖŒ©“ž<ÿ¢»,é‰E§HX­i†“¬…êš²dIP±]KÁfðˆÞú'÷|Ñ .c˜’tNÔIT!ŒõØÆgæøXŸ±!aóPQR ƒ½Ü ݳº¹ìõê8¼©RkÎNµF³0›2¦ƒ#r2ïù”FÑìe°¶ÕÏäºly¥¹«cü{ÙŒÔ8W,¨GJÞøuò-ù*ÁL¢z2ǯ”ذíxŸ3/tï+XoxÖp½µ,Ü(ÛjÔ…ç6¾æŒ£´¼°1d€^äa»G:\°¤ 5 ?Cm-¼?„^VÄpD¿üÄË»Ÿû;þ•øÞûO}Pbÿ>iH·ßöÃe{Íö÷mHáèë1bŠõjò ,^ýbiÕAƒ ƒö*{•~±ðŒzæÔÀ"Þ ív¸K·*8´¦k¥%°«Œ(¦¦Z! 듘BwpÍxF¦ºÈzq{$™Šg)×ñ–M^»Õö¡e‡¤VÒv΂´™’C7ƒ# t#‹É4d†,T7…ÇÆôÅ1ؤ&s‡« ’õ´ÏÔžùJ£ÝT_mšô²45Jaq>´£ÇF)j``ž¬6’ö­ÍÖ ãg®ô*×;0¥kÍQNdßm÷™“±÷ç5ØÝ¾»›£^—×2Iƒ2Y ÔwWà•¦Ï9áóFD"º¢ç¶éâØ¸Ô«‰\)r¦Ã›®ç¼WÞÓ|ç3À&)ŒÙWÇY`ÏÙ¢0'õ@m¸,hEYºüñ)÷£Ç5˜“ÜgÊSÆŽµ/V$Ã6Öç{JävÂáÁ]³ìLeª­l\“Nn/,‹Jp’î£!>{Ò˜BpXL±ŒIRî]‘’µ»0 '‹ ì÷ÍLf$ÓÔZd¨T#ÕU6mí‘maH«‘7–äåZºÂÔ9.ˆ—Dº~uc‹m<&f§k𨸉çCän|ëî9 „¸)ë±#-+Âå€=2Z:!Ç[„eAº}ùÅ¡ãøöþ¼|öÍÿæoKïýKÿÑåõ§ H/oýŠ?ÞãùO„œÑÚs >ý1nØzF/ˉΣ‹ïñš”%¸´GÛ}¢(g8“€(¾ðEK0ÍñôÂ^1JyÒÒ fÛ%NûKƒUž³ê²ìÐ þʋݬÈE6‘MGŒœ89µÎ"ì’£¦»•›dU\g"–²’£}n×èm,ö¥‚ä5Yjê)ÕÁÀÉvíýž¦Å`nÙ‡v."÷²7”‘4 :‰0t¡¸]af° ƒY¤ÎßïBÚ…™¿¼'Ñ ˆØ$¨¿†'‘ šö}x@s°yu)ïsL”Ù\ì€S¸J'‹¿­À¤ÅI°’=‹»ºD¸¼¹ï‰zmÎ#cŽ*8ZÜŠî–º?Ùæ62%3š®y¼?- ô™ôÄw&9=.ügMËò¯à”J^‚,i'{¾àª*‹dÕi•©á.;֧ͧr.#/"ôÁÖÊ¢Ó‘PÄP9w%r2Ægn\ÿ¬GËŠO7η½8ô„î‚‘©j{1.Ê¥âÔ°·±›®;Jÿê6,G{ÖC1n(« Ñw9»mÆ¢W“Ušþä}e—Íø a³‹Òm2¯ôÜžžóŸébÄy#B´p]2‹ )Ÿq9óñ¥ÿÂB½w×¹ê¥ûkJZèc ÔTó‹Œ33 ""ܬh¡"†¬¥G ¿‹7@OH9!”Ãp7Ë ˆˆé/ßò/ÿ®øÑßú?(­?UEúíÿʤ|÷&¤ËaAHo!® 'ôåÃØëŠ‘ó×£ïG„0^´éµ[Q ˆ,¢ò«Ð¥hæ$é0^žµ ø ÉP¨žyß•®á¸ÖY¨·Ë]ìÕþV÷6¶m2åB¶õ-¡Xí;Éd]\ˆ…ˆ$y5»LMähd$Óž°óûtOÂêco%£Œièáô›e3™&"1_ƒºã[7UÓƒ¼ÀXð‰Ÿ]Nd´]^¯ÇfèH·éuJ«ôõŽÖ@ÌÆÄéŠC³]f|@2¡õäž›è<ÖÙD5¢ÙÉMºg,‹%îŒQf®1‘ŠVxÓ8cM«AÈmãD´_s¦³Y4Ø9ºÐz¶é.:ïÁ¾o¤'s¿8ýj° ZݼvÒîzRe³fQ®R"Uå“Q¹C•`\‘$&ñÅ$M"ÆéÙš ‡È’g·:"ó€ëPíJ7‹ŸTÓˆ`ã4NH¶U¦ Ñ3Z×,/ÃP¤/nÂv…XtÂäJØê;×HôŒG0î.¸˜Jå<î}:šWšÌ# ;ç.ïK/é˜Ö&#ÏÀ$Zµºõƒš?ò#ä ¦ìo¥G žLD&öÎd’Q+ÆÎÇ:£ Š•kžý4$]‘ m3©.‘TFTkaHK –½°F`©ûÈ‚FG¹4ìÛa¼ýˆ%u©(xƒžn±¢´€ËÐQ€´£×ÏüÕô±ÿÑÿtùøïü”ÕŸÂ"Ó‚túi˜³Ÿ€¸¢Å/"®g¤˜—·P±¾BJ^}iü;Y”)Z&ªX  ®Ø! y ‹œÓœLf…“‘ɼÞt2Qᘽ.…(Ò¬#,Vl¢ï£ÅäUÔ2D¡áuñl:‘nˆCû´#ëF¬RNq>T9õžÚS&+“ì 6"Î;·º9òýÁS46© gtlà#Y¯!ØBˆmfw7 ɸ|ò—üÏÎBÒA£jv&Ú±:¨”Ä™éJÇ&ÝNÖpÕ‹ÝÏ+¯öhð Ù™y]m¿úØËú3É‘MÌr‡jLF¿~ÁùÚÕöGg¢Rœ¯o@X ¾BGä •mw-¨]Š¡™4]¸vÕJB›©qùz7bÊËø\÷÷Î4·/üóZ»Ü°±Š®›ÖÞ-Á+Û×·<Ò—ºšê‡á…Ý"°®6ѦÕö¦‚š§vXßëa@ØÓs„2éq\·²›Æ7¥1I×´§£‘ç‰_}3C"ÁóÓõN÷…Å?v‹ZÝé5>ß/OB¶ž)3×¹[Ôfâîúrœ€°¸ž›üýa|Î|È@=Ldp&«ï }¾'U¥ç¦ðgZ÷þ²y›v½ 87 öˆÐ—ñj_^c‰ð ¡="ì/ÐzCÁ‚šßAX^ ?;¡¸üÍ—Çþw×áÿÿàƒ’úS\¤Ç4ý+þx{óÉÿ(ä}L]Û ”ó Kz\¨_‡mmßJä2“3§žÂƒN­zG¥ÛM$Híê|iêM/­=µsŽ>e¨9Fs3)Ðüé6‹e“f0®ÔÒÖ'1“N–2#3ãè@c0ÒÑdÙ^Lö3wgÉùNËôA/ñ‰× SvúíînBá$˜DÀc±®»ƒE÷Í—j†+Ó¡‹ðlÒ®ýž¼ÁŽ’B1W½ZHšIO"aŒéÙ¤pº‹ÁŠSy$!{ö)ÇYœ)®FýÜÙzn@åçMŽ8çbNëa½d°t`“S7cKo›I³jwYÕÑZÀv”æ ~?ÑOßîjÚòôô-ʶ_É ~:×!ýbûõt‡k?s]®­iýúC×Q©p± ‰L{âèés.S4—îÕ¯ZÝËòRmÑ.Mlüúf’‹Íf6Y£,¦r‰&ÚÈE(°g"gàp Y:…ñ”3ì%Ó¾³8ôÈ9ü ¢ß˜‘ÜÕ#ϲ ‰X”+Í£I'·¦âfþüa(Ñþòx¾ZµF®›ªÃb @íc0RÀ.|þÖç|H’+}|ŽÌä¬tÒžº¢ï 5ò¶¶Ñ,m¼¾mŸ/,l¢Â †(…ÝhV"ß®‰œDŘÒúް¾‡p|-D´þö°;ŽÇ[ôzùÐÇX;BøìËåëþåßµ|üòAþU¤ó»ÿÔŸ9¶˜vÔPQq‹´¾ƒÞß ïüÈ)«Õ\8fMÚ¸˜¦½jv÷b³ ‰ùË¡Óá©[‘o.ˆbÂÎב¡ÓµéÓþ’5§ÈJîn{^¿R˜°®O¾Z¯×­Œ{4 CBqh‹ÐXØ@]/df;‡»I8ôM°ÖoL•0u¯LþŠi4neáSÜàg«í¨+¥q‰ å¾Y3›ÒT0S²hFéätóK‰Íçb‘ನõ íÛ1÷m42÷©Ü9¢qSF’Z¹Ð(‰ V8Ä›ŽÎyn¾÷íÁH€‰ òr¤fX«¯h*‚Hûâ•®xáhaä×H«É¯¢‹iÍÛ½?°¨÷³kH€°".‡QpÛŠœâ@}ø¹mMÛBƒ<ÀÎ&v=ÊÑ.¢%ºšE‡0ô„°<çšêSh}C¸Y‘ŸEë¶?C>~%> Õy¹|ãë÷¾ùwÿeôp‘€ôö/ÿeÃA= )¦eK@»EÈ'„°=ŽQ³lÕ v G²> eAŒbÜ\!JÙä=YÓÄsÞÔ…‡£öWJ:‚‹2œÆ"ÑØ¬ð{Ùlä8fîÔ‹…Ð3ÿ, GšÖúÅíÓªtjŸ]±Ü(ãÿ«Iˆ“ùü÷ÍMP„™µwÚ©VóØžfýœF1'ÒYôö£‹+dÙ¤qbWÏCK“O5¤ =ZQÍ'Ѫcû:ÂÐÔkÝàˆJS.äó¡«“k±yÚ.ŽÃPm!BàÜËægÖTéySs£ÕßoÆ ,Ï¿4K\¤¶xãòÆa`³1£Lª3¿8h>²¸•a`[[<ºÆjw6Ôé£UÛkôÊýˆQÔ} Á={.Fu^Ç‹¡/½Ø3Á¸ÍÅšÇ ‡±ÚA¿ï½XP„œ@2ØhæòÀhH~íóûã~oÇ{¿DÛh’!ITInV2"R÷˽ ÉÒv±\Ù,8e’®î-»9­æªå#Îm>[ί-ègßÇçê 9“ô%¤Š$¹ºs®^ÌŽ´Wàü†+(6•¡<õ}ÚÂR²µ.ܰ+&V¼€øˆ¶_ÐÎÀù~Ç¥¶Ñàp¸iŒæ\]¨Î©FBaÕ{”ÚH(܇‘”|ñ{| ±gßF©ârÐÞEoï"-ߊ½¾@̱|âåác¿ú>þ¿þ×?(¡?MŠôÍ{ÿÄ'Rú†Oöü X2bþßæÓ¸!öëͳá¬ttÛ§7AŠwƒƒŠ#¾öÝ ê#I%Ž©¼ÓõG ÓÌÉuʲ %&ÞÀ$kDGî™ _OÎ WnKéÀé©ÙAW\™Xh"Ó×›eüô©I.ò¥–¦9ò×$÷þ†#Nñåó»QoË]dbœ ‰fîÿ^£èì7å­œC+šË,¼§¦ìð÷“¨&}u²Žì%u§K†%Ó_½_g…ÇæÜ×XãÁ2“5íLbVtÁ°õ‚¦àLMäÁ,Æy;3p ˜´LŽ]“®Ê½¹ 4s¯éì95…ê¿ÅÅMã0öø””U+Œ÷p’$WcÂ+y¬QçÜÆ»PÙÔº ù®¸,k5Çp¤Åzohÿ¿1ÁIÅÎç îCƒÛÉ~N né.j?©=us芉èAÓi WcÃFîLs´ØR œ"÷Æd0fÆ·n(]k¥zšòÙœõ6&Ýõ4®‰¼:Èr¾e‘ÛGc˜W·†! Xw`{Å ú‹÷ó˜Nƒìg·1D(å+®ì‘ŸÑLCÆâVRi„„øîwü•ÖÞGÄ-°¤åo€ô íø!´úÚöJˆsúù(‹µÍN¯èð§Uf%©'®.aÐ9jUúðNe}’Û6ö8ëÂÉmwN{2!wƒØ›ÂŠ‘°°XÚÖŒ$ÜÝp%6.Mš:òÅRªÔ(¬¡Å!ÙÒá9wšËu›0¶Â\¡Ÿ>ÖpŽiÛ“¨ “î£d‡2'Z|3Ì®  5 ÌXdM¨ƒr'ìzq HwSgpMN¶©{²b鶦ÈLA}(–^T»™´´îÒz'­ãþS±¥ŠöœŽâHƒM¶³ã”#ö|Vä«M\§·³ž5G³8Ë MÈÈÙ4Ë’xug<Ó³ãP†4uÄ.¬q-h?kº•‡6×4i½¶QaöÌRvæ=w'?“O÷ö1[¾ÛçI@dÃ…Í‘2“ý9i§C¨¾Û{HBŒô%a ré 7ôf°ÃXü‘&-íHý0 W“ìÆ—_îmùHH×™$X½?ŒbZ‚ɤzµ8ÑúÈOé“Bw’&p®ØÊ…d6šŽ,r^œMT!íèÑìgsæ.úfüÙÖó«á– ›3y”öh-`ßÂò6BV¡gÚºc] “ iÄÞ¯.? ­4bJ!$Ôº#/ XßÅÞˆë³ÁÖî/‘Ö[´þ„[ -g` ÈáÇ?±~ã¿ò;ÒÇÿÿ«JçO·" àøî¯ü£ýüé?^ãp„¯û†pBº!Äw’ž!㤛X굘M§ô„'UðåtÓT£v±¹Ýc!1ª`töAp·˜Úgû©:,£XÁOå<‚›å·;ý·w7¥^žHRó§C;DÓRËp#°Û¯„»’Ó?8x:Ú¡8ÃÛéÔÝ.pf ×kníæçíéÙ(À&IÉ»àd"(f–"7+üšËdöéNjžŠwPƒCî(ã¹8V·Rutð“¸49dÉÑÍg:Ó¸ÊC¶m® +ý)Ýù­ÁŽMDZSL74Ô9ˇ†•m~1¦›xÒÿâï ²†tv’Òqk=£hGo 2¹®±ñr½iB¦rMè^Žc> ÂiÑÇ‹hH‹²Öá¦þÒBÔF o>ä-®øÌœ€ã‡!I¬Ýñ<à\Î* W'ù¨7KVº<Œë—o†µçú̦æýÌÆZ½?´™.WmÜúà´$N£²×ÍŠ.Í£ˆ^6NíÌ-ßïó(q¢AIoÀñŽ^ Ðn0=ª;‘»~CÙ$Ì“{9ŒªRïg—V¥Œ×<‹ç@·b®fÞT¹o$]Ø(×`>å¨ã(Ö2n€= :¶7Ó '&#×)a5Æy(ÿ‚: ºy­ZÀ~tÕëé2Šz; Ô3ÖÓ)Ÿ‘Ž!Þ ¤Ó0ÈÁ-P/ˆé¯½L_ÿ/üûË·þ/?(Ð?Å¿òßõo|ç6ßüœ õáWôµ#žöº!‡åü i-HñSh[Ã’Vô} Ð켨¹+ 0]tèÎz±ébî¥ÙJ‹œ‘CNŠ3Ih>7ØûGŧŒgɹè¡;æõ÷Õ¦eM8q›ÑIâ3£Ãɨ ­˜Ò· o»#rÓlw¿·b¿Ï·ÏîÙÅH6¨b¿næ˜ÖÖp°HP`ÒV§"²µÝLDÂÁ-ƒÁ—Õyo³86]¯üž}2Æy‰…ò †#²L„ûé-1K½L’brô‰;{= @ÑþyÂøGî›9å·{~¶#eXH/,Ô¢9³”£ —ùLdH®{òõþW-1'sÉìÄÈ®|2‹R::|5®‚÷h÷,¢lf>6ÉiE…þ躨û•ñ‹²¾Ré7½ïô…ÞìùÔûW‰ºˆP×ö±¢ 8ȆT“8Ítâ¤ZȬæÞ=vê¨É†OjV`îh5{9 a*}XІ ÙÑwlž³óSï@zÆHSfZïDÂú¥XC’À÷A |·dvT¶±gïd˜‡jLþ@¦wçéº0^·Ðª6Ç»S¸Ã^Àöz@ðaŸ§µ +JhHµ"öiKº?ò~íˆËhVB4[Ú«5=¥Kˆh{Dïû˜ú¥H ŸC);Òú6Ð_ ÅD%Å ýrAh?úòð-¿åß^¾áû÷%ó§þWú¾ïû¾¿ëßÜúåqÿ⟽]"¾½Ô„¸œ€^×÷ÑZö´zD­'´ôjì‹‘?:A”ÖÔ£Y8¶3µ‰teJ"¨ðå×þjÆ«)Lƒl†Á×ú½ˆÁظƒlÜ‹.Ý›„¤'»EŸ“í³¨“O+ !»ó#'™Dr±ÀÏ«&%=ÑPëg,ˆnŽ>0ÛD¥ìç¶Ñm’¡`0넹ƒíHÅLî,Ö;Ô-ÿ¶³I$»t¹†ñóõ‡£t‘¥[žKVFñ)ªqfB×ëÏ'ýfÞßB)Ôd—ÿsQ ”žÌHMzí¾3zEz °"ðskÒïJ/ŠÎÓ¥eÍ©±£X ÎŽðÇç¦ûý}3–·®Wß( ¦«;pX \\m²×>uÃÝ56‹{†9õɈf¦ÑUƒè£“ùÅ£¡!‰d®Ø,Gxå0&Ю³/ãŸkÏøÙh²±ÈUi¢P‘9Ì*l‰Ï{ Çz ¶šPÓA{P¾çB¶×lTTO.6—Ï…ìTs5Ó¢HŸnqºÒ¥8è=J\—¤“QÁ¥®E6Ä37œv¾Ï[ .—ÏPd|¬VM‰ð½‚rÚ}C8œrAë =µ¹¢RB^’·¥[K¶&6g›úszìkã™xDÝ Öã=T”½#æ; ¿‡XŸ£Å†ÐŸ£Å€¸ýÐË»oùWÿô±ÿÙ¿÷A¹üiwÀú¡_ýgëžK CHX. 1Ü –gˆù„–îPÛŠØ¿ˆœF…:-«YÒ JòJU÷Y¹ætRÈÌÝvóáÝú€‘¾xUr,Z76í`¨3ÈͦØF­øæ í$Oe;T%µPô £í.†(· .ÞQÌÞƒ›²›/%JþòÎ\¥Ñø"øõY”+I#“ÉM²„|ßÜ|¶ðÁÉŸ¢ûæÁŸ™Å{¢ Øò‹ó‡I±dv"3h‡(¶}\Ç4UD7‹:®LÞ ’bUãjõâXú}¦i —Ò ï©tòOXÜj¼úÙìaäÐ|í V"`¥CÔIÓ^\І$cžvqîwÀUÈȔƬ`ƒ²©è´º-™’@ŪÓE §÷h ÒÕÏË]t<8%ƒ3[™Ís·ÏÑ!Œ÷Sú÷ØG1«$P•Kuj0CãÝ¸Ë ŸëƒY¯‚Pµži55‘,å™NîJªN¹@ýµ$o¡âÖùóƒµÔ·Àá]6mЧ ¶®‰$íí¯Ÿ w$­!e5Ú~ÏϦ„èÖÅD¯Þ‡<¬^hQØxlh4ÒêOïv!â”"]ך9è¡ÐYXhû2~ÆFÓÕ¬Ñ 7Ή®ª*ω ïoz{ŽN@}„ " ?Œ5ß õ„¥½ž÷Ljx»£oíåé[þµÿ1>ö¯ý¾JåWH‘Žë N_÷Ëþt‰ éøËé=<Œ.½-È7 ‡CE:ÐJ²Šÿ{1Oß°Øž§Ö—“Á–»š°šƒÏÁkk óîœ8+‹Æ‚ñr‹¹š´óâ‹–ºø8ÈPšÖH’ˆB0æ¾xsP©Ó]O6m1‚Ô„ ”&yðV´Ö+-.» ¬p’&0€}Þ¬ÅMל¨”Ý*!0YʬÂï;/.%ºCSwmªÁä198”S‘òiç~9k½ukLâÁIâ‚y+Ã%E·ÏQoo¬Ž¡/"× ä;+Œ»ãé‡Mî„%­¢Ì–É tÚÅ Tp»ö@–s^ÜjLb{ò&Éiíl‡©“vyÙBL©G6šÔ±BðbÍcc¼™µhÐN“ SŒ¾íÑÙÂÒÛô †‹5¨»{ñvÚù†¾·;½¿ù>×ó¸?mÖ6 ÛJRY¥[\ßGqM G<×R]p|79aÙHØûØwNú‘&'!Ž÷ùóÃ8ÄAÄŠ·<+–1½+<äñµ7ËôÈϹ¿=pšåÞ8wš±”qv„Å¡¼£MŽXãuÀæ!p•Gö{'òOãÌ+æƒ.ò­Œ"¿H"%HÞý9Ë ,!# •ŽòHÝö0rshõÉ¿v6áë² Æ G¤º£áméèë f´šQâÇÐOC ¯‘n>‡Ð.h÷íå³oùí¿-}ã¿ú¿ù L~i8|ø×ýl¯þÃÐbE\nQCBÙïÑ·3êrƒt|9 a|lc¯¥tšÊݯöŸyÝÞE^¼.7VÄŽÆ©&7ÛÃN’—ˆª,þ…PÙ,ÕIU.¶œù¼„TãjÌO¸ÉÐO¦3¼Å[šb1ee€1‹R°T¯È<[Àüš÷GL Ï+ƒgÍØdX±ã:Db7ïä¹÷œyàg V´º´Ê«ËMî ÑŽ´»âz6’Ws¤;yIk'/Ô/râV\¤ÌbšgkúßÝÞÜÿÕ¬)Rñ¬TZbj F³ÜbwÑg3œéÕö…Mv°^¢t± «õ±ÏlÉ™¨ìFÜê$æõf™Ú³àj:Z³1ak41ÂÝ¡LcNÞ‰ûE¡5j&Ôp¤dpõ¼wÙ"IµÃ¼²6uŽl­ÛKÇŠ"?L¯­@Žz\ 7ë¤gt÷Q¦Ý<÷·èxTt©΃ðµ_Æô\iZëØ§Ö3}«Ay¿OyÅ•p¸ã³Î`ЏŒfc½3ÅA“ü)Zc„„‡±;nüü ‹‚]ˆKYÙ¹6`F9sKÃsaa´ã™ïLXÆŸ‰¨¯ˆPkÞšyg©5¸¾)Šø<í€~DÛÊò8R¼âhVJ³ô¯ˆáÆÉ•ÿ¥2’5ÔŠ¾ï(¡#öÑtáÓX° Åѽ…uPæë±¡÷оòGo¾åßûM¤Y}…éx÷mç|ûÞ§K=ë»hø0BZðm•wŒ¨µññàô!ÔO|¨J¡žä ‰æó:«#s›7Kæ)ܱL‹Cú‚k n$H R¢¥É£šµ ƒ²¡}ZM¥/q×^R;;N¿¸è¼f‡å,bLëËroá ¸Û·œ=äâàNê‚ŦnÅàjƦ± I+Í­4¹O§­õzª•>ÚÒfþõÆt}ògo®"4:Ó–º†Ó¥™§õœbåÚµ¹ÜèÆBë åY@ íO]XÜ}‘9Ê„\k=ÑÜ#ЩKQ\†bŽjSÒ¦¨Qzõäh¸ÜãÚ™«¸ðâØÿ„­˜âDØ3I^w`Á O„h®k1‘ H©QT!>_¼¯]K¦eö{ï&Ç2^£$Yig2ryŸó¹àgø,'Qù¡»häó{x{øVwîwCvÏ #"W<=§$·îüÃÉbúy4¹W£Ý[C5“Æ×¹<Ö·i+J×°õ4ÈX¡b#™éר€Å6HVrê CX€ûÆÀŒjJ`ãw³¼­¼cJ—Ô´fóWÛ:u6oñkéý&Ó=`kƒ WÅÞ+Z]ÐöŸzmÞÓ¼Z\nâgK|Öc ñ?kphhë‚Öhýú6îËÒ/hû‡ò‡NuŽz~ÿGnîúÞøõ¿ñO~P¿‰cóWx÷o–Ïü™wc¼ûù¡Ÿ‘rA9,DZõú Ïò;åÓÈÁäW°s¾u{UA_«MI±DXúNò‰4Š1—a£Ñ÷Ôê|ýJoêíÚýéŠÒ öU¸}p"wµ¤EL$™ÎY²í|Õ8`!»V&…ÓÏI»#¼<€ƒ 7­;«Qd¾!w4… ´`;öîv ‰>à ¨‰5aHºÚnĵ^û`$]„<‘ä„”¨Èœ†w`^8ü Hše6°ýl¡6ˆ€âvÏT!Ë: Y)aìb×#ù$‡©¡DKz'1˜w"úUè–ª‘ wùÐ=°hšÌã}­o¬Ø‹V³ûD¤{×=¿ùLM•St:‰auŒx ×éuœ?Mäå2 þJîJ"Ï ó¹)›)z7Y`€ƒâÙüª‘žÊŠl×½îcÂ^¤&ÁPV4:žu½Œ ‹‡L*å>¾‰v)r´så–ëhRÈh{Ú H !we„òqY€ðMÈxq݃8ÖzDFB(ïÿå›oû£¿*}øŸý+”ƯàIÖwùÅgßðÉ?ƒ˜ Êù€õô1ôÎ%òòµ´7gİ ÷„ÈJ¨Pók2cé¿Û¨)ŒÕ˜¦a/O[-Ü!Ê4ƒ¬"wÚ†j?·q%t ±€L_mç¹-(;’YœàØÄþ‚Æ ¨‰rFJfÛý–VôàÌ<4áÎ}0§(¥ÞÄ““ŒE\isg|§·Û,vuçO-Bœš‹åKvA§ ¡¬!•BålLµ×Ä-"”¤X1k¡¯¡=^dXG;›v·m.:S²¨h.fÞ§{ê¹W›ÂãÁ³ F¡º ]V–:û³5g½›‰üæ˜ØbÄOW5·;WrÒÔó*Kü`‰IÒ¢‹ Ô$;÷ϼ63 Û­uDkg·6³;[Tfô¤°8ŒA¦:ÍG ݸz¥äßñ/:-DoŸÛ³<`èÉ<Ò3ß±ë[›Õxg;‘'%­íÝV?wgQœn=Am5\DZ‹Õî~¾¿Á¶‡ÔÈG›6¾aÿÚÝ*¬PÚµZ•˜úË Ó¤×³‘+†„1]ŒŒëÈxÞÏöùÒq‹årmd“Å%àçÍkGo ž!¶48'ÙÒׂ#·®Ëpvl{D¬¤û/qùBºElw@¹ACAK”ó§°ä¿‚Š=f ßcY+bý[Ø.ýåÍ/ú¿<}øŸü‘ÊâWA‘€õÃÿõÿ}«ÛìËŠ˜ßGJ—q-÷@ˆX' ?CëG´P7X©QT¡‘ÛØ^FAÖžT^½ñs²ÕŒ™¬HéÍ<˜´ƒ4 ¹¶ÛA$Fª`BYSÎŒåäzN|¡XRP§Y¸ƒTq›epf“;F})¢}O%ÕLB‘» åaL19}µ›ú§K˜ÛñN8YLp@2kÙl,YÓd¿¬,ØÝXæ“ ”´›\õÅýljD³/W¼¾qßҵʄ´£AõecѤ&z¦mŸ°’ý?WKNšéOÅ$ÓŠ´9 Î`¾¨d‘Y6+ª¨&êg+’¨‰Ûâbk.ý<ÕòèîN-°œË¿¹©†áÕ±že \…‚L+Û` _Ï=@â;Æ\çZÆ„¸¿±ä­Ú7DÐlwr.­S.g6.œLËf&#‘Dv²bc°0Q46TÝY„¶q‘»ËJá=ªl|.\=µ3pyÃ| ÕæêˆzÇØÌWk—BO=†Éåcs² â6ð¹\¸£Þw ¼¶}¾ŒLÚj,ÿ(ž •+E;æj÷­lCž–Všµáw.­ù~J |¯:úžÐ¶0¾Æeônc_ßI¸mT˜´pD쇡„Á‚Ú/@?¢Ô­ß"„;ä‘â[@HHë+ œÑÓ-¶ûÏüâåå‹_òŸü#ñîùä%ñ«©H¿÷k …ozY¶G´pƒZ;"nÐú{è}ElyYQêòrƒˆŠ½#9QW îVÚ#w\ÙX©òøÖN²:Æmà‹XH÷ÝÈ5Œ‡~ç~¦¼†Èb®b¬w6˜­>ÍšÝ$]žq¼Þë΃Q‡’O›ûýþ¯jMù8ƒ1u“1ÜΘÅ0ÑÞO¨Àd‘3À~j½Y¤z¿_~X@$ol¸âÙ]úëy¡i­ùî7Æî$žÕëýítá:^ïÙ›‹\hu˜Ø4DÏîî³È~“ûùËkLc ÙbJ+­Æ :9š$b3çúb:}1ÈóÑB@@‚”’—d˜#‰^ÜD —Û|±ýôœÂ‹YQêgs—àÌòÚàî®æÅifŒŸ]qêV¨{çÿL˜˜‘±…{ý žÕþ|  l¿ú‘{X"ùÖXø‚³A´¡Qã}ZCÄjYÉE‘ 0²šG½Óõ<šðÆ3P ƒ·ÝìD+ ’a±ÌïJ/pšg1 bLãy¡ÉŽ·Þ cª‡!ë¬g’ò’³ÈMüüç±³í´õ•É‘ `ânMKƒý¾³9Nî³A ×_2b’IÐô6Wf:cy:bHhË*Š~%%TåÆÈ¯=ñøä --Ë#òòY¤õ3Hdžúc@Äù6£ôoÒ{Hñíò™O ß½yö}ê›âÝ÷|êƒrøUV¤àîc¿òÿ€ýád¼ƒRŽ´l@¾C_ßF©ïc]>ŒÒ>Ž^¿!.4FcxóB&,§ÈòŒÜÕݵX öœ/Î8Ÿ/H^¹±!ÈôfèPô~Ú ¢@4Æåœ7×yW~Õm±ÏëØÅ¥z-™™SГô©^Æg,t½:ûGMTÎo{Æ/&›F[£RSêkqeR/O&Þflùé‹ WTŠÛÏúCN“¤XÄ$ÊEçV¸_®¸¿HO \1áw'9ó2èX¯³½QIŠû>¸=¿þl½'â‘Që|Ýt5p*f!ÖgA D†>È)˜Õµ\µ¦5l2d ï&=›éóÅ1¨üü’Ú©Až7h}àõä²ê¬îgpº“`&Å@sõ•þ=Ïßã*%³aê¦=—œ®?°€ò9«ohkëUZ9‘@%YžV-º·òèô‹ÜÝv7y†§HçhºâH×±Æ,ðÃÍð\˜qG#‚¨ÈùÁ>{!™K$+P÷,s¡²s%¯|·Ï–Lv¾'Œ}$'Àíöer²’ÛQô²³Q m^«C¶JßõuH£ptRÃHD¯„ø-T´öÄ08ó€XèÓ¯$®Î3¦çïBLßL׿†€!÷„¸~ Ë1"ÇÏ#çˆ6 ¿¶O¾ŒxöæÙ?ô#ßù ~µéü¡îc>lµß#Ý%´xB ·ˆ}GŒ+B>á‹ÀåSh¹!â9°­h}æÍìí–ƒí×3eÙ Æ!“ ½¦È5Ó<ŠÒ¢Ìƒ1$3‰„Nu0+¾/úØAê]ã:lùâvÍÀv•_êò›Îio˜)¿èN»Z îîÚ©9¦Â@È/tWÄÞ]hB·"¾ðñÎí4%)‘);2^¶ÆÎs\Úïù5ÛÎ`d9}Ê&©ne($)à¾Ø·š,k?½?‰ÜXt<Ä]Œ¤FMÁ÷ð~ëŦâò>‹A²0†àÀq¨ld¹ÇÕ‹Ù›úk¤µå´9=ºEP»!Š"þæ®ouûânÓ[ƒ¥ÁMÈz·=ãDÕ´œl7.ñZ7ËÎùÙx}Cð`d¿zÅi½ÏÌÚ?‚ϰP©D׺BÉÔBISôIh;e½dT¯ :"J‰“³˜â•éWù@[Úm|ÝLƒŽÖ€í |OÊFráz¤°‰­D˜¤öhbuóýÈÕœ¸"‹Z}´Üúåà‚}äÕ@"d/¦¹,îößÝõÈdˆÇϯd¶¾ Í€ªÌF¶18”¤Ñbk…Ø~":ø iºàx\ÇVg'‘ô`ܤhŸöûá°˜¼W°¡—K~¶Üá¼?CHbýÉO¤·¾çoÿáOwÈ/>¨‚_•ìnhç·þ?å æyÀÝw êábÕ.ň²= 6 ½AèM~܃¶4„´[á+0iÂÍ×̃¬Pèß, F¶›"¢íôx^’ˆ ÂÎFæeञ;8[ëUÚH½¶›’WsÙÇg 2ê(–vÕi”Ïëâ&5åxmøÌ“N–êÔ#»ôL/êƒÉX”÷+±®ÖK0³˜¸‚EtäT!¨6(H`1´@QŸ²횪›Vö§²ÍŒuŽ£+´ÉXË*¤ñ`?¿ˆ…ÑÙ—F3Äfún}î9}ŠX v…+"!°‰ÈœJ9Ù†fˆFSƒäBM¦¸¢:“Õ¤ÞhVB±²1 v}Dë…ìvi·‹Y׆`­ÓĤXã"ƒ å'1‰y¢/bÉÒ¼b¹‹uO›ÐÀß·ŸÙ¨ù‰”-IÅÀøSÐU,ò¹Î.Þ³rz—¿·TÑ=3 ­o«ÎB÷2ŠX cÝ%Ä(¼±Æ2æÑLT5@ {cîõóÁA×Å,]Kþ YÐ3wâû6û£5Žù†äR÷>(.ó\ØwCv&‘ò\¾ÈÜø6,I—d VR:”jAB"Y¦#Ðú(ù‘ò7¢_v´þ‹–$ÓÑÕB:ûö=-@ü òò ­‡ã½½º|ùøBx-Úqû›/óÝ?üÿ8~çüºÊß×À$ ˇþk1_¼ªåÓ@¯ÈiPc ~˜ï€ðQ €r@Ä ->GË1MÐÖ³òAÞéë[4ÕÁ$-|Ñ[6˜wã’»™*(QP»ÈÂ=w¼å¡ÓÍ¡JÒ©îtÏ ÎWáÌ\gEõé϶>>¨ ÝIÊ™v–b#ïO˜É×¾àOö–ö0‹l+IúêŒWTr•ö}­|éD£3ÒWàÅfÓgÓÿ—ñHv¬bgÚº±oçÔ_žd3;#yBO­v0 .dݪLî³]³ÈëVvÓ¯#q Bhs6]2qQÊ› Æ`ÌÃ=r ,¬I-Í\®ÕÞv²€’!{W=~úïæÛ iåávê‹Ó¾Ë'[µ,mù´Â $h©‘„ä‹‘®U•~z–ïùµ”>ÖÜóφsßÇj¨ækS='ëÉLò"}¶µ³„XÃ8L½,Äd£Á†¼§‹¤s$XIª%ûÔ}3?ý%ÉóBÈ’G±,ç1e76ky5§Âž JHf™¸w'|]ùù+¹‹b uŸ™S?åR«! ÔhÏŸl)| Qµ‡ñÞwºµ5MÍ+™If¥ïy<¼=• ‹PÁáh”ÒŠ°>Cï”5 ^è:Vƒ ó–½·ˆ¥!ä†e½Cˆ!òŠp\PãŠn°Ý¿Ž÷p8ì1¢÷ µ±þõ—‡÷þÙ?vü®ÿÛ?ÿAéû*Ò°¾û~?ö¿õ½]Pê‡Ã;h{ÄÖ3bZÑ.åòÀgóо1¦1*·˜öˆ WÈN(îvÓl¶}¼s“–Öwb—ì )vù}sÎd«™L?èÝV–­Óg$®0D¢³ÈµêºØ8L·2Iv\¾òUvðíÌŒuñ€þð;:r/%rXô¿GD<’Á¢ß+.1™ÁÄðk ¼ã×,æ;˜&{öõàuË0‡/Ú´“¡Ùêôèó3F¯ ÊÞLzV/u ŒÃX>ïs§]üb°Ÿ½Ð’³ò¹òı˜øu*ó;§Õù™’Г­ØÇo*¼¦ % rù.ÚnvêÃqa„Ë>›e1ƒ¬ò 3ÎÛØXha¿ͦîýÕ€ŽÕ0±RÐJ¡_zÔŠ….†íÂUL0HìÀúÜÂ;ÀiiLÆWª(ò$òâéÂØuï$‰3×ÑàÂ{LÎÕ“Yµn´¼M+ß`LÄaÄD¦uE\î°í7hÛÄö92ÐkENªßÐÚ[ãÆå6ηe !U¤þ¡t¤CBФ¥!¿€xþ›勨iGk?ñòð3þ{¿kýyÿÇ郲÷µX¤¿î×ü`ºùž ¡#å¡þo­ ¯G††Ã) ­¥?Ñúó1QŠìŒŽC³6ºÁ09’íňùšà”Û€Æ ½½;»æZƤë/n ã÷Èó9PâSù9cbg+¢¿w ÑM‘~M‡ &ãˆæŠb€ÓŸ`fÈÎI¾8§¬êºùeÈ?nÑÈÚmšŒ]qð…DLñØ­x"P¶±:¸´™D¶€ZïQúûŒm} {9á¤?"Ô{ä°"ÖŽxÜ !Þ¢ß~=zÛPâåé›ÿ­ßº|Óïø”¼¯ÁôüB‡¯ûáý³ê—KDGBO´º"¤ˆPÞGƧzïC@«eè™yÀiJ<äC1bVï6A)þ²{øïb;© Y¯ÅâãêN׳ÝE7*z/4©=ãÜ¥‚áÁ ô“+¼µ™d” ‹gp´^4ìÈ:2ÒèÁí–an_ÓáK¦<¨çt T9ØÚQÆhiGÞküŠø–Œ.=7vw‘¿´g¬Ž”ÄÂBŒ]\¥eƒªåmÜÎvðÍ=µ`9~AׂS’O™Š¾‹ Ϋ;Ñt…~’Û÷ÝM¼…®wÇ€9‹ÍûäŸAÊ’ÂÂ!ôaw ›·VlƒMå=Ïb5T%¯¦Y²fÍîšóºÎ`ûTóŽÑ¸ÅH(Å~&šÏ!“=+bW±éš§û•t-ÑJ±­b8ŠxéhHÌÎw/SúT^ ¨8ä!eZŸkÑ3YØ.A®m|†¤’Ⲏé¸Ra±=PF´$€Mƒ[7u:–{®ÂÈ·þûã8/flÇÕ<Ê{žÍ—:wû"=&r$ò‰¡ À©`’¼"® 5íˆñ‹”Cá®xW±E„µ{/Hõ€Þ¿ ±oHÇìÛ‚ôr7„\툼´W?ùòÅwýáïù>°ùüZž¤ ½õKÿ¿ìý{°}[vׇ}Ƙs®µ÷>ßó¾ZýîÖ©%d(# T± Æ/Åà±cSÛØ8•¸pìPcü G V±U~¡¡° ˆŒ™‡Ô’Z¿î¾·oß{÷÷<çì½Ö|å9æžû*vÅ€–tVÕ­Ûý»¿sö^k¯½Æßñ}<ò×SsDÊ%’ÏðÜʼno\ç(éœêvÎqSFÞT\c­*Ì&)Ó 9Çyª7Oã®;”‘þ„™Î#o«A`VdK8!žîܵ[ÛNƒÍÛIeêÚ—6™~Õ€ÁVVÓ`öé²§ok˜²¦jÍB÷êæ.>&0u8×ö’}ï},è§ŸœM’åG3mó(²Ç‰·pühïþÏ©cÍjL×iæÁL>†ƒLˆ]Óc:ÙÇW eäìbzârjê¢!8zq‡†sºa©'ˆ†|Ðä£þs%ÍðiQ'ŸÀêvý ŒP‹q¢ÖÓµDß/'¬qr*×án=ÇmßùI_„.¢Ýob;Î.ç3âÛq‚í¤8µÉרéÞ\æº1K1q—»é·Œ¹ýÓ:Yô¬q,\†³{ÖŒðAµ¹ÛnSë¼=; yÉ ³¡m}û^ºÐÞ›ï÷¦­ÂªÝŸÑvã!Xld€lúsw^‘ù ªœ£Ü£äW¨æY[Óm+¬`k7¥†È,*•R•Po˜æsª*þüœ’è]üÆáÜ‘Þ}´ûéñ[xøíñ¶ÔÝé¶¾üð?ýûëáÅçѨõm(ï¡îŒ"÷‘z‡* ¹ ™‡”и`úà~ÞfÞq 9ÕmŸÄ:<Ý‹æQú×'^k0ª¹¯U“áõõE¶F"/Ãã¹K¨j2–õÆîkȲAæÑüŠ!.ÙàÿpÑ =zÐLç„8ß$ˆÕø2Yà…Açýûó ÜU‹k,¦M϶ï†%$³‡µÛ³•ËM ¸Èö™ùÍ@¶:êáí³L¦¹^Ìd$ÇÑ€zLÕè}›èýd…Ö$úsûÌÖÄr g'~ S;×þ}Ug<?\ “Á÷©£=é¤é¶óînnI!¥€ÖŠkRÔªäeOº™©ñŠœ¯ÐíD‘Ò`ù.[ –©Ýúz†NÈå… u¾·àHTmŒB ‘”¾ðÈy˜òç?¡÷»·eîî+áð “¾¼‹Ë÷?®iþ©5 .(%zjÞ˜A½CD)qFÊ­Ï[1\lwÕå '{žá+=I©Ou8dŠAåå„a­®}Yûd#FJªF“< `g—XZF­ZvdØ5Š13ëÔˆ'î:.îdrò'1‚F\S5ý¶±›Åš‘Á<®'ûa '0voJ:IGF`Ä©µh—?)c’9†s>ZÕWŸÆp£¹¨2¶Î]Ê(B§–ˆG™’±Ä{PÊq¿Ûåa'fõ„Xw$1´Ì¢8ùìß÷þý¡Ø½žÕ›… BT`”hò$ÓËVƒ óɤ‚MCñ$£CÖÆôv'{Ê8µQíÒBʉ‡z¿DVØÄ åîr×ÿÁµ{¢è<'ÁVÜ<öÚýJO9›†ùŠ˜«WÍù$ùËìx%ƒ.m,4ƒ6cú‹:´ÆxÙ›èzmÈ4Ö%¦ mC´Ï¢óAzü¨/¤÷4ýz§hZp³M‡FNs¾ívkkƒ.Aë÷¾vÂ× ;gŒIm×û¨°0ÂÙg·vîEmMÀÑÁ¾ÃY1Pì9…yˆ¯[íYÑkè’01Xƒ– •=I^ÁÕûˆÛ“Ö‚Ê R=yÝ7¹©¹’i~H)‚ßd2BÑqáþqQs¢ï˜73¬?ôÈo¿þ¯n¾ùŸ&áV};IÿwMÓûÿ¯ê7¼CƒPëDn{MM_¹h¾„0SÂÝÜEujð³=•W{gîÄ«g1§NÈêZT“IF5ú4t×5 voßf³ZÌ'»ëžÌãÏZŒØ4OÂ"0ƒƒl;2{(k2¡¾îs9}¨Û~|²Ô›RÔäwôœ^†L«ÛSʉ±Ãqíp³uùÉ^ż–õƒ©c]>Õ Zt6ëÉT|tÐÊ'ŒíÓéþ„­Þs’õ$òxNéä¯[ÒÒÑí¬Cé¢oÈ‚äѧð>)wy–¬c²ï¶‹GBûØd(F‡â]‡Êû4«ãsÄ\¹jhLàœ‡v½7QÝu¬,'×{k9Ý=Çñ³ýÞ‹W­aÐi4\Å5­N¾sÆ|>"¶‰7 jUÚßOó(ÝÀ£˜Ù…·ÏöCwÄ WØ¿ÓÌLfÛ©»¿j1dÊ?ÙÚ ä,h"#4žÌt„A¼ÅH–ñÝ=fuÛÞÜÙ.ÚÏ&×+ ò–ÎÎ×6»2€¡3K°˜Ç ËûÃp¤›•jÞ¦zµkV»ÛÝa°²Õ·½v°{(M 5ò&LѦçþ š†OÃ4 ÛW`* â:!nO–'876mA]ä~“)áæk4úwûÌcVôd×Ô>“#?¶óÈÆrÎ/lo{úH+Ý ¤ôœkû|55~º1Ä£4oêt°&ÏP6ÝçªAÍ“9ÚõŒöØÃFŠI‹N²®½7¯“=e›.³ùˆ}.Õ®·˜ËT-ŠñþwݬÃÇÁäLö¤›Ñ(ÎgF}°&+\´Ï*Þ˜~™Á‰˜&c¿ù³ºªQÊXà‡^¿ñoº4u÷3È’Å>Zs2¹áï¾.MÛ]eX­R{YÛwus–¨eÅ9cÉM!?qä$^¢å5˜*[Äí€×pîêÞfI›ek½W©â©Ì-n³&Ü4‘s¤.o>Ú}ø×ý¾ékøgß–µÛ"ýÿ÷÷~îguþäT¶ÿŽø­a§Õ{¤¸ó›øí³&ÕJœ¢þC”4·¸Ó#,ºŒ=ŠhøaÐß=¾s8ùAàŠeÈ¥r'ÝŒœÝ˜Gp:jší‚fcm{#¤iIÛ“lr1¢ZdHÃ÷¹{)ì}÷)%žØ@–“Ð 9!_YA®=jÒ”.CjÄI”¦`& ~DH–8àå£yI=Ù[÷½lߣÛk9?&§tà¦!ǼíÚ‡FsAT#ž¦Ö”$@«¶†ÙRõä¡YÑmÑ:Á²gæD=)¼€C¤ð’¸.½C®ÏHµÂ挰Ý5VºDÜ,Ì[¥G•i}L]Þztöéßú›ÝÇï¿q[Òn‹ôÿàcû±_ÿ»jºÙIõ™Z©‚xÔ‡Öí¯;¼ èæ’_âÃë¦ãltëd.Cj2–îõ¼Ö6Du F( Öé§>åÑ U Ž»á†ÔeQÝî/ÔZýxØ­Vœ‹±¤“ëÒ k5²[ì©KóIá±I¦ûAw[Äþå.©ý[·–ÏÛ!n{Pô‡p­*_ôîrk( –zÇñïäÒÞþó ¾õç¬4*±=´«+ôÈJCfu$~uëEc@§dÍK·ø4ƒ#»ºÃ³:ò¶û®»ždW÷F ïœ;±ª£ZFbÕâ3Tf·ë^ÒõIJôÄ­‡¯àÆC×™uk¶©ûÔ ä'[1”]©fsª'd³ãc÷@w‡ëÖ§Vï¹Éµ[ØJC„Ôjé†!:ô¾…&áQ[Ãä}û=~ rn$­½ÁìѴΧÌb¤Ô¦Àjò¥ÕÎÕ»!ûRƒrûêM&—ö¾¦`÷¥oÌêøÂ¸Œ&_J‡Æ~–ùeûsŒ²ìÇué2¹Ér·#­Ñ^–±ë/4h õF³¨æP÷Ÿ´†Ä[\jئŸNrÀíZÎ÷«‘LS²ï¿AèÇÏ4´f"¿„åÚP޾¶ê°ÕÖQ†¢iÒ†Û¾nÍ{˜ÎÙ!ú1D¶”›çà Ù?¡Èu3™Ÿ_¥ºéØ09¥ÎhÙPò–I6ø|` e¦J¢ä/ õGßô§ÿ^}í_üÎÛrvKû냽ý](/(û?Ÿ*|“Ȇšw¸-TöÔ´C½§–+\ðY©L¤t@Kj2 ‘#YÖ2ØÜbRo0ª«#”ÃÙ=XQêlTüÚ%/u2ÝSjÄí$›`;¸“ªyLïjZÞŒA«®^G°G‡T½vÉíᤦKí¤&±×®QœÇDÜý·ó {¼³‹;A¨'Õ>ɘÇÙ~:&{0›Þ»ÌCÃ]ì!)é$"ÐöšÙX¿]îâ,¼Bìgegè÷/¦“}»"ÝëÈßžÀÏeìÉk{ŒN¢ëS\gW[Ô;ÛŽ°®cßÝI\µ{´×y»3¬˜v8´ÚÚ¤‡stoôþZ:ŸáïSÌ‚CóŠ›_‡¨reaš_"Ó%Å“Ý%E’6äòü{tÏ~Ê_ùŒžý”'·¥ìv’þ#‘}Õ¯ÿ.æ}¡æLå Ýmy€“|ûö¹0gªw(ëà]¦xfw|Xè‰o0fFÒãöb—*Ø”bzédSm ¶#³Bý(âÝ=Jkë°ƒˆÔ!ãì›5–hãìK/FbJ‹ -³5ݸ£O#›±ïkØ”K] Z‹ÂPÌÀ Ã…Ú5¸Þ¦³ÒM7âHyèiûDW:Û­C´q<ì™Åih_;ÌuËSùQçØwu2ÆÊ©Ö{sòzuü]ŒTtÌ›îEGOnÂtB–ÓáK~ÜY÷4¤ÕéºöÜ´òŲŠuégXSÕìµ[d>è¥]N¼³u3&ô¾ÒsüdÿÝU§NkapDqªœR‡‰ce!™ænÞ³ë N<Ì«ýoaº8)î'ltïm*>³æJí­†QäâÕøæ÷ õ.+º}7Ý£AÅîEçÛ4\­@õ<êMÏOÔ:Ìbz¼e÷Ìvæcp4E9;YC˜ëX Ædw–¿´iW7–ºúOìºo¬!šÚ½á Þ†¹Læbf÷FµÝuWxsn+Ú¾'Þ5;ÐlÈW4 ¤›ÆJ§R÷R*¤µRR¡n•,…Z£ùÓO7¨¦v¿m¯(ëûYp›‚ êzÝôãº#²y·yˆGðפœ(ZçÉë_{´»ûÊãóŸúì'KøTº-c·Eúoöþðÿö_£Þ|§Ê Èž5+UÕ¯Ôƒ¢Üc]ï6¯P5âœ?êsåè‹-BÐm±ÆMf0[@D''ɘˆòaÀk}wælBÌeø?cû?#1HºDÇàÎÜ]¥l—½¼´biSp\†éAN'>Þ:ˆXÕ|Å£AgÞ‚Žæ(¹5Ña½ÞÅ®Ó6÷4µ4 Û¾ŒØÎÅmlâïÉI6Õõ~:Œ}¨ØÔïŒ=ëíá{Ü÷šƒYŸ>”aIyŒ¾îq”Æ =J¨Œˆw4¶èB÷8®' Û^¤æ“›s:‰µì~ã6÷•††“Ð «ÝÅšá$ÓZNàõôÁ×dß”#ÌBòIÀAgbsj÷iÁqÇžNÖÓ›Tí˜RÅ@tŽk†,«\7uBék–Í€ÃÓõ0¼IK»‡]…°¼pÓÖ ¹³Â’dȯ´ëÞMàfCb»çÖG÷¿lF6õzøôš£9-F&«¡}?¢¡ZT¬&§ª†¼¬‹í’7Kw=¼Y×¾Oí|£EFJ×þߨ}Záíúîe±së¦;îD~˜š)Q°Œ›#Y.p0öý1G@ÍÊóDÃ_ºÍ©±Ð‹h/ ^¯«1ƒ›^ÅÅóÖÈŽ;)]7ß}¿¹cÇ‚ç]¼CpÄ\ï€' ™î“â=Äí˜ô}¸ùGgù‡ÿÈô õçß–¯[¸ûØ;¼kyêòË?y¹óÉà"âWDW…Z ¥îñÓ]J¾À¹-5J>4²Ri°<ØÜÝð¾Ot­s´=•ÉEÄbunE1§…aЖØÎz­mª•©¿wÓSšö9å—ç»”=`ÅX¨bÑ›b~×}ÊÌŒ!¾–¡•›ztÀp}ç+‡ö Æ€]ëMžtªMuL]n¯]r%£xvûÊN“žþd«…d*wßv²˜ºa¿©æ†Ôe² O×!Ó]áü€{«;Ñ|ߘƒ˜~Ì=ó9/„¼û9‰é¸OCCº—{7¯èE¯¯>:!­šd§‡R¸ÎÐ6Ç«NÄs¾MÿGÌ$'V¨©,sbÏiÖ“G[[“ii6›]Þ=¨«›šóÐÌwÝp6éOwsF¦’ÚXØjêÑ>TFôäqÁÐ1Ëé®ÞšÒbD(µiÔuží`s±Iís.es±ûRÔrØ-ç¸s%–ÕÈlÙšGkÊBßˉ¤.·f»O·9Zv|7py>ò£§ ÌwÚõÙ^Žýýdûtg‘”=r¶Ú¾¿Øþ8×ᾦF?!CJ4DÉx/ª#Y­sÛ1tø.´FVÜ+Ô mðóT½Gq¯oSYQq8u¹÷ Õíð2ãÂŽX¾Dðwqú!œTª^A>#ð‰Oí>úÛÿy÷‰ó÷Ü–®Ÿ8‡ÔZÿ¶¼ÐõüÒßQâÍNt÷k+ïãõ’º\S×gÄØDúäÈJ­¨o¢uf]/˜¶_Fªínm PÓù–Þñ›‡j¦%n„tII2ŠgØigzél{@ßvˆ>Œ}““fgØÉ3Ò_g[S³Úµ­“}¦!®«EMÎæØU ¶¶¢/¡MòµÚ}d¿ÛÛyÈÉ9ºÉ¹0Vµ!M=·=Ú^;¸VØ×Ãhʪé|gçwú‡oœ‹nßÛ·Z“+Æ’ï;ûsC…ŒÔèm­²ìÛ÷hÞ¶×:ØŠhêj[9 ñÙz(¢¸rÆ^¨Ü#ì.´é)ë tùº¡®¨Vòa"O¯ãÎõ°¢z@ä=T?JµÕ2œ¿C>üð÷kðéìkÿøÏçâg¾y[¶náî¿%ÇîÓàŸUÍ^¸Fc¥¤…œ›vÚéé8SÝঊœïZUÓw_"7T›šÜªå`ûàdÝp·AÔ®™Õ™çºFµK™ ¦=µÄÌe0¢Õ jŒãáÙ§|ƒ¼rûk FöYÆ$Ñ™ÑÙ&ƒ#T¬YXNŒ! Š_£í”£=l6Öá[WŸOìH½´‡‡Kc§ì}ƒ>ÅÓbq€ÝSmr7r·Oºžöezk¿18¾ÛFšÍ¦[,:Ò …ë2¦/îZÞ‰¶T³W4#5†5‹bƒyW‹í)bjä=jƒëÚŠ~NV×ó‰)I´ nk2|'™Îml¢+æ!Ý!üžpÖaážuê%nžÌÅÐßs³kÛÉc2ël ³ž®‡$*.ÃÓZl•P:ÉÍÞóz3â;¼¶VˆŒÜ,+ÛéHÀ*¶>q2à5ctc qKˆógv~Vĺfºšv8ǶÎöúÕlI3ûVß|¶{n¸;o$±¸@yjlù æ¢fÖ™"³š_~]­Øš/¿˜-n6«Ó5· ±{ËË·îä;7Oª5(ÉÜyéÍŸZpÇÖDßä_±¯~&“P-„±m~ Ùˆu5ØzÍXÝÞ5ï!ÊDaK /q“¢› *‘Z^"ë{„iÿ*¥kn0‚ž„Ô$©¹^ãæágOɲîP–¿òh{qÿÉÙOyÿo ô-Üý·vd× N/¾_ü?îSîƒdˆRsK‚PG#FÈ‘õæºa½R =¤º=–ÓÑ =‹¸”e@ÎÁÒ~7 b)5ó…j˜cBæþd_üX†ÉU­cŸF·L ’K¶CS³MÌÝBÑŒ3¢A¦ÉÆc“¯Ži1®£€õf¡ÿÿÐahû=uÄ£l¹*Ãjó˜Œä†e¦ØyËlP´4öuM£8w¿ó‡Ía.'û9û;=µ¨®ƒðttj›ALL›Ú÷ùõ$›ÍpÅÊeLƒÉ æº%Ù²¶Ã€±éq¦æFÖM$Pûìúκ“üÉ¿{ÊÙötÔSèiLg?o•;Ù4R²zÂSßAOàr÷¿å/Î_ÿ×~þ¸qnÛ"ý·rlß}Ý—I_:_ÞU•ŸêÂLÑ § %´dJNˆ_qå%¹nA•÷ÛÃÓX¸ÅŒ!ŠY+ú0âõªAÍ’Gñ¨q°sKÙ¾!ÃI¦=,¢ƒˆf&l$ ~5#ƒU³²§’ î, §PçG,¡ÚÄÙc{ „ßX”`'XuC?v³²˜CXý ÜÇÉ>³ºö°¬¶7-‹= »F77£·.íJ=æ3 UM|iÓŽéG¶¹±²¹¹© ÷6L.½ž¤V¥Á)À¸r"=«]ÊÖaÍ:¤K}wÚû‘ž’%ðô/a@¦ÅtøŽ«Å-V7ør¢ kˆŽã2â9u˜;Iùª2 zu š­Ý5ÍÈh=ˆ£vÉO¤¾|÷RÏæÆ‚$¤³éÀžKV™ÕäHÉÖÅôª]Ób ‘›­ß=Ø-Fv2½<åÐv_¬–ëî6C7¯'f:ÉBM0Mr‰vÏÚg¶'¾ø;Ëïï™f·é]ûoÙš×j.ƒNÌôdoÇXÞ]ά¡5¹X7ˆ)ˈ„í¼ŽŒ•“0•jDoXÊj„GãeèdÍvMÛÝ{©çø°Ézvã PG匚ÞkÍ9O¨å%*+Z«™Çœã¹BÃëÄ|Àù a‹ÖWpìÑò)÷žRyöhûñöwLŸø#¿é¶LÝî¤ÿ¶¿èõ÷ûo/ñ‡>­õ#¿]õª™xøBZ®(Zɇ'P^GCFø¾¶·-æòc* F ±Ž9/ ¶*–ŠåìÁ)ÁÂ-lK¶‚Z mm²”“8`“ðˆ³OolšR›¾’¤Ý£?w';ml÷Øs£ªæxô¼ÖAäÁö…¾ïgË R¡æWmç0¹¹™{È„…Ûë.à:Ë×*ÛŒ‡26¹Šo¸;3›Ê½Áë¢mǫά[“A£k»\ó<œ0-¶ì­Åô§V´œM)Çœî:ä\•ñsýzõI:é¨O«ñæÄ¼3¯Mc}L›úÑ>Ý›Q@å$üã4:ôÁi²'•¶“îR;ª¹}Bãû=ÙßëPx±½·‘ÔJnŸoГBÒwÑFŒfºåžr¦§¡*:véÔ¥¡}fÞ®C¶¢æû½ÚóÓ;¡/žD¾ú¡oÚÊ!—§›4ekÔ¼lú°ŒŒp5ÿ5…JcTÇÅFHÔ‹ÃaììË:b´#nÈêDÚ{Ц¶³ÅwÚ¾y ­ÑðÒš¿m¿û¸&ã7XvZÚ5Sm<„*må0ÙÊ©Lv^{Èá)²kZ·¢©gˆ;à¹ÃZnÛéÊá|Ä_¼O¾ÆNód§¨«Høp’9Í&[©‡7H¼O»Ïü?_.¾íÑm‰º=ôïÄ‹ž}âwÿó½gEnÐrF®;Йß|±u¢nà'ò•©o nFœ´}ª$˜R† •7 ?vÊœÎ*øÓ½ˆ{*RÁÈCn컪ô+ôµCÎÓ‰Ìg±"¬c­{Ž2ŸbÓVêr:tÜjû·.9r6uövMÆë®“Ñ$h%˜¹Ej öÕ~i?ïìµ²êÄ T÷ ï‰Wnn¯Ÿ ,ôvcžŽµug´öÞ£Z“0¹1Ý$<ªMNT›0¸³[N–“ëdûåÕ“d{±½¸—¾ÀÒV§…õ+‹¿œ|&~ÃÑ*´Ëkjm°*')QÈŽî:ènÊÒã8-·X î-ŒBãvös'Æ8=lDR3Àq³e[°…sâЛœ“ûDd¤.uÓµÕGÏ=vódU×d‰}'í¼ÅXÌùæä5l¯Z­X¯F‚ëžå=ò²{‡«5$«! “%ÊaQ‘=Ù˜/›<,²’h…tYS»ìÛëºÙ¼’Éœ¦±Öê)lÞvåncŵ'ˆ…æÚ–€éÜHg{û7¤ÃØ®áðÎ5íõÚ?8ÜnÓs¸½Ïx › ¦ ™&\¸ùCHñÈœ™/_¡ÈÔV¼¤¼¼ÄÕK$Ÿ· ¯L›-nºGÍ WáÂûÔpC?òÈßý†¿|öÓžþ¤Û}{ü»‡¿@¦ÿ•úäO¾J¹û™në(Ë©çˆaŸ”"R’êkDòÐÛáÂ5©í”kiE«ï±¨Í‘©Ç_V=VmZ$[1X­H–nrì"ÆcÈ28ý>=® æ¡K/]-–Æfï5EC/NL ¶/¶÷ëÂIàI×ZíZ{¡­)¦}u¸þÕ“›#ô~mþß–¡î¬Y:Õ'»>q.ï#YSáW#Wž DÄ“_™´,½°É>’tôÆÎ§Æá´†k¼ÚwImýá»Dîæ$DÅP‹,ãóktRJœÌ3ÎE¼¿&ç—T™qRÈUy´ËWê·¤ñó^G}s:‘rjÄoÊD•›ï“²ßï¾ú;…ÿÐ?÷GoKÒíñS¤Û@ýÓ>[Ó½ÂÍ÷_gæo¨ÁÃ(yC‰¬Õ™š® nKlÐÐíMbc;Êܾ6-žÒÌJúC_ÍÖ¯ö/ºvBÛ—Á0ê¨ëØMNÒ#«™£Ôݘlº¼ÄiÛ V1©Á£y±‡‡í¯³ I’XÑWó~î„«N+6Å;7<ÇK¦"b;<‡3T/dåÚþûÆd©í©k'&ùAØr]Ûõ²i줳âÒd7rh=±Y,ýZs°r夲¬âbŠ·‰:™Ã–ÔæLսɻ‰JRÚ{\ Òw&éª'zë Ò z3s„n{ãc†ÅV,­9êÉPn¬P¹aÐ"Ö”õÀ£2À ø>̃ÔÖ-,ûçåäÄX›8K“•ÝßÜ ÛÞ ¡ÃC¼¿çwI`±¼ç`Ÿm‡‰»é‹³ µ[}öigŸ£h“5Q†|‘j«òç'Í…ûôî™Ý‘µï`W„Í(®ß'h»à°±ïVZýb\‹þû²…uùXxˆ9èuýy×Í÷æzyÙôêb|˜™SJ{"}ÕQqþâ⺮èü ¥È—Èæ5ÄMÍ{|¢B*ÞejºF¦{¶WŽÓ‚mÓ}‰ÈúÅGrþÕ?¸ûÆü9ÿ©·òªÛã+g'}zÌþm¿?­âŸü­[Ê´Ãm®¨åWîãgGõç”iþ‚ÊŽ\ÌãDa3¼£­HS¨|ûÂm¯ÉÐÕö¯n;Gí'¬ØÎîec{m{tIV÷ïZQ¦qU“>ÒÁþ{—àœæPË. æk޶†˜6TÍI­ÐÎç˜"5Yë’Ó\—ùä÷÷Éd7HG;Çd“'¬k9 Nè{ÕZ¤Ü„®CNηÂ)6Éõ$%õÃo¹KåÔµ1ý|¬Ya SnÍCɃܓ,°š_r7¢é\X±/nHŸRwW³B{SYlº+ÖeC2ê2Š:œ$x™ëÜäaÚ™d©“ÊÌk».í:¤uár',íýc)wíu·ˆuÛ¶"9<³B›5¨Öá¡Íå סšÁLŽmÚ>F”.'Q”:V)ÅW8çÇïÅàé¾jÈÝg|j†'ø +ÈW­Ù gepÅ ©÷0;3‘fR̹,9Ó[›Îº;¢…sk¤·Ã H¦·®íüº)‘‘AÝËU›ÌÅ oŽ– ‡Àû{H ¤— Vw†8ß KÊ kR\Õc£¶à¼¶¯¢óЇw;dw\vT÷!Âå¨fªì á=âúÄ|…z‡ú„Û>Àm?B)+º‚– >,Ôש‡·…×~ÃïÞþ¤ÿöÄ]ÞV¢Ûã+·H‹Àæ«ÿè¯"χotŽT JZZîãt=§†èrãq’©¡÷ÃÎÂ ÂÆ&Í©Á Å l'†•îf)g{Ìb,ðbVjžnìÁaªZN’©LN“‹ínÓpŒÊ:d(j‘“É`ßÚíHu¦ª”®×ìAëHY*Æj×8ä.°¤fj’z€C‡%Óhb0©‰SXÍï¼ï£ß¼˜[[ÀØ^¿küî„eçPÔ~ÖöåÒeJ»öÎíŒë®éî¶•©Ã–æf嬢ö=l\L&fO<´õQÏ]ǵSÛÍV[ÔÜàëj×¥#.ÅV‡ëaCIO^3öq>¹îݦ‡”ä‹#5«Öjö¨i–¡å$æ4dàfîºOt¼jMÝzb媆ÕÍȵvó0€éYȇ½AÝœ°Ï1 {‡iÍ¡·I“ªa:åÜ}ò1©b|#ŠÓ½É;ÑÐøÁþ¿›ÆÄ[» Î_†Ä©Ø{{mg¨¿hçm/—¶kÛvïUãldNnÞ·USÊVÌŽ·) r Ä§Ä›Ø¢/MVÖ-S‹‘I})Ê1P¥îg–›»ä|Û0¹÷›)IÝ!³fn–¶²:9=iMÌ8)„¶ O_F‚§º×È$Öý~¨÷}›¯þcßî?ñ;×m º=¾â‹4€„ר}êßû§Ü¤°¤çT¿¹PË j®ÔÍÑ™š7èt‰è‡)¹íyBXYEâz’)ì…qˆyrW“9Ë»µ½d´‡Yßɪ‘±J°bX{áØ0¶CÑ`nVàù æÄkp7íY]b›ìªí¿zL¥÷íÇD‡ãVì‹ÙNÉ#%*Õñ°/}?j¥Kbº5hß«:3-™º<ÇöÆÝ%K-H¢»¦å<¢;£Ÿê2R™ÔÂ(êdÓš51k'’Ì Åö¬=£¹cÃjD(o»ßTÍ+½O³6}ë4Øõ¥yàÍ9ªö¢c¤ß´k1žæ/Îôðt§­ÅöÏæÅžëH)«æÝ£M„6ñ»¾‡î×_†©Fî¾íJj“±·Æ¢ïuSçLN¬Y ÑÈi¼’Ú„Ym‹%Eél6÷ºhj1Õqèþ±f)¾´Ï$ í3½y]‘­Š^¶•R]U»î1»3)H!&‡”|b²cÞåÅÖS B;òûZ£Gƒ—`œµ¦MÍ4&­F¢3©Vé!!Fôši7£›06ß@^ÎYž"¦ë÷j'Þ­¶¦1ŸÌÜEëÝLPž’ê5µžQÜ„„—ˆ¦­Yw®ÏP÷Œìâ¶_Ûg¡E{¥5QÊ9¥ RV$}þ‘ÞÿÚÏn¿åÙOv~é÷Ü–ŸÛã+~'ýÁBý0Éæ«¿'¿üÏ¿ÊíÊgT*š§¤÷[Hœ×fŽ@¢à¨åq/¨µݲJ8yF}cÚvFt0RÁºú2 òn˜ €¡~<àëâ{RT×PYíè¦ î+¶#ëI‹¸möI¦“Y´ŽìcqÆô5²ÖíûMo±0Žn'ÚwÓ’FZÑ‘PÓsŸuh¤ë‰¡HŸ&Ž!m…˜dìÙ0Î$Œ°Ød^ö&㲟©©M‹9YFu'¾•ÓZØnâlëü¸žÅБ‰ÂI¢’5-b7™qŒër(c¼[]xƒµ±Ä¦¾ûÇä>í¬'ûÔ.Ûµ†o2º¹¼u4àè·mE,rÒõÆZÅùANRÓ;âšflüN|ê+†é»<¬;ûº¥3úë‰_wfÁÙ¯uOò2½vgªW?£b« Ó…§ÃplëÎjÚýíoÆT/2ö÷akMV±‘Gÿõ<îYµÕP^Úw³Ê˜n{ ŒØwGíÞCšªÁò}â-ó»™¶\På ÉBzv Þ?ZÕ:;·cÜlµÏÔP7V=Gë„nàý«dy‚ŸŸ‘¹‹Ÿ.ñÛs(aeϘÂÊ„„3¤&œxª/ˆ®„ù.Iw„ôH}òhþØoúíÓÇÿãßx[vn“EÀÍy©áÞçÓûö2¯»ÏH)èPU=YœNT¹Aòq;rAA%ŸÈŠ’1ZK1 ˆ=D%· ýhõigɸ¾›¯lÒÙŽ\ëÎÎ-2©4¡ðN®ó©½^ÓÔ4B5:#~ép©í­µÚ¾p¶"jCîsg3{‹3´Ä­ÎÐîYÒÕ>çFÁõeüyO*ò'ä?1²ÐQ¯\ÁÙT.ÑBA$¥3º½…'t9ZÏ?·Å&þÎþîçÜ'ï`†!5DGè¦.2 ±t5”íæ;,îm·Þ¹ùd­QËIC¬È阊WËïìøZÚç$Îþ¾±ÿãÚ¦PÝ÷"µ¢¾ØÔªÙXÐéØ6 • ó >yúMÞ¥Áör°koüW‡¿v¶f×ɸEA²XC\üXtŸÍÅî4®B£Û9–èpë51^Sn®› Ùd+°žrµ‘¯ê—¢¸p†ßrM>å "¯0] ÓŽRîPYPÞEÒSŠû!8\}ŒpC•¯·£Ä€Ëßû¨úðîô“þÊgܽ_þçoKÎíñcºH·ýç×É•ò2½üç§ûßXUIiEð¸Ü|stˆì(©âæ-R6ø)’¨‹ÃùŠHm;åY–êØ9÷©¬ÇÓus§3Çdœ=´zjS)#Þ²[Vsüri7ÔuÈc$ ¹SŸ; ¼XbW‡Ôƒ0±b/­öFàS|bcz ~8 … Ÿ¿Üð>ÚŸNcÜ“­ªÁ¬ }•!¡êdªZ†Yw»R±}y·ÙìSm¦,ùì;|ßãm‡~l” .îM’/@ÖQ K¿.}‡ÇT('™×GYhL÷6ÆYÃa¯a‚cÑ(Øû²=wîLxk`ºÙM5RYÕAô:„0 P5kÖÎÐï êb“¦rе¼‚íÈPÅÌY:;ÉPÉöìrÓ þâmÅ £¹€v?ù5d]½°ZSd®mÝ:·— úx9‘¹ùq½5_¥šéˆ5ÝŠ´Ú9¥:ì8eÓî»N g¶ïNc«%ª™vÞwRš{L“’ÕãtF5PépE¾jï{Ú™¦»ïÕùïeFäœRÛ²)*µ^#õUÄO¨¼Àíîá§-OœPò‚®çdvèäHéïRb ×J¦º/²¾ü£ÍkÿØš¿þ{¾]ÃÃt[nn¿‘ã+R5ïÞø5rÖì×/ý¾»2Í/Pmxfb‹†ZS+ªµÀtÎ4? ïßo?»­ÔRŽ“G'™h¹ÏÞl«R<­69:3ºðÝk7Þ¹X¨ÇaßH=ZZ R4S~ÙÛôdºÜ\†”èÈ>5·(opzOž¢ï"mâ˜vö|]lÙµxF°¸Ì٠ǥ=u²ŽÚÏl†E¥ÚŒ¤Ôo€Ø†¹'*õ È únÎ"Æ–M'NUbyg@çðaî_¥‡›xKɲ]â1,¢žX€&3Ѱâ’;«þÄw¹‡aH°IØ>×ºŽÆ¤$êuLb‚ÙdFKƒêÐu<ð{À„롦)/›bÍŒ¦ÈÈÔ>’Èl·¯&¯ÃˆX5Œã£™Ù4V]zׄT†}¾ò«lL¸€õÚàq†õf5‡-q'и5aÙ$SÉѺ¥n‰f›Ù%p׃é_ p~h滽ªžX¬º0HǦCMól;ñždo©³ó*Ô<às'kö‚nçäŒÈV¥ýüÆ7©Suº¶ ®úa²{†‹‘ë麽˦Ù|ö´/)j»Éë*¸é92Í”$ä\˜Ï6¬W¸ê7Pï nnò«2#õ%¤wpåŒEa¾%â«’âKKÝzŠºÏ=ª.¿ñ;~•Þÿ•î¶ÌÜ?®&éã;ÿ»°òÖ97å¥èkߘ¸éä¥í­® ¬‡ˆ“+dþ0¥:D¯@•-¹‚/Gßä#\šdè,å(g ­èVŠÝxÃö]É‚::ƒ¤»Ú&ÞÚG]†Q‰žLT„ãl2ÃR¸úT^­hVóÜÎ2Ò»ŽùÁ¦™Ì!ì$о[ƒ–“ì[-î«“™MX“Ðe]}ÿ‡>tv¹X£ÓÍ^ŽÙÉ:˜×Ýo»Ú´Ê•©©ŸïžÑ'®c¹ mêÑEÍvÕ9ñAënmi×±›ÁxÓpGkÔ$>ekLlƒµS‡é»\-ŽÏ&­'œÓ}´`“¾®8—Xó×íGe¶÷Øä÷ ³ž°ë{Ò'»ø.”:´ê=ÈâÈÎï\‚2øñÚ\ÞŒ£€·ÈVkXŠ5ùÆHlö³rc÷†ŽxͲ6†{0”£z“šÜ/ì¬ù0˜ÙŸX¦æ4ôîyoç¨MNX³¹2Q«zÈó&#tÁ „dL¼ùòp™käEOÒæ\4o/éÖkÖçï“^Bº©½ŒanèL²I¸@t¥¸d±›2)¢‰t¸¤ppyA©[¼÷„³ %E8<¡¸3j](̨T´*Ž;0ïÑyB×w@ÞyüâïÚ|Ã_ûù²û¦/Ü–˜ÛãÇm‘ð?û¿–õ^OûÿzÁí~ jñ‹½*8´Î¬/3e¹bsYÈk"/dÝ îšâ nÓ¦dİà†¸Ç÷¡#¥'Ùƒ¯‡h‡W­;›{±Ü=Ưï³y‹ÉMú$YN2˜±ÉÇc¼ûwK4„`j…6Yáöö°?Jµº.Öþø8½›„ÇwòN"uíá b–ÝŸÜÛ¸v¢š™´tf¸š&]Ý ÇQaíáaèfË4Òº g5»KoÞêÒ×¶ßv: ò^°z¼d5u×ak œ±ugžÌ'у.8Ðì¬ &ïpxéÉWf#ÚI[, Åè²7餽îùÝ›§îR^WiìnƒÓÄlƒo»çÜ}´iò–îc\ÃØÃÕ0ŠHéÒ¾gîR™®µ¶‰´¨ISzÀ…=ÐzJ†tX¸ŒßíN ú>x«Ifº–5鬓—Žk¾9%c­ºÎ¸¶]ý€+£Mò¬î$`¤Œ01رë’ûŸ1 .·PqÏë®ax;çî™}âÅÝ¥U>ËNZKåÞ¦/wÁ} 5(]NÈ}Þ·xÅ*û½³Ø58Íc˜G7ÆXGXJIÇL‹£ Ö*G`¥Cn¡¥W«õ刭uDGúypüùð'´ë¿`·3B\6‚£s±3ÌܦNf|â[1*¶×ÎÑ4ÊÖDÅn95øºÞØgæQëØ0Äᯠ™Çûqád-d{àbr½2xÝû!iT#(æÃpóKÙ1¨ß™'~Ò®‡q@ÒÁé©­>p ¾¢sÅOà§s¤¾F¹©¬ûÇäý ÒÞöÏç¶ÊpqY3Û­—R‘pÓ:›²¥qÁ!ù ?] [ÅO78·myÖi!Þû©;× ï7ùCÝã¦{äõ%yyë‘ÞýÆÿv÷™üY²ûæÏß–•Ûã'T‘ЋŸó=’¯JÚÿ9Âù׿µPý9ù° z KÆMç”R()âæ™2.äJ–;PmzqíA :¦©pŽÐI.Þ’€’ynç:àMõc§ÝéÊvrG»Â®;v£Pi®[“‘ÄN‡Y7:é;>ìaŽV§ö¬¶¯#YêQhº.¹‹÷cÞÉÞ·žLÍq{ܾ?ï d§'Mƒ˜â•M„¶ †—²Ê€êEšGs—4‰]ÏZǤÖs—Sgé«…TÈ[ƒ>moŸ¬±ê!!Õvëjð|öc’Õþ¹v©œ]—®!µ· cå ±]§n¨"œ¡“k!'¿;ÜÛ¯Þ~G· µû­lÚÃYÁˇ±ã=4W¼d7ˆFcFï‡_{gX—Np³©µ‡Hˆ¤øÉ pó¶Ç"é—ÅvÙ:Ûßí&>'{O̪ ¦K›Š;SÚlI“™ë¸n"ã½:mÜ¿ƒrcZíngÚ¥]fÔ¬A=n*x'-æ3:Âüi¨¯Cq”ˆû—”¶Þ1¯o6í1$¤lZ|jZ!Ìâ Ô3ÔoаÅÏg¨k©;EΟñóœ/h‰Ôr † ò’’j\¸‡ä·prÃz-ß Oó§~÷¯ß|üü«ÇÜÕÛãöø‰V¤ÜÅÿäûÈïlÒõ÷¿=ÿI¢_¶èq¾²®‚› ΟVœ+”¼#¥¿£Æg”ZñçmTíÁ~Ú‘²íÖ&”|9bˆÎv‡F±.jòÚ8“ñ ÃZ±»ŒUÛ5OgV3Vƒ“»5¤åÜv­hw*“¾ÇdLhЬÁ7ˆ¶Ñ«ka1HA´Œbs +¶OÖ$FJQ©SÜ të ›éÊ1ü¢;¯u[Eµ}|ߦ®-–¡aîóT‡}h5òWO-Ë¥I˜Š4ËIuæ¶eÉHµ›Ì”ñY»hf>Øtfxæd=°´};Ýö]y÷ÓŽvÁ‹œd#«qj3 ~°–ÓbŸÐîÃî»änj÷IŒ±9Ìrûù*Æ ïе]Ÿ@Û÷F+~Çõ……S8ߠݸèb†1,Æ;0x¹G|º™¨ÈB Á¤HÅo,‹­6æ7™-«¡P9¬\Fc[N$ZnÓÎyrFöŠžõ}¡,µÅGv„gj¯éÒЖ;_‘ù.:}„ÌŠ¦ä›Ï_¾G¼.mÒ·ïW5OúNV¬ª*¢¿)hð”rÑH`aå]Èvd(T\p„Ë3D·”ÃÖ«·Ÿ©þ*—8ÿ*U/qzA)ÏH)=rç?ã»wßü—–»üÖ¸-%·ÇOø"Ý õ·}¯”åoþB¥~}qžÂJBÕãdFå@&R–e9ÃO ‚Î3y™ðîuªFrL8ÙáêJ> ®ÂšÑš‘I©º¡h:&íä<ŒBj&0ô ©³HÝH•rVäzÜeí:`ÛG÷¨É£ ¬k‰ÍαØä£Vlj·×4NJ#â°k Œ $öpMýÏið©3fo5ïëÑè ¶Ï6 {›¤£M…5¶Â™ÌWÜÙ z3[9 È´7²\ZÁ¢áºA‰íÀK»[í†Å]MF‡k°è°t—>ÙÄšd„A”2RœÔÒ™Jħe¼•áL‡^&;ÏÎ-0£¼7ãéÊr¥}kÆÊ‰”lb·5‡#êpëÚqŒÍÜMrè÷[®lyq™]sÅ2ú†Â6fþdÅËØóéĬ¤“û=™ˆ¡!XÀ‡Z3tô€?ÑŠ­9ã0·Y£¶ŒwýŒžµÏáð#…ô¬6I—™Â@[TkZóUqg©ŽzX >§ÜµÌ#Õi}n;Þ0¤R¦i²'sãŠ)&³éÚ`ÙÁ:ˆAgM‚ØîÚ[¶vƒè­è!öP·}`§,fU*V ½Aàëf+=ÇÙ˜ä˜ÇyIÕº™LOXê‘r¢×®«5Û‹×.ê.au$’õ½lßM«4™W±LfJ»V> r^×uË2Ì,zh…›¾b†,µ­/c´UQÚï }ŠtMfÕMmÜܸ =‰+®ÖÔašÒ­6Å m¢·iºCñ–Kí^=ÉI·û Ô±ûvƧ¨=tnéN}º×‘i¡ _ÔØÖvun¯ÝwÛ§ pêˆuÆFwB|³?/a€øÙQ×Êõg½íç'˜ÏÌňÞÜËb7 ¹|åÄäºBÌÇ5•nÚþÙMm wÓhjtê‰W¥Éþê9‡æ¸QÔGjZ©ÛW˜Ï„éü’9Ü¡Æ÷H7?BZ·ñˆ %ž‘õsíÆ.ïQ_zäîü=vûÍ?üm²û–¼-·Çm‘þï+ÔÛϼÉôéÿ:¾øS÷jÊ?YÝ:Ï””(¬”¼Å1ÁôÑ©‰º¾E-‚Ƚ–\Ãq7d­T]Í4BPWñz†–µM¯ë*ëѶ±&i¼Ú”Œ¢Eɹ¶i¤gJ[ï€!¨ïV¥¥bu¢ÑÑ‚ÔàØãη[‡¤xj>Am0gÅ ‹ 4þ(õYN¬6¥½ºÎ¸Hƒ½k:Ñ3ìC{ìlôã<™v§'+’%,ì.¹Á<Å»kšëF!ëðvîLÞRÅnF RF6p‡ë‹YAª·={áyö“=ÑÌÏöÚëIòIN²ö‚_ ½'lu¶ºÜ4H9/±ž˜Â¨™vøy$§aSa‡ß{ä©tKUiSg¥Mæ,'&3¦=?j°{š—ò’å;cêgkËÁˆ‰©eWÇ<ˆhëŒÉäi„qí½ ›Ô^lWkúúAêpãK¶víJˆuµ‚\,ÆYò”3Zª¬í'ð—ÖLÍá¬b¨ÅÎ>×óÄS‹€,{j\Ûµµ&C7ƪ÷¦ÄpÜ “ठâŸÌ8õ¨\ º£ø™êöøéŠà/À}ÌÌ`“âXÎoWX÷ 3.lIû·ù°>Û|ÝýöðÑßöû¿B"nÛ"ý^¨7Ÿxê7ŸùîrýG¿Z«þ…,á›=) ~;#Õ“m‰éår¹ L‚P󄆌êD‰÷qºà|[òº°#î?Œc¢Ê•º©¸pN¥-j{ }s”ªÕ¬0O™ê‘WÛ‹Ar±MP}úR …èlgÇ'6eMnŒÉö¹F¨êÄœm×ZÚ4Çj0¦M(Žº_·OÇ"ÕÙèidïÒÓ¢¬¸–DáF¾¯ÔqN=°kÁs¢ê¤¦lqÆ _-zÐ˘Æú{d3ŒAª·iLO ©ðtíÌûKwÈÓ[ºWŽÃ;wí± õfxT—rÒ0ôz6fy4ô!m¸ Ðw}ržÓÚ^uìH1öÚ-iuHóŽò>ûÌbg÷ öÄœN ´ÏMŒxÖ¥j3у"œ¡$=ò´7ƒÅî‹~Wm+…ÔÃ@úkÉ@s:£ÝwùaG„,ÓÙ™O»ú€èŽt(¬ ùy#pÉÎ mËïnxâÇïVº­ˆ4q{¹zÑ,im àÏ25M ÓD ³Wwüê=Âk-2²Nè.#aO‰õpá5Dš÷i%’—Ä…3tz•*/¨õ€ê+”ü)ï|n{ÿþçÓg~àï—Í×é¶dÜÛkÝé7þw¿»ýäü‹—êáêfQ&j̈.ÈZ‘ýî.n{ŸâgÔ%Š¥%”t§-=Hu”TÉñÝ^“æsÔÍ8¿âý]¼(5jÔcH¼3s“°©lP.I9ZPÕfÿ‰¡¬F¢O1iìý={ëдªí~ûA›ÐrÏ'ôÆó#€@wkš‘I1S5örIc·«ÛVˆ¢M³Þ Ro“öô¦ÙP‚yØ•º7°#ìm;ÎPN†²0L=T†¿µsà_ޏÈÔù{uœÙ^ÏÝù$ «ÃòµOÂÚ“æc´›[׳cR¤nhÐó²oÿ^-9ªÃÙÒÝÕÎlêž`‰FÂ2+׿Mî´x6 w5"b:7ã»F®{g‹¼°¢Ë ¤k{ßÑH]ö÷¦ÙhæÑDƒÑûuLWÖ(öHHÛMçîk]ïi„uÔ­5V³5Öˆm.M†åg‰ÉŽô"ácû™<ò=.ÛTòþÝG»¯ûÏþ÷ÕÿÉ?s[*nÛ"ý7z„3}ÍŸø'ýÙW}©æ/~Wõ îŒÊ†p1ãï¾rï9Š !dÄ_ ³ D4¼þ“)Æ\~åŠ$¸!EG*¯‚¾jA¼ Nñˆ)6›Ð…'xmîf]Ê…íMÌÓ™u¸iСYK¶&áµp·±Ü’¥ÄHN¹»Š™‡·s£x×+ƒ?-¦Q²±ŒÍº´˜5iÀ…Lj.+žÝ~´ï6“€°7L·Ž$µ÷”Ìi*E+Ð…cÚT¶²nÄ‚yÇÇJ+0×Ü y ÚkËUÎñD/mæ*“‡Ùbc²Bh RîR+Û53›m¥¡š4ˆ­.Ïlÿ¬°Ù´>N6¶çݵÜãjç™z¼ihï/ÆÆ–Æ[œ¤¡%e1ba´BýÒÒÙl¢.¦IçÜd^}z¶‚Ý#ãAû×¶{íf5ËpìÒ©­\‡ÕC£ä2¾ñîä³ô4\h{öžÒV×ö»üÆ<åK;?6­¨â(IÚÊc‚ê·lw[<™›wŸS›åw­IJÝ6Ö¬BÙÉÎöøíŸSó§Ñå~ãb8XÔÉ!Á‘ јz¸ó$É”øç3™ˆ0!L¸íÌqìÙlþ¢PC¢H ÄLÊ{XÞ—W,êVˆÏÞÄ×gÎ^ÿ ¿{ówÕOpþó¾ÿ¶LÜ·p÷ßä!"ø{¿øOkzë¬ìÿ?RÊùתÜGÜLÍ—7QÒS¼ŸL#zEŽçä´EfÁ-±ipç-^ï!rF©Šwgä´Cü;mÒŽ:”\âÖ£×pÕ%)!´ýteD'+¨^ÛdÓã$ÅHVΦÚ.µÊ}¶Ô&±êL²OvÐÕŠ¼¬æ8jdªnXÑ‹QgqWs;d¬­x­u¤`å82Œ5bÓ%9ñŵ˜‚htèÔv°¥G ÆŽ:çA®“N ë²µ­)CâÕã«í’³]»ÔµÉqǪù†ËÁÎm5^š1I]l?jÌúxm9ÖOÇž+fóÎ ádçeŸY—È©í}žÓÇ÷t¨î¶6‰×±_ïiaãæ0§´nøbYÜ%“Ü>“bÉYjáºåè›Þý´kj “tR•M½r¢î¡+ÎÌЉgoÄAÐ}©'1Ÿâ[ˆ¿°5G¾CÚo¸yçö>{ ¤í© í:&;_ék#q¸5 á²‘o®A×#7 L‚„Ò:û^ÕµÌÔPqSjÍ` wQ½ƒ¨â¦Œ„KœW´^R–…’¿€›Ï)×/]Ñéž…á\=ò»}ßæÿÒOq÷ÅmbÕíñ•QßêQ€ûãã(OþƒoÛé÷þºi÷©_–—§d&”Š[S&O]f4<%—™šwäúÔˆF/`¾æ õ Ôš)é’œ_ nFãSŠ¿K™Îqñ˸ªdžStFh˜c¼¦msD«š0êºÉXºPgW#ý(m¯ªö`.“‚Ò¦Ñ\Ú³î˜÷œÛÿï$~n…+êæœJ¼$¦NüéQ“`¿ÿÔÚÔ TÚ›'µk»Ù¾Ó¬=ôÂv½]å¥M’eiÍB·—TK!ÓÎjî±Nü¹nSp…8f$›¬+Y-:ì(KhïIm$”¹M}«oö.¶k†ûⲜ4 XÖMSºGu²ÏÈØÎb±¡®ØnÚMÔ¢)%Û5J¦·¶½w¢5O! ²›Øô[,“ZAíìEÛOÓ“×.÷rÏ¡®Øä¯¶Ž IX˜ ½„p9¬U ál¾°Ý¼Bñ?YÓcGq'éiÕP‰¡2´•HãZ4¹L3yåÉ‹†HØ}(;+ðfÑÙ%g«¯tx‘ê‚J%. óWghu„ÍÈK4 “ƒ”®(ë†Ú(’ÓsÜôå‚"ïSâK¨¯…ª•5l!/Ý#Û„f&åÆ>³dô6}vc ÇD*mr6¹MŠÝùL ,4¦n¶¨I×#;;C¹‡/Ùª\´‚¯¶GO=7Û`ðE#×ÙïpÕ² ¸k#.m8‰Ù2b#¿ógÖy8¥¬xÚŽ½t6<^ÏÖ¨t£,¶».fi15v”ÅäGÆL/‡†DLVúT©gMÎ$´!ô½¬í•û$]h…F'šãÕΠê+³µZc‡c Y c›~5û¾Œaã¤C“(U Q™·Æ7¸1ïm[EhOõ2f½šWµ;!ËÕ8 r‚Ù½ÛÉkO;ÛP–k»½d˜i q]º'®#!ç j©Ôºg}rCº6ôȵ"œîMžÕík³Àˆšƒ‰ÜEäÄ%\x›ÃÕ_»“Y{oº©f5+Èò!R½"lÔ-ÔÒža2}Q¥VÁySÌwò>5îYj@cë"½ÜØGîá?þæOüŸþÕÛrp{Üé¿…:]qøâ?üûdùòën~ã—äõ$÷/‘²CçB*Wø²¥ÔD©ÇJZ¾„ww‰õ©ŠÊBÊõw©ËB‘=êPÏ ? Ä„è;3â3‰ÇhÙ2i¢øÌr“qIÑ]icƒ$Ð$c'«¡í-ç³Ñ–óÔ&©ÒµÀ¡±Á»¾Vº†Ø`Är"Ó*œÄW‰*íM"cWg#õ0dúØXêIHµM|raSX>yÿö¾´´@Œ-¬=ÛÂ8zÀDŸÞ´G[öÏx¢'Ç&iÛ]f#;õhÊ L¥5Ý‘¬ÔakZ\û22ª]0¯Æ‘èÕIZ¾O¢:¬_;YÏ[ÐJ\09k3Öݳ»Ä¿KhEy1Ô#fØLíóÎkƒÖ{–e‡Ë+múžï´‚—^ÀÔéÒ°-…£Â ,brclïÜ>‡íÎ$jÙ-c-‚ˆÍ lM£½BQÅO¥©ü¦™{pñ·¹C:¼Ãru {»Ž=¹ Óû¯æ¿Úë„Áê¦ÓO¼xðBê”wpþ11 Z<º‰Ç¼í.Ÿ“"8ݰ–=nó1¦úÜö{DU/ÿÍž éˤ´ÇMg( 9¨×äÃS\=<’‡÷ŸLù¯~¦l¾îp[ nÛôßîîC'½ÿùAzw¯¿;ètñ5%9Pi‹ÒJi•G’r®ø3Oq¢©”™ê&>Y‚Tß×öŒàcPHhpoÝ·÷–ÌÝ«ç]÷øN)CI³’Mâa5·µiè¬iRÊ•=Ôí÷Ö2Ì1¢YtŠi©Å"BöÅR,²ò˜€ÕƒK‚iÑl•ì:{NPÆž¼ë‰¥k£Í8Dº ×j²!iHG•6™:#Æê¸íéÎmæÿîÍeŒ±Ûe@éÞl1Wk’Ž4ݵb–âp‡Ë¾5B]ž—ÅôôÆð~8Ûuç³Ä‘0$|-êÔAvT_¨ÎlO'è¦5XRвEÂkäòŒœ2u…åù³¦°ÏÑoRâæŽH8òR[š×Ô3ÕÅUËt\Ø¢zôI[#,;(K£Qøæñˆ›É®$PYq³G}AU©ò:q™˜.â7"©_ɤå-´ÞG(Ôõ9¿÷Hƒ¾;}òüá#ø_ÿ0Ý–Ûãv’þ;|ä'ÿé7¥'¿õ7—Vçîüêx¨Ô¸ õ€îö¤5£% âÉSò‚ÔØrdªžA}lÉk¢îß&l•’Ù9”÷ÀEêÍCÄ]‘XQ¹CpOÉqK­[JN¸ðb$ÌÃ=¬ït“±uóSg6unÛ%Ö.åÊÃ[·±GŠÆ|íæÁ˜¿Vd;ŒÛÓ¶r'<™ÃVйn`ë€â»nWkKÛª§X-ÌBí=x›”°}¨ÎuÔ à0â ÙZ£p›s›¼¬Iépu2Ý®8ƒì»‘ŠŒøÈb{{F®5Ѥ>bµ½¶ÛÙŽÙŠµzƒá“æL œMKŽ%€!Í+¼d˜Ï¨××{ƒgÍN”Ô¤ïªC×#çé™íš×k›Ä»h×dûVä5ؾ:Ÿ@þr4k¿Ûb;nûygçPN,c»ÓÂÅ ‹²®{üÖx^ÙÁas!>° MñphŸoY,œå¢ÉÔôÜ;¿¦±ž)qFy‰jE¦ 7­ˆûIºfÈJ‘§ÔÃÔK˜¢/šC™ßA¨HÚSôa³õ’¼ŽÛ:dvHvˆsÈö#h}ŽD%Ý<†ÐÉk&Ë›„Êôú¯û}á#¿÷߸}ôß·Eú+íHï°¾ùÏýÒòý__õËœÛSR äˆ×,/êuw)‡gh¸&fGŽŠ 5R¢Põ1y=àÊn>ÒCòa ó‚VErAõ1Å_@LÔÀ¯”òž?ú¿Bw?û‡n÷·ÇÅÃÿD;a}ø¾k»û»¾w}ë7¯ÔœDw¿Ò‰âf¥æ…*‚zObRIk$¸n[)iC­[ÂtE­\W¤&ÔŸ‘ãC‰’¸ÍGIå*?ˆÎZÎyõ†*ç¸Or¯ãçÇ8pîÓhý„…œ^"^(‡Š›;xYÍt"S²M.Å<¬MžT’jtâ’ÙpªûjSfê$5{ý4ÌIzÈÔµÜ&ZÌ<¤†x#åcjAÉÛλçTcãã|dqÙ-Ô¯F Ó1išÜ#éÌ\râeÝwìÕF?1»Ð¾Gî;k± ‘¼˜œÌœ¹è°l)_ ^®í”kÓ!{C *ȾÕbl‘nnÅZl¢Ï4ëʸ4È»Þ~nï5ç6¥—3Ówomgml÷¼5ëX ö^€}¨C2’Ü<Á’ 1è1£Õ¢$Ç£Ö8»-…=º—•/¾Ñ›Ö|éaÌ’ÍeLƒ‘ìL:&Â+m-1oÛõ¢¤µMYd^Ô|‡ê3¬œ?£äVíeyÂòî[°1yV·I¨»KrÏ𡲼ó?Ý7XÄù ªì¨z†È‚–'¤t@õŒìö”¼RÓ»t‚ÍÇ×o”{¿þ»nó·Çí$ýcñ¨¾ü/üÓëõø+œû†oå0QÝÚöÇ1áÝ3ʲ'‘™ÃLÎWhu¤Rm>Y¯Ðrã-òrŽNˆå")ÜDMü‚ Ëc•÷PÞ`MœÞ€ÿ\›˜÷gLÓX¾DgKsíÂö¦ø1§Ô´ÁÝíK,^R°}­yz»©/Þ ögÝçY±]¸o¿³û‹Gƒ3ERMKÂðÞÆ&ßî±]-c¹Ì¶3=o§d“eϱÖͰPí¾ènc wo m[ëÔŠFZÛߟüð.´Ô% Ä%½ª¹iÅÉ$N¶»^—öߘ‡=jÀvÑÙÐçÙd[[¬QH®C,–m²4Ì$¤˜Å¨O­Ù96 ¶sŽnÑS¥Äµ¢0§¡g,­vÊ:Â0ÄÞ¯3Æy1/u=ùbûu'%‰ƒø&"Ëó¦YÞœY#ªR]s*›LÇ/‹5 fxãÍÔ¦Ý߈3L{´:rÚQü§Y :O$yF˜¾Žzáê/“©-îÔÙdn܈Íņ’ïP§k\ØRåZ R7¸©åwV¿£Ö™Ror@cl‚ìü””ßú!™‹nÞøg‡¾ò¯ÿþÛÇûíq[¤ùéþë—~ϯ¯"Eæó_îª'‘ÐXQö”º¡Ô+j: uK©{ÔÏ…êÔ<µ˜¤Ù!\AyNÍŽÄŠC¹Fë…KÄ?g]Ϙj¢Èq›QÞ@ÉÔ%Pêcüô¢=À-xƒ¢ˆ^ÒØ4‹Å>zŠË¤T.Pù`D¡i¤-M¾MÃ=¨BW›ð:C\O [ÚÏ®µý\Ÿvé:fmíî–ÖÉn}VÛ•çå$mÊ&ÊzÙ&¼¼´×›L[MjÍBÆ _l'Ý™å=§8¶Iw-Ã϶Қ‹dEzÒ W6-–4³Ý4üÈP }ðqÍù­ÃÌÒø®w„|ô¸Ö¶k?Ús:»Ž;˪6éQY ò·ým’±ó-æ.-z2f¸×á_î·¦±6þBñ ³PR=ZËÎ^Øß´N&œ%RT¶nGõ©ä§‡wžÃuÛ'ûn*SÍ,ššÀÌro[&¹z þp—× ­Pw pÒ3t~ÁºÜÇÏx¿R3¸Í%ñæŒåé_&¸=Þ>wõm¶w(é9i¿ÁŸ3•wpsĉ¶‚œfÂÙÜâf¥Ý9¾O^_âý†œß}¤ òðûCóÇþà¿rûX¿=n‹ô·#=%}éù;küÞoÎõk¾ÍÕÚ\£$⪧”Ⱥ‚Ë·YIu_f²8jµª|ƒ¤åe˿͊¸•*-u‹üê/Aù¦±·Š*a”/C9#T}0¿ML{R‚¯8y…X5¾@óÕ;¤|M–ºÑ–{½6瓸¶T²#»‚óÜÄ6…nSšÛTÛ=Å»ÈÚ=¼mìœ~²µÁ­Ž6ÍâG±Ê+Ì:XÄ=ÖÒ—VDÅt×Á˜Ô=CÍ#ºÐ fÎlÚ½·9Ž£ù_IÌ´¿µü?›Vym$¤dç,ÒÓ›ÄÉ•fz C1X¼Ú¾7ÕÖì¤bd;C$ŽyÕ]3=µ}½nm'ìëÕÜÇæ‘âV#¿' ïu'›|»5jŸì[÷$”’ssgËJ Š“ ë“=w¸é!αuéÔÄ´Á…;;òË7Y¯_4¢éÁÝÎxVô½¹¥9ih±·¼:AÉoàÖÄçUú!" "¯ûñ†3ÓåëÔRY_~)HWoGרØnSIuGÈÏ‘ð!bÚPÜÄ´½ÁI¤–KŠœ¡~ªh}Ázˆh}FØ>c½¾~„‚ð‹¾kúè¿ûÑWoŸe·Ç»ãÇ­Nú¯oQ½Eïüò?¡"ÏÓõ_¢Jù^•Ý7¡œ68IÔjTĵ@y­×èäÀOÔµàjFæÔ²!G‰Í:Ñùûd7SÊ uEtG^'\ØPë3ʺ"¡uõ@•™º¨¹2퀽"ë‚8OõGFXQTò’„­à¼4ÏnÀMÑ‚+íáv Þ,blä:´Ø}û-Ò Wo{Úî‹ÝµËÒÂLZÔ™Ôôg#sóÛ1cNhÎ&ìl6'£ðõøD‘á/­³é³m¯ÌºGUö(Hß T HfXrŒ·,çV‘K#G+Ú8\µÉ¾“ â¨K=š£ä:´Ò²ZˆIÚd6‚Õt’$å,‡äŠ·õ€š7#£Û)UÒb¡¾"3Hm¨€8¨R›Gz€T+µ|Xñ»-„¯2±rAç¯Â»‰àiÝP÷W¤'_ –¥ƒí ¹èÐð£áê¡0Uw„i‚I)šÍG Äô7í¨þª™k°¿¿‹h$ß,h Ôø•²À|>áÜCj8à&‡úKªФ„ð’y+8©þêîâÜuWH:²§Ä÷y îûõÁ/ùæOþg¿Ð?øµ9»}ŽÝ·“ôOˆc}“ý›¿æßNW?òq¿ýÔÏCg”wÑêÚÎÔÖ€+×ÔõÀ ^ï‘o2:=Aç3ò¨‘” []‰±’ë…-i¯‡]Ó½.ï¶âá›;ˆ¬?B©3Þ)ŸGd%g¡¤„Ÿ?Nâ^Þ?ÅòHÑÝ3Ö5µ)Ú B|mpx‰ñm‚ÑŠj³:nV˜Ýô أ³—1ƒÕ~§z“¹V²MÉÎàQÌæSÔ<¢Í‹ºäñš]ž„…K¨AÚ]ûÝm.{¾Aá=©+ד¼eóo¯oQœ¹»iù=›R=”î¢î¹e$§cvfJf×¹6W«š•ª™5nM Ý,šrÈÜâ\hÍÐzm¡œs¤’Ûµ4²_8ƒõ…IÓ°ÊA‘dMhyþÃ{œ¿¡”=ÈÎmɼ¤¤f' îç/È7™*÷Ò°~‰OÉ‹íø§Öu#›€­LÎ6ùÁâïÆ2ÞAåU’+¸zF<¼Ítîðþ9Ÿ³Æç„ 8_X35tŠ8ù2y=#¥zÃ4)¥”æ>Q9žàüÞ½ŠÎ[ªukDr{Ü韰ø—ÿŸŸý»ÿ”L×çZ_û9u=G}¢)ù ò34ì ­ªäå=tjL,õR½ƒÏïQuOIçÔ( ç;-y%ÅkœßÖ÷7¡ r~F™^Ã!ÅÏC¸ÄËj~ü†R=ZÞG–ýël§=â®É5AÝRr¦HÃZ«Å&Añ`Э…iT+¨Úw­¥í°ÃÙÒWAJ½E,Φ·­M"äÌУtÇ.Û£&c{W¬8¯;«íÈÖøîÎeR)ߣ Í6ô(—ζ?µ÷î°ÉšV8km0Û”ŽMþ2ͤƒ ¼$jÀÕØ~¾ë¯'¬¤›€n—Æz_„(H8_#ÜÌT°u€+Žs#šÑ y7)J¡Ní}ª 9·éÜ@ÖÒl`yâU9mÓ]¼éܲœT¤MAnsB`Šf¬a°¨ѨۆÆëVè'ß\ÉÔŠo5 òdSo1©Õöà]e»`ÉC'Þ©"f­™,bóïî©4Ò›:Œî‚M¼ó9)ïг”ë‚«Š;Sâµ6‡FóA‹Âœ[±+—6¾»z—”#^®›1‹³ëè<,3Å]7]¡–K\®T½¡º×¨²'ëSêsC¬Q èP´½Nñ u‡HFX@R·‹Èò¹~üƒ",KÁ³¶ˆK³ßì¦2Ù˜üÞC‰­™¨µù$ŸlòO¤ž£®àü þuÒrƒÎôUT÷¤ø˜ró•ÚV,Á#ú*iI$S½aq/Îqâ!<&é=‚?Çk"lî’òÚLà½ÔhVjå µžÓ5¼MðéÑtþÿ}ã_ú×ßôâö©t{ÜéÛãÿçÈ/þ˯_ßýßÿxçu/_õ­ZvdÝR⊺Ò\Ët]¨ñ²y‚×DÖJYöàR^BÝ!Ùƒ¿"5¯@h é)ä–QMÙ ²'å«Gg¡¬k„DÞ:R½¤÷yNɯ¢uAÉ$¹†4#î ­ï7·«2Šs*ȉÙc cl“kðÞ!9—¶?æ ê ¼Mƒl7­à8ߦíB#E+ôÞüÀ«MϤ–¢5ûögÝq ³ÓÌžcêTw×B[XRÄŒ6h óJ+2˪¨ ^rsì2­o¹öTŸ›Æd+9ইԜ(zžÁZ(kÄeG™oÚ9¦ ,Ï‘Í`´ç%I;ŸT›GºSJ*íµ|Þ’¨8‰hh>šï’R¥ò:µ<"^Ý´"j ŠÚõ_® Æ`O¡£¬†œìºkøðqð?„h%î9î¼ÅAÝœV³CU`Ý›ÓØÆ‚N’ÃÏÕ@®;ʲ!ø…"ŠÛNdw®„L:´~™’–v®nFŠ'–k¼»GqÑûh¹a‰/Q*•y›ð)D·§,<ÎUj½ -¾Ó ¶ËÿÕDQwïWü‡Ó+¿é·É|€q{ÜéÛãH±~ü[þÑúô?ý+ËTü_XKE¥ËrÝ‘ëJÙïÑ©¶Âœ-žHj.”ìPçQ2yy†x[Òú÷)ñ W/(ú‚²Ìøé’¼>Fó Lï#þ>5í)Q(õU•iº&î+±Ì-[®Ú´ë^£”çH]XkeF¡nYJež3±, ¶¼f”\¨¢¨/Ç4)Œx†om‡{U¬›µeŒ-Ö°Ú¦°XÚVRນ|ÐMX&,Þsè¢ûÞ·|lÊì t5ou .އÆPŽ{p(:•65[Ù#(l úOžÙ'ÔÝkd³ù¤.™x¸wn,”ú”Ì¡‹|G¹yŽn_€@˜î²ß¿Š×+Ô½O•…0Ý#­÷H‡÷šHzÙt‹¹Ñ åd’²dR2-ÍÎ3tw°ßw“—žxE (ÁL[ºyKí_¥ºk”«¦Ann´°´‚¯&Cƒ‰œ ²ÌÔÑé‚TâýW€gh¨¤*_ ëuÛY‡Îúö?£¹¶§ ÞO8¹!…„¯_…ú7Èòn^ý$E¯qëJ-;Ësæ)BžH¥B Hú~ªðÈ=øäç˜~ÖŸvÿwÿª›>zûй=n‹ôm‘þë<Òcâ»ÿÊÿ&_ýé¿WBü…ž;P”ìî-2iò¼@âKrïHµ1}K®L>¸ÆécÊáŒê/)‹@z‰Ÿ%í©®e–º…ò>²}@M_ÀÅK V¨1 "/ ¿ã91 Þ]P˜ô’5&æÍTOŠ7 7Mb´ BTMš³UZ`2+ÊClÄ­Ígz×Èj.-Ŧ„óÖLØÒ<ÒÅRÄl@µ¦…€s‰,µ­Ø?`Ú Å=Aّ׃Yœ5‹¹ŠPë áŒ"÷`ù2Aà6qgÔú²àõUò~F/Þ'¾HZ"rhï'l”T=¡Be¥N'Õ ^¾Œ«;ŠTüvC^•ä^aÚ8´,Äp\¡Dò!¯ˆH¼J‰<¨5?rw>þHÎ~éÿݽþ/ý^‘û·–Ûãö¸-Òÿ#ëÿé7Å÷Ë¿ÌÕ;¯Öݧ¿U¥XHÄ å õJ\®P±È£õ@*çq|‰Xï£~8k öõ)UŸ!rŸRÎ ÿ5¿¤È§ðþ1e¯pv¼ÞP׈÷#ÌžPöÔåKzƒ°Û—ÏB¥P‘xŽhD¦B©‘´(³WÊ\¨꣕W2µViNWR‰1°Ù(%.d7üÒ&ÆjûecH{pvga纅z ,'eG-/(¥éŒEœš–Ûi¯D w˜m¦ýnµ=mÕæ_= .Hs÷ ³Á÷€º™Z›B/›¼*¶\Ïà…r3#ó=Ôeà‚J¼Æ—BÈP~]ž“sn»wÓçÕöÆsÓ„¯K»†“¶‚]Ìžu= 77´¹Œi žR3EkK©ª‘ØØô¡é\šHp¹5NKcj—å Ñr¶2€×(áÓ4“×ï§N—øÍ%y¹ò‘ â_!ïnš©)‘oÞDܲ޴„«ÙV {¡ˆGÂ'Á{œûJNÔòaütŽB¥èŒ“ІÝñ;áâ»,‡œ¡åŠ¢‘â#n9PdzòYwö3¾Û]ü#ÿ7}åÿSÚsIoÛãö¸-ÒëPðßùKâ“ïøUÞ}éC*ŸøiÙ? ès¼+“ô>¾B©jAõÀz¸ jf’gÄ\ɲaVòIëÎ9Ô?7YÕ%¾¼CI•ê^ü1Xõ=¦³’<1Nˆ;§Æ÷)êqz ¦¦Ô&æÓß_@q,)·bkÍNGäÐ[ymç¡ÙLa, £øâqþ xÞü껃¦ 7ÏÞ§ì¢ KC’íåë¼÷ø­oéQiÆm^C ,ùm\xÚ ÷,”ƒPk¡ó/Ÿ Àâæ@&â§‘ä#/»+J½KM{”„÷©šÛê%•²fj¼¡êç‘5“맘¦JJWàž“Cú¬ßþýÒ?øUßáî|û_¼}jÜ·Çm‘þÛ{äD|ò[u}þÇ~iT>ñ¥tÃv{N‘—Ôu%V‡ÊŠF¡¤Báô^¶ä¼@y‰º» ÷|ò¬M[l€ˆ×@I{TWÖtq‹†Ú"•¸¤–wдc•Œ/¥ixåE/ˆñÀÖü4‹n‰Y[x±ƒÝû-ej=c]¯Ñ]Ã\dJRTKÓ;Èù’rs?}¡ÉŸ,#¹'>®…›%)®ÁÁ!X¾ÈØÉÉQ\s³rVx;£ˤöˆQ(¥BzÀä¯[cae¡gRÐIXòŽÀ ä þ®OÅ\ÌA-•»®ðRHªø’¨¡»©Ý…õ."Ñéš²îм!Õô|&ž5­6PtB]§Ê+*B)M«ŒoS}ÅR¥Bk*²1®±k–âü?Ó+\¿ñòŒù¹Ÿ•|óë—+&û&œ›Ô*Øï5ïpì¿CCÒÞbGwæG^Z_¢åVÓøÕöø*í÷Uy£”üIjü"ár¡Ô;8}úõoP’£ä+{ÍçÈZÛ5wïá|"^½@üÝ~AÎ~Æw˽æßr»Ÿñ¥ÛÅíq{Üé¿ÃÅz!>þí¿2]ÿW?“å‡?=ÿsÐ7(yO.ÑéZw¬9¡õ€ç1Ô UÔÇ”åH ÔHuOå]‚žµ€‘´’ë Õée}NáRZÀß ÛEbzFá ©[4>§”~:§ä·Ééut~LÍWø¸?!$RÌ¿oÜGò=:%’\£©Ââú?(;r½iø‚÷;¤^e^=J+èìQI”2“Ó}t÷6µkym_]Í䣬=ãx¢,kÛßZ¶35´(Q¦eºK¾êÙ  PVß_8Hœ(¸•”Ôìó‡·Èu"¯7xtjhMÕ´i§tr–7)Û×ñù}òõÒ2£×7(*¾DP_Zœè^PÙ4ÛØr…ꆭ8 ï1ˆÿ: ~Kð7TQ–eÅMÂ=Ê¡¯Ÿ“R+¸óΊ©¥„ùeb‡&S[v£aÓöòâÛZ`¹i$ÁÙr©ch“ýnc’µÔV(Ì3(JÕîã8ÍFíuJyâ­ ¤Ùš”kÒ’‘q÷öüæk>[Îÿÿ»ûkþ°º‡·Ï…Ûãö¸-Ò_YGM+éýó——ô»ýtsçE®n{r*%+N¯êIå)O¨?Ç×·¨ÕQã9¸¬+¹~qoüžœOí”êt†n¬ 1fæäü• ©Á_6‹Ò5·]£x4½À…Öò,o“˳n)îÃhy—RŸž\Sóð.[òºGµ -K˜ì‰%Q£aׂ÷ yŸ›ËW2‹P›ˆ57'²)zɺ¦ð”’ nH±¢µB ¸é@Éw€ktò¤*¸¼’Cç ¹ù]nðA¨ñõ†Dl„Rï’Ö/¶º*w=C6Ÿ'G›fOàtM;Öù†©õ‚(;Ô½GØœãäUR|‡¢¯á¦ÄëÏ3OJÜ'Ô'4„³¤T¡¦¥J›ˆÉ°DܼAk"ÅH~Ñ g}‰ÖkJÍÔ0‘«¢KÆé3ØÌÄH LWä’ÈA7Äø¼±ƒÓ5«.øéëpå Ëò¼|róNÖúœX_kðz¾ç©ÓUï6Ïê21ÕRø9fà’,/,&óëaCȶÉDÂzÝöÉ27˜¼¹ƒêfÒ2á§ඤ¸ "LAÉ1’òÔí¿âÊYƒV'ÐZ@uyüŠN_@ê—îQxJqðñx |b)ô^³HeONø°e9¼O˜VjÚà]÷Œ ॠë Y 2ïÐú©ç0½„Wȱ…D4mÙ;P”˜÷P÷øíÒá†ÊõoÃþ D?„ø$•—ÍÓ#ÒÜå´»àfö/Ϙ6yÿ‚åéM[=L£YÇ~[-'º‹é¬à§Ô@ñ Á§»{mo«ý‹Í¹c¥&E}E¶3È´(2ÏÏ"ùúÔw)r@Ô7ÙT} ú„˜<Êîût>»ÑWåwL÷õÿ…ð™«Û/ýíq{ÜéƒÅºPžÇ·å›ïøU¬o¿.zÿÄ|Ž ]µD × Ža‹LO)ÜÁ)k&.J8÷Ô)‡'¨ÔÒrŽÊˆT½@¸AêB\õ‘RV’¼Žæ¦êb@œC ¤eNé©ÄVÀòSjÞƒÞ9§¬±íZççäô5‘’¡*1¯¨ÏˆV”–»˜óD=¹¾C<ìð¾"ó†eÿ.ÓÙ)_·}÷þÓ¼¡–—Ín%ß<ù8<W)šZ4f<Ç;Ou¯Qê[h¸"Ew;{H±˜p—=νn+iLJHE)õŠiÞ Ù \Ò3R¹Aý¨#¥ Çcœ* en®cS}Ùì¨z“7¹R9³ï¸/B½Ká1P)ËÇÀ<ÏA¿LÎÉ} ŸÎQ§ Ÿ%§B] ëõ¾1ÇMoÞ ªB¨_[DöºA$â6I ½§¡ n‡÷J‰Ï[ò˜éµý „5W\}ÐVSDäÔú wvŸz³žSäK”|ަ§T.!Ÿ£af=\£ò&(ª‚¿÷3¿;ÜÿMÿº^þ‚ïk‰&·Çíq{Üéë0x…üâ;z½þOþ§ùðß|³¨ûyð!Eë3¨‘1/x÷”Â=‹¯Z. Þ‡òERü\xˆø;Ä«/ð႘ϨñË´§ôÞ¿ ”+Jþê&êP+1^¡)ãÎïP÷‘R_¥¦wQY'D¿¡Æ÷ ~O‰çà_£./¨Äo(ñ† ‰ÌE ©_­ùE¾Žu}Á$O‘pðŒª;RQ¼óˆîÉ:S­!ðukÓfû·›þ:Ý¡¦=è ”-ZvHxNf¦ÔkóòH=žQÅÊŽè ,®é¹Ë‹¶÷ö¨|­W”å†J‡‹F¸’7!o!Ý£†•T^âÊ‚—KJxÑŠbu°É-…W‰ubšwHÍT½†|Èëm­Q3nsF^ Ô§hY¨5PdFÙ’×GPŸ‘¯ÚGEÏ\öMb¦âM3C÷²6Ÿðp" iÑ™/˜Ïï‘yŸšž<¤¬ïCi+d"±âE¨î.èk¨l}‚̯P÷Ž’èö9ùåR#ÎUÈR}\÷Ô5áüý¿ä.?ó—åòü—îίøN¹u»=nÛ"ýãz¸¾þî•gäV–ïûÉùðæ‡§mý9È]Öx ¤+Ôߥ”3j~老Ee‡›ÏÈé%_Åãó Í[3sŸ"3" ‡gˆ+8®‰ùç@Ëç[D¦ÛKDsMTw‡çÔü„ªç¶TÝQ—=êÞÂùÄŠn)uBZž"ó9Z?Áº eáïfÊòH8#•;­A‰/Ù^âA(\ 2 ü%ZÞC«gÍñn¥È©^A™‰r¯/É%“ò%ν îIsÁZJ‹ÔÜ~Š%¾åê>„†÷p¢”C Ê5,ÔrŽwwÉåK„pE>¼I~ñ‡~u¾úý=5½ý:œýÕ‡x„¢Ï¨ú ^¤,ĵ þÕ=%ï(ñ’VÊš˜dA&zN"QpèZÝ6b¢ð©w *å°ÙÏ©áÔ¬Pq×Èá#Ÿ©å­7¬é‹­ ï^ÁP“Ê.Iù-=•ò:}ꇑõ7¯¤Zað»Чä "7,ë52fnÈ9œ7–TuÔð²@¬ï_RŠ€¿õ*Ê5ÅÍ”ƒàçW‰òÃxîRâ%Õ¿ƒŸ„õæž+œ34q¬õS(PÒ]TÈ/€— g”Õ£»+ˆ‰š-b£h¬*ëÚ,GçMl2?£¸W!¿ú+DnšË\¾ÆM;B)-ù©HnÞ«ò ¢Wß…üêä —MçÌ:Û‚O}W¿ÊsÜT)ù5ðŽZ=äw)ë¡ùl‡†œ_Ň”X O¶”ú&ª‰²$´L"ž…’>‹lï“g~¸!-ó§Wÿ¸»ü©ß£÷¾ýêæÛ¾Oüåíõö¸=n‹ôOt,êË?ûÑòò?øGãõŸù{*þg…©àô“ä©9RíÖ+Ê´mn#õšæž¡.dî6£‰ô ¾SÈaº@ŠJÕŒ×çH¾G¼ZÑùºy•A÷Í- Zn¨º€ßRnn¨ºâtkoö)¢-Zг„âîRöÏAã/>EºVü$¤´Ç³‚îIîòïnXÖ^å q u}›ÄkÀÞi;h6”z <Á»OS÷oSõ¢¹œáaÉL!•·ñáëÉéM/mà¼D¥4ïúyJòh-2U\óï,(—-Z4½KÌ…íö.µ>c].ÐXp»‡¨y‡¸ß"›»hyJ\î1…—Èô eyü ‹Ô¼Ämï¡yCÕ‚†W›wº_)q‹ÎwQ¹K)_¢Ö=R=1]¼ûÿ²wn?šee~Þw­µ÷w¬¯ºª§»k¦{948`À!xˆ$Ê@ 7&$Fîý›üHôÂAfÄJ‘óÉA:Ý=Ó=ÝUÕUõ÷Þk½¯»o¼Q#ÝÏ?P‡|_~{­ý¾¿±³lŽ!)f£þ„¯åòoëõYªŠå~BÜu†ÊSïÅ%cëoüºm~þö(áeR…‡šGty‰ÖS\º^›é XׂJF1C,Ь´heÝà9PtÚ;”['ZA­ÅR:£´;,;1U—u¦÷¡¾špÃjEÙôÊÝ,{3D·EeŠÌ:Êv M"Œ(v㇕shè×¥ªIo sÈe‰ê ËFß ë:ÄNz‡1ýu¿ÇÖªçÌ•@›÷ïÖíIo S¼(, G¨ï°VÑtA§hV‚·”2ï… cÁv\.àÞﻚmŒ†1Þ²ÌPÎAôÖðJDô´·9Y/†0´›ÓÙ1Q…6wh˜#r ÓBÙ=¢Ö¢WÈùuât‰•1ÖMPÎO0¿Nn×TÚA·Â‚íªzóûÐ:Ê„ $Þïåõë¦ #DAÊ l»Ä©±QvÑ5+HWIÞá)ƒ\ë›BlÚôø3G‹#zÕ Y(ýòrÞ¢rÑ_õëU(-žÏÐñ˜lÈó~(0ÎúI~]¢IzÕh-ýžUç0º@¥€?M{ÑBÕR¥Yë*‚¿ŽÕ³ï‹=¬÷¯ûüåWØûÃ?Õø«íðžy``éÿîmxé(›¿|ÁÏ>ÿiÚ/~ÒJÊ•ýF¡Å÷þdð70C\€M‰¾£¨‰”|±Æ¼¦4NŒz'vsú­Bz¾áÚàl‰–0k°8G€à Þ\`¾ÅtŸXO¡;§xÂìG`{8sªú M·¦Šb ¬Lð!/{åUwŽ*J9K¸>ÄÕQ«(±A}LÛ,©Bú€œ!¯‰©%ï:´úŽPØm’Fî¹ß3vEäÜݹôq V Õ#ˆ™d÷1y kGýþuú9êš¼‡Ê¼79¥·°­{èäi,_ ¼A± e l0™µ\áá è ÈkÐ1ž[\¦h½ÆlEÞ=G¶¨ö…äÆ f[¢Í)ñ°Ÿè/3G½o™E/ˆÎWz1·­@߀fÚ>d vñ• y³Áhzçwâ·Õì qÿÝ?õÙ'_‘ñïþM¨‡Éì!¤þçN×y«W_dýçPv÷Þ†u1h÷™ÌrA£à2‚Ü!a‰rØb¹Ên ÑÉ4h©)]‹¦5æ‰ÒÎPˆ.I²ÅdÜï•®ßšŽ°]AyŒ0#rN6!„ÅÉÍê ØA>*Tf}‘µœ€ßÂY‚ã6é­¬qI„¸è‡«"”.¢ZîMÀ¯áEк£˜Ãr3í¯þs¡?¡jž‘]ÐcH;\W¢l±|µÿýôÊ H|‚’èÊÁqÛã9žçxé‹T<.p¨?FuKÎ×д@¥¥ø e}FJ@õ,È¥9'Æ«NŒ®;B=B^ãã¼í#Ю`ºEí ÂMŠerçTrŠÇè>øü²StÊšÜN{1µï avAd…Œ¸CýÜ}ì«2~ù¯ÂôïIõ®vøæ !=ð OlÇÖ¯Þ¶íç_v?xí·>H©ÞïéÚBFÑ4!{$jÛK;Ê4c$JY¼![6Ú†j¾Á}J(‰lkð Ú%rH(©ï÷ÛîȪ-Ð$V%Ÿ¢Paú2¨^GtK׬A÷ˆI™bvŒ«c avŽñ„T@"]㨠‘°&ëÉÀ4TxhQä¦At†Æ€µoõe0¶‡V÷1 ”yÿªB#¶OhZõsá’d‰fCê®ïWmÀ}ÍXÉàW(Vᢿ5€;YÞûãj¼w‘?þ·Ì>ñ%ªÞé׫†ø_¬¿yUv_þx·þÚGé¾÷¼ç{7‘ƒwiõtß#í¹Ÿpæª=ÜX³L„€Êî{k [ÔÏ¡© Mû’ ³~ÉK'dØž i³ª„lh¼k1öÐÑ+ÍåoØá~\ ²èÎnGñ aÔ€Œ‰IhÛ‚ûÍ÷qAi”¢o z Ï vLÑŽœ:Õý€ÚîÐaã§ Ù¡1â¥í­\õc‰Ø |IÛìÀÞEJzqŽ— Ô®“³ƒ€CØ'›amB= 'h]áeƒ5 ­×ˆDÐ_Áy^ƒTHaK.K"ë¾4åÒ“­ñ9Ä Ä·@å)œ¬yŒÆS°©0»u?@i Œ)Ý qÙ¹#sˆ“O}1ì}êüшû×```é_žCöºùÒ‹ÍÉ—?NûÊ'E60•@äfNŒÏá.o^>ؤl#à_An¢>ÅZ ®NP‰×(Í Âõ3$$Œ„• 1>FC†îVÖÀ¸‰…c´ÚAž@¾Ö0º,äËÚ±þ_£“ÅwãìbÏã‡_«®|ösLçïdôþ• £ØCHü?¡¬±í·oúîÉ˯}ŒîîÛDîß,ë7ÄÓ-^ï‡Å9Z)â`%ì¿ìÏ´¼"Ä.+Ä*J‘*Ó_u7}«™Œ°vÝ×TÆ“þtYö Ée¯øëV˜ÔOˆ\%ç‚(¨.°.£¦B áz8$—Œ’ ì.ÙÞ$÷À¡Ûªjæ8,t$¬[âcLB»#ïžBtŽó˜T?C±Øcˆë¾¿[®@x~ Ó=ÄGhzéè*r1"k”s,¼ ò=H-t×(Ý1vä÷05w<õv«0úзâÞ»,£ßûkF¿ù¿Ý†éÀÀÒÿN>¡¬¿ú»Þ6ûù-¶_ÿ(ÛÜÖtíQÉ^2O¨ŽQ©Èú6¤Ù i†Æª¯½, ø³ŽXM{Å&g$ãy…‹"®tÍ)i4q<¯ ^§kïãZõ-¹qÄu¯¹ EÎûiôö8R,Ìz¹rû&îãK¿ã M?P¦Ö£ioÖ-!*J‹uœ¤X·#PCý Ð-tX)jS¼tËŸ@šä*ªBižàz†ÚšŽ(¾ÛàÍX÷§ò5úÓ1D¸£ qò¾ï‡éoÿƒ-^úz˜|ø»èÑðÙBzà¿râë^´?º­Ý÷Þ_¶ßÿ5k¾ó|ɯ¿S©[ÛuÑ}ñž[j-˜P<‚¢í $í#äsˆ º:ša¬¡uL÷P¹‡êmÙ'–± %žaÙ ZÜ=BÂXomRwŽnãÔ#¥Ð‡%ñ6– 8‡¸Ä»Ò;£¡òr@yÓŸaœ£zˆv+LW—×ü5’*´-ý³K~E‰£kû熾øåÒñìÜzo³ˆšÔÓ õ³wãø¥oPä5Ò³weüÎ×¥V¡†ø…xKÙüxî›*÷nÚökc—c×~çyÒÉU–gûçÅ]Å_ÕÌ-#Aˆh¨6®«·È] æ ¤L.{xëÔ³ívd4mQ*ÌÖP&hÌVhša/ß+”Gd› ¾Bc ꘵¨BîúµoÌúPÕÜφiêKÀpãT˜ÎVª¦¤wÿ”2¿`òžŸh}ë2Ù„ê©G6zö~H·ïRŸ‰!¤~™‚¼75uùþv«Yðó}üøj^ß»)åÁÓxŽèÃë¶+Ñ,Ç oÉ_ ÿ6ñB;#% IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/e_resize_cursor.png000066400000000000000000000024111511343406000257620ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±æIDATX…í—MHcg†Ÿ{c2UÑt°¶õ'"]¨µ‹© A¡*.lB¡#(v„ntiWBZZÄŠÿ@t–.ºqD¡›ŽøIfD]˜Œ«11ÑëýN7Òu¢q ›yárÉýÎwÞ÷œ{¾sOà=Þ㆖êÆ@ ““s÷H}†Q§”j4M3MDN½^ïÓŠŠŠçÀù5öw‚‡¿‰F£¿i$ã÷ûKLÓ<ߨØ8[[[;ÝÝÝ= ‡Ãüüü" =ÑþÎü~‹ˆÈÎÎÎ 8âœjûûûÍ""N§S©®®‘–––ï€ü˜hôTœœœ¤v­¯¯ÿ <ì1Z0tˆX™VJpxxè²Û}`†ÐÝÝMYYYçêêê/q"ôh4j»a_qÙJY€išÀää$Zyyù÷+++?ÇD¤Ý´OD´¯ÆÛ ‰ mllìÉòò2UUU?E"‘[ù¾ÉHK¸'BWJ]Z›˜˜@Ó4mttôÉÒÒ>ŸïYJœYYY?*¥JEDK$º€ˆ$>ÇáphÃÃÃ{{{Ÿ§"@KOOƒßºÝnûm˜¦yé÷ÈȺ®388øÅmö' …^õõõ V§Jùêê꥔dgg =‘ššš> «]É€."i‰Q¥‚¡¡!rss“Ú%C-vLî —ËEkkkR»+EhÆ^CCCþææ¦~ÑÅÞ†ÙÙÙ+uàr¹X\\TÅÅÅwî3ö©©©f¿ß¿§”’Û ##ãÒ»w¹\²µµeF"CDî\ª­­í/à1ðð!VϾòZzzzÊúûû'F¾°° ìvûñÀÀÀ³ÞÞÞ¯’E|Epx€ ÖGãºf¥¥_Gîp8ŽëëëŸ655e&#¿N€gÀë˜;q};Ziiiñ ä3/:::>NEXY0°¦®!ÐóòòBässsñä›ÀfII‰‘ªø¯¨n‚èº.n·[)¥Žjkkg¼^ï àoàeAAÁ'÷pk躨««›ñz½/cäàŸÌÌÌ{e )l6›o566þîñxŽ€ç1ò7Ày( ´··ãóù¨¬¬D)%ÛÛÛa’g8)ôùùù/›››€¯ k@ÕÝét>ôx<†q."‰DΧ§§ÿ~Ê€údªc5’bŽ‚À!pŠ™[/*€¬1ìx¬>ÀHU€†Õ .f»3.ÏúëYÀ§XS³ˆbñ×@¸~ظƒˆx\ùc'òVÖ̘ˆ3ÞA¼ü Oeè#;lg-IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/editable_cells.rb000066400000000000000000000130261511343406000253360ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Tree View/Editable Cells This demo demonstrates the use of editable cells in a GtkTreeView. If you're new to the GtkTreeView widgets and associates, look into the GtkListStore example first. It also shows how to use the GtkCellRenderer::editing-started signal to do custom setup of the editable widget. The cell renderers used in this demo are GtkCellRendererText, GtkCellRendererCombo and GtkCellRendererProgress. =end class EditableCellsDemo Item = Struct.new("Item", :number, :product, :yummy) COL_ITEM_NUM, COL_ITEM_PROD, COL_ITEM_YUMMY = 0, 1, 2 COL_NUM_TEXT = 0 def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Editable Cells" vbox = Gtk::Box.new(:vertical, 5) vbox.margin = 5 @window.add(vbox) label = Gtk::Label.new("Shopping list (you can edit the cells)") vbox.pack_start(label, :expand => false, :fill => true, :padding => 0) sw = Gtk::ScrolledWindow.new sw.shadow_type = :etched_in sw.set_policy(:automatic, :automatic) vbox.pack_start(sw, :expand => true, :fill => true, :padding => 0) # create models create_items_model create_numbers_model # create tree view @treeview = Gtk::TreeView.new(@items_model) @treeview.selection.mode = :single add_columns sw.add(@treeview) # Some buttons hbox = Gtk::Box.new(:horizontal, 4) hbox.homogeneous = true vbox.pack_start(hbox, :expand => false, :fill => false, :padding => 0) button = Gtk::Button.new(:label => "Add item") button.signal_connect("clicked") { add_item } hbox.pack_start(button, :expand => true, :fill => true, :padding => 0) button = Gtk::Button.new(:label => "Remove item") button.signal_connect("clicked") { remove_item } hbox.pack_start(button, :expand => true, :fill => true, :padding => 0) @window.set_default_size(320, 200) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def add_item return if @items.nil? item = Item.new(0, "Description here", 50) @items << item # Insert a row below the current one path = @treeview.cursor[0] iter = if path current = @items_model.get_iter(path) @items_model.insert_after(current) else @items_model.insert(-1) end # set the data for the new row item.each_with_index do |value, index| iter[index] = value end # Move focus to the new row path = @items_model.get_path(iter) column = @treeview.get_column(0) @treeview.set_cursor(path, column, false) end def remove_item selection = @treeview.selection iter = selection.selected if iter path = @items_model.get_path(iter) i = path.indices[0] @items_model.remove(iter) @items.delete_at(i) end end def add_items @items << Item.new(3, "bottles of coke", 20) @items << Item.new(5, "packages of noodles", 50) @items << Item.new(2, "packages of chocolate chip cookies", 90) @items << Item.new(1, "can vanilla ice cream", 60) @items << Item.new(6, "eggs", 10) end def create_items_model @items = [] add_items # Create list store @items_model = Gtk::ListStore.new(Integer, String, Integer, TrueClass) @items.each do |item| iter = @items_model.append iter[COL_ITEM_NUM] = item.number iter[COL_ITEM_PROD] = item.product iter[COL_ITEM_YUMMY] = item.yummy end end def create_numbers_model @numbers_model = Gtk::ListStore.new(String, Integer) (1..10).each do |n| iter = @numbers_model.append iter[COL_NUM_TEXT] = n.to_s end end def add_columns add_number_column add_product_column add_yummy_column end def add_number_column renderer = Gtk::CellRendererCombo.new renderer.model = @numbers_model renderer.text_column = COL_NUM_TEXT renderer.has_entry = false renderer.editable = true renderer.signal_connect "edited" do |cell, path, new_text| cell_edited(cell, path, new_text) end renderer.signal_connect "editing-started" do |_cell, editable, path| editable.set_row_separator_func do |model, iter| path = model.get_path(iter) idx = path.indices[0] idx == 5 end end def renderer.column COL_ITEM_NUM end @treeview.insert_column(-1, "Number", renderer, :text => COL_ITEM_NUM) end def add_product_column renderer = Gtk::CellRendererText.new renderer.editable = true renderer.signal_connect "edited" do |cell, path, new_text| cell_edited(cell, path, new_text) end def renderer.column COL_ITEM_PROD end @treeview.insert_column(-1, "Product", renderer, :text => COL_ITEM_PROD) end def add_yummy_column renderer = Gtk::CellRendererProgress.new def renderer.column COL_ITEM_YUMMY end @treeview.insert_column(-1, "Yummy", renderer, :value => COL_ITEM_YUMMY) end def cell_edited(cell, path_string, new_text) path = Gtk::TreePath.new(path_string) column = cell.column iter = @items_model.get_iter(path) case column when COL_ITEM_NUM i = path.indices[0] @items[i].number = new_text.to_i iter.set_value(column, @items[i].number) when COL_ITEM_PROD i = path.indices[0] @items[i].product = new_text iter.set_value(column, @items[i].product) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/entry_buffer.rb000066400000000000000000000023671511343406000251030ustar00rootroot00000000000000# Copyright (c) 2008-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Entry/Entry Buffer Gtk::EntryBuffer provides the text content in a Gtk::Entry. Applications can provide their own buffer implementation, e.g. to provide secure handling for passwords in memory. =end class EntryBufferDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Entry Buffer" @window.resizable = false vbox = Gtk::Box.new(:vertical, 5) vbox.margin = 5 @window.add(vbox) label = Gtk::Label.new markup = "Entries share a buffer. Typing in one is reflected in the other." label.markup = markup vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) # Create the buffer that will be shared buffer = Gtk::EntryBuffer.new # first entry entry = Gtk::Entry.new(buffer) vbox.pack_start(entry, :expand => false, :fill => false, :padding => 0) # second entry entry = Gtk::Entry.new(buffer) vbox.pack_start(entry, :expand => false, :fill => false, :padding => 0) end def run if !@window.visible? @window.show_all else @window.destroy end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/entry_completion.rb000066400000000000000000000024601511343406000257750ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Entry/Entry Completion GtkEntryCompletion provides a mechanism for adding support for completion in GtkEntry. =end class EntryCompletionDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Entry Completion" @window.resizable = true vbox = Gtk::Box.new(:vertical, 5) vbox.margin = 5 @window.add(vbox) label = Gtk::Label.new markup = "Completion demo, try writing total or gnome for example." label.markup = markup vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) entry = Gtk::Entry.new vbox.pack_start(entry, :expand => false, :fill => false, :padding => 0) completion = Gtk::EntryCompletion.new entry.completion = completion completion.model = create_completion_model completion.text_column = 0 end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_completion_model store = Gtk::ListStore.new(String) %w(GNOME total totally).each do |word| iter = store.append iter[0] = word end store end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/event_axes.rb000066400000000000000000000242621511343406000245500ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Touch and Drawing Tablets Demonstrates advanced handling of event information from exotic input devices. On one hand, this snippet demonstrates management of drawing tablets, those contain additional information for the pointer other than X/Y coordinates. Tablet pads events are mapped to actions, which are both defined and interpreted by the application. Input axes are dependent on hardware devices, on linux/unix you can see the device axes through xinput list . Each time a different hardware device is used to move the pointer, the master device will be updated to match the axes it provides, these changes can be tracked through GdkDevice::changed, or checking gdk_event_get_source_device(). On the other hand, this demo handles basic multitouch events, each event coming from an specific touchpoint will contain a GdkEventSequence that's unique for its lifetime, so multiple touchpoints can be tracked. =end class EventAxesDemo AXES_INFO = Struct.new(:last_source, :last_tool, :axes, :color, :x, :y) EVENT_DATA = Struct.new(:pointer_info, :touch_info) COLORS = %w(black orchid fuchsia indigo thistle sienna azure plum lime navy maroon burlywood).freeze PAD_ACTION_RESULTS = %w(☢ ♨ ☼ ☄ âš¡ 💫 â—‘ âš›).freeze # type index mode label action_name PAD_ACTIONS = [ [:button, 1, -1, "Nuclear strike", "pad.nuke"], [:button, 2, -1, "Release siberian methane reserves", "pad.heat"], [:button, 3, -1, "Release solar flare", "pad.fry"], [:button, 4, -1, "De-stabilize Oort cloud", "pad.fall"], [:button, 5, -1, "Ignite WR-104", "pad.burst"], [:button, 6, -1, "Lart whoever asks about this button", "pad.lart"], [:ring, -1, -1, "Earth axial tilt", "pad.tilt"], [:strip, -1, -1, "Extent of weak nuclear force", "pad.dissolve"] ].freeze def initialize(main_window) @cur_color = 0 @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Event Axes" @window.set_default_size(400, 400) box = Gtk::EventBox.new @window.add(box) box.support_multidevice = true box.add_events([:pointer_motion_mask, :button_press_mask, :button_release_mask, :smooth_scroll_mask, :enter_notify_mask, :leave_notify_mask, :touch_mask]) @event_data = EVENT_DATA.new({}, {}) box.signal_connect "event" do |widget, event| update_axes_from_event(event) widget.queue_draw false end box.signal_connect "draw" do |widget, cr| y = 0 allocation = widget.allocation # Draw Abs info @event_data.pointer_info.each do |_key, value| draw_axes_info(cr, value, allocation) end @event_data.touch_info.each do |_key, value| draw_axes_info(cr, value, allocation) end # Draw name, color legend and misc data @event_data.pointer_info.each do |_key, value| y = draw_device_info(widget, cr, nil, y, value) end @event_data.touch_info.each do |key, value| y = draw_device_info(widget, cr, key, y, value) end false end @label = Gtk::Label.new("") @label.use_markup = true box.add(@label) init_pad_controller end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def init_pad_controller action_group = Gio::SimpleActionGroup.new @pad_controller = Gtk::PadController.new(@window, action_group, nil) PAD_ACTIONS.each_with_index do |pad_action, i| action = if pad_action[0] == :button Gio::SimpleAction.new(pad_action[4]) else Gio::SimpleAction.new(pad_action[4], "d") end action.signal_connect "activate" do |_action, param| if param update_label_and_timeout("#{PAD_ACTION_RESULTS[i]} #{param}") else update_label_and_timeout(PAD_ACTION_RESULTS[i]) end end action_group.add_action(action) @pad_controller.set_action(*pad_action) end end def draw_axes_info(cr, info, allocation) axes = info.last_source.axes cr.save cr.set_line_width(1) cr.set_source_rgba(info.color) cr.move_to(0, info.y) cr.line_to(allocation.width, info.y) cr.move_to(info.x, 0) cr.line_to(info.x, allocation.height) cr.stroke cr.translate(info.x, info.y) if info.axes.nil? cr.restore return end if axes.include?(Gdk::AxisFlags::XTILT) && axes.include?(Gdk::AxisFlags::YTILT) tiltx = info.last_source.get_axis(info.axes, :axis_xtilt) tilty = info.last_source.get_axis(info.axes, :axis_ytilt) render_arrow(cr, tiltx * 100, tilty * 100, "Tilt") end if axes.include?(Gdk::AxisFlags::DISTANCE) distance = info.last_source.get_axis(info.axes, :axis_distance) cr.save cr.move_to(distance * 100, 0) cr.set_source_rgb(0.0, 0.0, 0.0) cr.set_dash([5.0, 5.0], 2, 0.0) cr.arc(0, 0, distance * 100, 0, 2 * Math::PI) cr.stroke cr.move_to(0, -distance * 100) extents = cr.text_extents("Distance") cr.rel_move_to(-extents.width / 2, 0) cr.show_text("Distance") cr.move_to(cr, 0, 0) cr.restore end if axes.include?(Gdk::AxisFlags::WHEEL) wheel = info.last_source.get_axis(info.axes, :axis_wheel) cr.save cr.set_line_width(10) cr.set_source_rgba(0, 0, 0, 0.5) cr.new_sub_path cr.arc(0, 0, 100, 0, wheel * 2 * Math::PI) cr.stroke cr.restore end if axes.include?(Gdk::AxisFlags::ROTATION) rotation = info.last_source.get_axis(info.axes, :axis_rotation) rotation *= (2 * Math::PI) cr.save cr.rotate(-1 * (Math::PI / 2)) cr.set_line_cap(Cairo::LINE_CAP_ROUND) cr.set_line_width(5) cr.new_sub_path cr.arc(0, 0, 100, 0, rotation) cr.stroke cr.restore end if axes.include?(Gdk::AxisFlags::SLIDER) slider = info.last_source.get_axis(info.axes, :axis_slider) cr.save cr.movet_to(0, -10) cr.rel_line_to(0, -50) cr.rel_line_to(10, 0) cr.rel_line_to(-5, 50) cr.close_path cr.clip_preserve pattern = Cairo::LinearPattern.new(0, -10, 0, -60) pattern.add_color_stop_rgb(0, 0, 1, 0) pattern.add_color_stop_rgb(1, 1, 0, 0) cr.set_source(pattern) mask = Cairo::LinearPattern.new(0, -10, 0, -60) mask.add_color_stop_rgba(0, 0, 0, 0, 1) mask.add_color_stop_rgba(slider, 0, 0, 0, 1) mask.add_color_stop_rgba(slider, 0, 0, 0, 0) mask.add_color_stop_rgba(1, 0, 0, 0, 0) cr.mask = mask cr.set_source_rgb(0, 0, 0) cr.stroke cr.restore end cr.restore end def draw_device_info(widget, cr, sequence, y, info) cr.save str = "Source: #{info.last_source.name}" if sequence && sequence.class.name str += "\nSequence: #{sequence.class.name}" end if info.last_tool tool_type = tool_type_to_string(info.last_tool.tool_type) serial = info.last_tool.serial str += "\Tool: #{tool_type}" str += ", Serial: #{serial.to_s(16)}" if serial != 0 end cr.move_to(10, y) layout = widget.create_pango_layout(str) cr.show_pango_layout(layout) cr.stroke _, h = layout.pixel_size cr.set_source_rgba(info.color) cr.set_line_width(10) cr.move_to(0, y) y += h cr.line_to(0, y) cr.stroke cr.restore y end def update_axes_from_event(event) device = event.device source_device = event.source_device sequence = event.event_sequence tool = event.device_tool if event.type == :touch_end || event.type == :touch_cancel @event_data.touch_info.delete(sequence) return elsif event.type == :leave_notify @event_data.pointer_info.delete(device) return end info = nil if sequence.nil? info = @event_data.pointer_info[device] unless info info = AXES_INFO.new info.color = Gdk::RGBA.parse(COLORS[@cur_color]) @cur_color = (@cur_color + 1) % COLORS.size @event_data.pointer_info[device] = info end else info = @event_data.touch_info[sequence] unless info info = AXES_INFO.new info.color = Gdk::RGBA.parse(COLORS[@cur_color]) @cur_color = (@cur_color + 1) % COLORS.size @event_data.touch_info[sequence] = info end end info.last_source = source_device if info.last_source != source_device info.last_tool = tool if info.last_tool != tool if event.type == :touch_begin || event.type == :touch_update @event_data.pointer_info.delete(device) if (sequence && event.touch.emulating_pointer) end if event.type == :motion_notify info.axes = source_device.axes elsif event.type == :button_press || event.type == :button_release info.axes = source_device.axes end x, y = event.coords info.x = x info.y = y end def tool_type_to_string(tool_type) case tool_type when Gdk::DeviceToolType::PEN "Pen" when Gdk::DeviceToolType::ERASER "Eraser" when Gdk::DeviceToolType::BRUSH "Brush" when Gdk::DeviceToolType::PENCIL "Pencil" when Gdk::DeviceToolType::AIRBRUSH "Airbrush" when Gdk::DeviceToolType::MOUSE "Mouse" when Gdk::DeviceToolType::LENS "Lens cursor" else "Unknown" end end def render_arrow(cr, x_diff, y_diff, label) cr.save cr.set_source_rgb(0, 0, 0) cr.new_path cr.move_to(0, 0) cr.line_to(x_diff, y_diff) cr.stroke cr.move_to(x_diff, y_diff) cr.show_text(label) cr.restore end def update_label_and_timeout(text) GLib::Source.remove(@pad_action_timeout_id) if @pad_action_timeout_id @label.markup = "#{text}" @pad_action_timeout_id = GLib::Timeout.add(200) do @label.markup = "#{text}" @pad_action_timeout_id = 0 GLib::Source::REMOVE end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/ew_resize_cursor.png000066400000000000000000000027071511343406000261610ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±¤IDATX…í–]hSgÇ'I»&ÙêÚ¤ÒùÁ`³³N¬sSÁu£(TëG›j­¡´SAhÅ€L„îbÞ])l`)»)Œ2‹7Þˆ¥_A´Ø¥R/*£Ó­KÛÓÆÓä䜴Í9ï.òAL?¬ŽÁýÃsqÎû¼Ïÿ÷>ç}óÖ´¦ÿ“„[V‘³þßð–?~ü®aO€7×);ÈYXXøµ§§gç29¯f>22²EÓ´ Bï€%+ϼ177§D£Ñ©ëׯ äýSixxøMÓþÔuÝLŠÛ…š¦EæææD$™¹zõj`_vuæ÷îÝÛFÇFGG.^¼(’ÕÀ†e\š¦E®\¹"îß¿WUu¶­­­p,±™t÷îÝÛ·o˜Øäñxl²,¿h$Û­iMMMÖG½ÞÐÐÐÕÖÖVNâs,š»T1Éï÷oرcGßäääæÚÚZ›išX­ÖÔ¸5¹úìȬBI’Ÿ½±±Ñ244älhhèjooÿd)ˆì6JÅeee½²,¿}ìØ1[,K $‹Žk·ÛcV«ÕÈ&7MÓ’——gB ª*ñxœ³gÏZ:::œ^¯÷'Ã0êš››ý@ 0Ó-K™www¯ß·o_ïÌÌLÉ¡C‡lSSSèºN~~>%%%?~œÄ6X^’$qûöm¡Pˆœœ éìì4ËÊÊ¢'Ï;÷K " õööºöìÙÓ‡·UTTØž>}J< ¨¨ˆ‚‚‚t^$!Š¢055…išØl6òóóéêê2÷îݫݸqãäéÓ§b©ŠVMÓ~´Ûíõåååøý~$IB$Iäææ’››ûRóóóÌÏϧ;&In·›±±1ašæ_[·n-ƒ©99—/_þhzz:8::/..@:$Iz¥È¬áp8Dww·©ªê\KKËW@àL-ÉÕÔÔhoo¿699¹nÿþý–Œ£Gii)gU¸sç4Ünwz§NB Õ•Â0 Óçó¥ç9NÑßßoÌÎÎÆjjj¾>v‘¸SÒg’¿å@iUUU‹,ËÊðð°ár¹ž¾¾.ŸgÄ% 5ë)§Ó)úúú EQbÕÕÕße˜$»¾hS¥!Ž9Ò2==­Ãåre4“¸>vfÄ.àSUU£>Ÿ/½rEQbG]•ùŠçÏŸOœÞIæØ3 lŠF£jkk«0EÑ_Ö<bÛ‰'.„B¡°ªª©Û°ؘQ(VÀ­iZD×u …´ÊÊÊk@ðÁ˘/‚¨««ó…B¡HÀÃò·¡[×õ°¢(‘ƒ~4¾ªù"¯×{!‰<ª€·–p…Ãáßêë뿼$öÆŠæÖ¥^fHq 6222­(J`ppp˜ôäxJ#Ëò`GGÇïÀç\Œ¬Üç&­F*Rg÷Y²°™UˬKæGm%ó5­é?¡¿dÉfYzœ¯IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/expander.rb000066400000000000000000000044571511343406000242210ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Expander GtkExpander allows to provide additional content that is initially hidden. This is also known as "disclosure triangle". This example also shows how to make the window resizable only if the expander is expanded. =end class ExpanderDemo def initialize(main_window) toplevel = main_window.toplevel message = "Something went wrong" @window = Gtk::MessageDialog.new(:parent => toplevel, :flags => :destroy_with_parent, :type => :error, :buttons_type => :close, :message => message) @window.use_markup = true message = "Here are some more details but not the full story." @window.secondary_text = message area = @window.message_area box = area.parent box.parent.child_set_property(box, "expand", true) box.parent.child_set_property(box, "fill", true) area.each do |child| child.parent.child_set_property(child, "expand", false) end expander = Gtk::Expander.new("Details:") sw = Gtk::ScrolledWindow.new sw.set_min_content_height(100) sw.set_shadow_type(:in) sw.set_policy(:never, :automatic) tv = initialize_text_view sw.add(tv) expander.add(sw) area.pack_end(expander, :expand => true, :fill => true, :padding => 0) expander.show_all expander.signal_connect "notify::expanded" do @window.resizable = expander.expanded? end @window.signal_connect "response" do |dialog, _response_id| dialog.destroy end end def run if !@window.visible? @window.show_all else @window.destroy end end private def initialize_text_view tv = Gtk::TextView.new tv.editable = false tv.wrap_mode = :word tv.buffer.text = < "/filtermodel/filtermodel.ui") @builder.connect_signals {} end def set_treeview_column_data_from_int_to_string(column_name, cell_name, col_index) column = @builder[column_name] cell = @builder[cell_name] column.set_cell_data_func(cell) do |_col, current_cell, _current_model, current_iter| num = current_iter[col_index] current_cell.text = num.to_s end end def initialize_tree_model_filter_computed tree = @builder["treeview2"] types = [Integer, Integer, Integer, TrueClass] model = @store.create_filter model.set_modify_func(*types) do |filter_model, filter_iter, filter_column| value = nil child_iter = filter_model.convert_iter_to_child_iter(filter_iter) width = child_iter[WIDTH_COLUMN] height = child_iter[HEIGHT_COLUMN] case filter_column when WIDTH_COLUMN value = width when HEIGHT_COLUMN value = height when AREA_COLUMN value = width * height when SQUARE_COLUMN value = (width == height) end value end tree.model = model end def initialize_tree_model_filter_selected tree = @builder["treeview3"] model = @store.create_filter model.set_visible_func do |_current_model, current_iter| current_iter[WIDTH_COLUMN] < 10 end tree.model = model end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/filtermodel.ui000066400000000000000000000172761511343406000247360ustar00rootroot00000000000000 10 20 5 25 15 15 5 50 1 5 Filter Model 1 10 10 10 1 1 Original 0 0 0 1 1 liststore1 0 Width 1 adj Height 1 adj 0 1 1 1 0 0 Width Height Area Square object-select-symbolic 1 1 1 Computed Columns 0 1 0 1 Filtered 0 0 2 1 1 0 0 Width Height 0 3 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/fishbowl.rb000066400000000000000000000121171511343406000242200ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Benchmark/Fishbowl This demo models the fishbowl demos seen on the web in a GTK way. It's also a neat little tool to see how fast your computer (or your GTK version) is. =end STATS_UPDATE_TIME = 1_000_000 # G_USEC_PER_SEC N_STATS = 5 class Stats attr_accessor :last_stats, :last_frame, :last_suggestion, :frame_counter_max, :stats_index, :frame_counter, :item_counter def initialize(widget) @widget = widget @stats_index = 0 @frame_counter_max = 0 @last_frame = @widget.frame_clock.frame_time @last_stats = @last_frame @frame_counter = Array.new(N_STATS, 0) @item_counter = Array.new(N_STATS, 0) @last_suggestion = 0 end end class Fish < Gtk::Image attr_accessor :x, :y, :x_speed, :y_speed def initialize super(:icon_name => random_icon_name, :size => :dialog) @x = 10 @y = 10 @x_speed = rand(1..200) @y_speed = rand(1..200) end private def random_icon_name theme = Gtk::IconTheme.default icon_list = theme.icons icons = icon_list.reject { |e| e.include?("symbolic") } icons[rand(icons.size)] end end class FishbowlDemo def initialize(main_window) builder = Gtk::Builder.new(:resource => "/fishbowl/fishbowl.ui") @window = builder["window"] @bowl = builder["bowl"] @info_label = builder["info_label"] @changes_prevent = builder["changes_prevent"] @changes_prevent.image = Gtk::Image.new(:icon_name => "changes-prevent") @changes_allow = builder["changes_allow"] @changes_allow.image = Gtk::Image.new(:icon_name => "changes-allow") @window.screen = main_window.screen @window.realize @bowl.add_tick_callback do move_fish end end def run if !@window.visible? @window.show else @window.destroy end @window end private def move_fish elapsed, suggested_change = do_stats @bowl.each do |widget| move_one_fish(widget, elapsed) end if suggested_change > 0 add_fish(suggested_change) elsif suggested_change < 0 remove_fish(-suggested_change) end GLib::Source::CONTINUE end def do_stats @stats ||= Stats.new(@bowl) frame_time = @bowl.frame_clock.frame_time elapsed = frame_time - @stats.last_frame n_frames = 0 if @stats.last_stats + STATS_UPDATE_TIME < frame_time @stats.frame_counter.each do |f| n_frames += f end index = @stats.stats_index fps = STATS_UPDATE_TIME * n_frames / (N_STATS * STATS_UPDATE_TIME) new_label = format("%u icons - %.1f fps", @stats.item_counter[index], fps) @info_label.label = new_label if @stats.frame_counter[index] >= 19 * @stats.frame_counter_max / 20 if @stats.last_suggestion > 0 @stats.last_suggestion *= 2 else @stats.last_suggestion = 1 end else if @stats.last_suggestion < 0 @stats.last_suggestion -= 1 else @stats.last_suggestion = -1 end @stats.last_suggestion = [@stats.last_suggestion, 1 - @stats.item_counter[index]].max end @stats.stats_index = (@stats.stats_index + 1) % N_STATS @stats.frame_counter[@stats.stats_index] = 0 @stats.item_counter[@stats.stats_index] = @stats.item_counter[(@stats.stats_index + N_STATS - 1) % N_STATS] @stats.last_stats = frame_time if @changes_allow.active? @stats.last_suggestion = 0 end suggested_change = @stats.last_suggestion else suggested_change = 0 end @stats.last_frame = frame_time @stats.frame_counter[@stats.stats_index] += 1 @stats.frame_counter_max = [@stats.frame_counter_max, @stats.frame_counter[@stats.stats_index]].max [elapsed, suggested_change] end def add_fish(n_fish) (1..n_fish).each do new_fish = Fish.new new_fish.show @bowl.put(new_fish, 10, 10) stats_update(n_fish) end end def stats_update(n_items) index = @stats.stats_index @stats.item_counter[index] += n_items end def remove_fish(n_fish) (0..(n_fish - 1)).each do @bowl.children.shift end stats_update(- n_fish) end def move_one_fish(fish, elapsed) fish.x += (fish.x_speed * elapsed / STATS_UPDATE_TIME) fish.y += (fish.y_speed * elapsed / STATS_UPDATE_TIME) if fish.x <= 0 fish.x = 0 fish.x_speed = - rand(1..200) * (fish.x_speed > 0 ? 1 : - 1) elsif fish.x > fish.parent.allocated_width - fish.allocated_width fish.x = fish.parent.allocated_width - fish.allocated_width fish.x_speed = - rand(1..200) * (fish.x_speed > 0 ? 1 : - 1) end if fish.y <= 0 fish.y = 0 fish.y_speed = - rand(1..200) * (fish.y_speed > 0 ? 1 : - 1) elsif fish.y > fish.parent.allocated_height - fish.allocated_height fish.y = fish.parent.allocated_height - fish.allocated_height fish.y_speed = - rand(1..200) * (fish.y_speed > 0 ? 1 : - 1) end fish.parent.move(fish, fish.x, fish.y) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/fishbowl.ui000066400000000000000000000035131511343406000242320ustar00rootroot00000000000000 Fishbowl True True True 0 icons - 0 fps end False True none end True False none end True ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/floppybuddy.gif000066400000000000000000000121401511343406000251020ustar00rootroot00000000000000GIF89aPF÷€  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ãã‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦ÿ¨¨¨ÿÿ=v{ÿ«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿¸ÂÙÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ÿ NETSCAPE2.0è!ù €,L>ü H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²dA(Sª\Ér¥É…NjI“æÌ— cÊ JÏž@ƒöü©ó¦H ‹þŠ2hJ§2rD)@*0£.µšª©O®[µvDÙ•@ª³Xsjjõé×¶lÅ6$æÙ«wÓÒ5¨”mW¯)»ÆÝ9- ½Í¢Í{ø,ÒEgúu8ìÎÇ Ó5|’®b¼‹Œ¼ô­S¯C£J%ˆx3è«|C¿f ™´ÐÛ¸Ic¨¹qhº»q}vmÛB—N­•êÀÏÐóþ-½8çª(U/g»ysêûÖ_þ9¼qáÙµã^?¸9yó³ßï‹>²döëí§¾|pÞó§_Mª6Ó~ÏÁ‡ÖÏ•‡vé(á„Þ„`‚.ä}õ W!*IøØ…¾õçІ£9gßNÀ´èâ‹ÀðÇúAÈškhq¨áƒ®8SŒ)ÁãŒ5ÚHg¡f>$JBÊH£L:×àƒmÜh:‰QIeŠô!I‘–6 $˜0JY$dH¢X‘™'u¹¦“mŠ©Ah긑š*…9åž|j’šB¾è昉aéÑ€x&Úbˆ„âÄåe1aJ„Yzi… véiŠš–J¢§¦¦:*©”©¸êA*=äÒ«°žª­´ç®¹ê𔕽ò,B¼k$±ÃKªO9Ūl}<ëWL%‹*QÉMËÖi¯.WÚ~H¡†šS•;R¸Âáçìvç‘®»Õ¶;îm_2xn~)Á.÷ïµÉåkn¼2zk0Áõê À.9,oÄ[.ºÏf¬ñÆwìñÇ#!ù €,L>ü H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²dA(Sª\Ér¥É…NjI“æÌ— cÊ JÏž@ƒöü©ó&΃EE4eS™Fž„ª@ªTL}ZÅ 4©TƒI»bÍš’ëPª vèX¢(ÍúDËÀÕµj7)Ö©V«U©¨{×nªµ÷*ýÛ4ëYºóR{÷êáœ5Á*ʹ³âÁ ãµ,šh‚q ¶|PJ¨|…’]üx'ÊФsW¾Z÷êË_Sí¬•øÞ™­'[Ö}˜uä«[[Eì%ìØÄ_Où|9s¬ûÏ¥.PøðìÚasÇí½¹sƒ†ÛSW¹½¦ýú¼Æo8yèý’•gÞuhà`ë ´ŸwÔ%¤V€"h röY·]„ìÉ—Öƒ¨ñvÜNÀ„(âˆÀðÇÇ–àd”‘Ö`]&øáL%¦Db‰'¦\~ rуx™vڌԈÒ&¢x!†ÿAjµFd("™ã’6èãDP¾8%JU’˜¤Ž¨q¤E[¢V`‘`)æ•êÁ×eH_Úø¦’qÊy&[kÞx'™¥éQŠGú)"}y~åš`1Uh!…;)ZÞ„”NèNŽfê’¤šv*i„Ú÷éI+¤Ҩšñhꥄ¨–Š«¨Vk‡³Žêjª±*t뎵¶Ê¬›æ*+Od!UÜ_½’D–lÆvÕ§²5†`u]Ñ6”kØŽ4­µ²¡è-·M¡œ²Ôf—Ò·Žyfb²«’¸¢˜nWâJ5ï¹Ó¢æвµù•cøÂ$¯Kì~͵n›­° 7ìðÃG,±T!þ’This GIF file was assembled by CDavis with GIF Construction Set from: Alchemy Mindworks Inc. P.O. Box 500 Beeton, Ontario L0G 1A0 CANADA. !ù €,L>ü H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²dA(Sª\Ér¥É…NjI“æÌ— cÊ JÏž@ƒöü©ó¦H ‹þŠ2hJ§2rD)@*0£.µšª©O®[µvDÙ•@ª³Xsjjõé×¶lÅ6$æÙ«wÓÒ5¨”mW¯)»ÆÝ9- ½Í¢Í{ø,ÒEgúu8ìÎÇ Ó5|’®b¼‹Œ¼ô­S¯C£J%ˆx3è«|C¿f ™´ÐÛ¸Ic¨¹qhº»q}vmÛB—N­•êÀÏÐóþ-½8çª(U/g»ysêûÖ_þ9¼qáÙµã^?¸9yó³ßï‹>²döëí§¾|pÞó§_Mª6Ó~ÏÁ‡ÖÏ•‡vé(á„Þ„`‚.ä}õ W!*IøØ…¾õçІ£9gßNÀ´èâ‹ÀðÇúAÈškhq¨áƒ®8SŒ)ÁãŒ5ÚHg¡f>$JBÊH£L:×àƒmÜh:‰QIeŠô!I‘–6 $˜0JY$dH¢X‘™'u¹¦“mŠ©Ah긑š*…9åž|j’šB¾è昉aéÑ€x&Úbˆ„âÄåe1aJ„Yzi… véiŠš–J¢§¦¦:*©”©¸êA*=äÒ«°žª­´ç®¹ê𔕽ò,B¼k$±ÃKªO9Ūl}<ëWL%‹*QÉMËÖi¯.WÚ~H¡†šS•;R¸Âáçìvç‘®»Õ¶;îm_2xn~)Á.÷ïµÉåkn¼2zk0Áõê À.9,oÄ[.ºÏf¬ñÆwìñÇ#!ù €,L>ü H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²dA(Sª\Ér¥É…NjI“æÌ— cÊ JÏž@ƒöü©ó&΃EE4eS™Fž„ª@ªTL}ZÅ 4©TƒI»bÍš’ëPª vèX¢(ÍúDËÀÕµj7)Ö©V«U©¨{×nªµ÷*ýÛ4ëYºóR{÷êáœ5Á*ʹ³âÁ ãµ,šh‚q ¶|PJ¨|…’]üx'ÊФsW¾Z÷êË_Sí¬•øÞ™­'[Ö}˜uä«[[Eì%ìØÄ_Où|9s¬ûÏ¥.PøðìÚasÇí½¹sƒ†ÛSW¹½¦ýú¼Æo8yèý’•gÞuhà`ë ´ŸwÔ%¤V€"h röY·]„ìÉ—Öƒ¨ñvÜNÀ„(âˆÀðÇÇ–àd”‘Ö`]&øáL%¦Db‰'¦\~ rуx™vڌԈÒ&¢x!†ÿAjµFd("™ã’6èãDP¾8%JU’˜¤Ž¨q¤E[¢V`‘`)æ•êÁ×eH_Úø¦’qÊy&[kÞx'™¥éQŠGú)"}y~åš`1Uh!…;)ZÞ„”NèNŽfê’¤šv*i„Ú÷éI+¤Ҩšñhꥄ¨–Š«¨Vk‡³Žêjª±*t뎵¶Ê¬›æ*+Od!UÜ_½’D–lÆvÕ§²5†`u]Ñ6”kØŽ4­µ²¡è-·M¡œ²Ôf—Ò·Žyfb²«’¸¢˜nWâJ5ï¹Ó¢æвµù•cøÂ$¯Kì~͵n›­° 7ìðÃG,±T!þThis space for rent...!ù €,L>ü H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²dA(Sª\Ér¥É…NjI“æÌ— cÊ JÏž@ƒöü©ó¦H ‹þŠ2hJ§2rD)@*0£.µšª©O®[µvDÙ•@ª³Xsjjõé×¶lÅ6$æÙ«wÓÒ5¨”mW¯)»ÆÝ9- ½Í¢Í{ø,ÒEgúu8ìÎÇ Ó5|’®b¼‹Œ¼ô­S¯C£J%ˆx3è«|C¿f ™´ÐÛ¸Ic¨¹qhº»q}vmÛB—N­•êÀÏÐóþ-½8çª(U/g»ysêûÖ_þ9¼qáÙµã^?¸9yó³ßï‹>²döëí§¾|pÞó§_Mª6Ó~ÏÁ‡ÖÏ•‡vé(á„Þ„`‚.ä}õ W!*IøØ…¾õçІ£9gßNÀ´èâ‹ÀðÇúAÈškhq¨áƒ®8SŒ)ÁãŒ5ÚHg¡f>$JBÊH£L:×àƒmÜh:‰QIeŠô!I‘–6 $˜0JY$dH¢X‘™'u¹¦“mŠ©Ah긑š*…9åž|j’šB¾è昉aéÑ€x&Úbˆ„âÄåe1aJ„Yzi… véiŠš–J¢§¦¦:*©”©¸êA*=äÒ«°žª­´ç®¹ê𔕽ò,B¼k$±ÃKªO9Ūl}<ëWL%‹*QÉMËÖi¯.WÚ~H¡†šS•;R¸Âáçìvç‘®»Õ¶;îm_2xn~)Á.÷ïµÉåkn¼2zk0Áõê À.9,oÄ[.ºÏf¬ñÆwìñÇ#!ù €,L>ü H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²dA(Sª\Ér¥É…NjI“æÌ— cÊ JÏž@ƒöü©ó&΃EE4eS™Fž„ª@ªTL}ZÅ 4©TƒI»bÍš’ëPª vèX¢(ÍúDËÀÕµj7)Ö©V«U©¨{×nªµ÷*ýÛ4ëYºóR{÷êáœ5Á*ʹ³âÁ ãµ,šh‚q ¶|PJ¨|…’]üx'ÊФsW¾Z÷êË_Sí¬•øÞ™­'[Ö}˜uä«[[Eì%ìØÄ_Où|9s¬ûÏ¥.PøðìÚasÇí½¹sƒ†ÛSW¹½¦ýú¼Æo8yèý’•gÞuhà`ë ´ŸwÔ%¤V€"h röY·]„ìÉ—Öƒ¨ñvÜNÀ„(âˆÀðÇÇ–àd”‘Ö`]&øáL%¦Db‰'¦\~ rуx™vڌԈÒ&¢x!†ÿAjµFd("™ã’6èãDP¾8%JU’˜¤Ž¨q¤E[¢V`‘`)æ•êÁ×eH_Úø¦’qÊy&[kÞx'™¥éQŠGú)"}y~åš`1Uh!…;)ZÞ„”NèNŽfê’¤šv*i„Ú÷éI+¤Ҩšñhꥄ¨–Š«¨Vk‡³Žêjª±*t뎵¶Ê¬›æ*+Od!UÜ_½’D–lÆvÕ§²5†`u]Ñ6”kØŽ4­µ²¡è-·M¡œ²Ôf—Ò·Žyfb²«’¸¢˜nWâJ5ï¹Ó¢æвµù•cøÂ$¯Kì~͵n›­° 7ìðÃG,±T!þïThis GIF file was assembled with GIF Construction Set from: Alchemy Mindworks Inc. P.O. Box 500 Beeton, Ontario L0G 1A0 CANADA. This comment block will not appear in files created with a registered version of GIF Construction Set;ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/flowbox.rb000066400000000000000000000173001511343406000240620ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Flow Box GtkFlowBox allows flexible and responsive grids which reflow as needed and support sorting and filtering. The children of a GtkFlowBox are regular widgets =end class ColorSwatch < Gtk::Button def initialize(color) super(:label => nil) area = Gtk::DrawingArea.new area.set_size_request(24, 24) area.signal_connect "draw" do |_widget, cr| rgba = Gdk::RGBA.parse(color) if rgba cr.set_source_rgba(rgba.to_a) cr.paint end end add(area) show_all end end class FlowboxDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Flow Box" @window.set_default_size(400, 600) scrolled = Gtk::ScrolledWindow.new scrolled.set_policy(:never, :automatic) flowbox = Gtk::FlowBox.new flowbox.valign = :start flowbox.max_children_per_line = 36 flowbox.selection_mode = :none scrolled.add(flowbox) @window.add(scrolled) COLORS.each do |color| flowbox.add(ColorSwatch.new(color)) end scrolled.show_all end def run if !@window.visible? @window.show_all else @window.destroy end @window end COLORS =%w(AliceBlue AntiqueWhite AntiqueWhite1 AntiqueWhite2 AntiqueWhite3 AntiqueWhite4 aqua aquamarine aquamarine1 aquamarine2 aquamarine3 aquamarine4 azure azure1 azure2 azure3 azure4 beige bisque bisque1 bisque2 bisque3 bisque4 black BlanchedAlmond blue blue1 blue2 blue3 blue4 BlueViolet brown brown1 brown2 brown3 brown4 burlywood burlywood1 burlywood2 burlywood3 burlywood4 CadetBlue CadetBlue1 CadetBlue2 CadetBlue3 CadetBlue4 chartreuse chartreuse1 chartreuse2 chartreuse3 chartreuse4 chocolate chocolate1 chocolate2 chocolate3 chocolate4 coral coral1 coral2 coral3 coral4 CornflowerBlue cornsilk cornsilk1 cornsilk2 cornsilk3 cornsilk4 crimson cyan cyan1 cyan2 cyan3 cyan4 DarkBlue DarkCyan DarkGoldenrod DarkGoldenrod1 DarkGoldenrod2 DarkGoldenrod3 DarkGoldenrod4 DarkGray DarkGreen DarkGrey DarkKhaki DarkMagenta DarkOliveGreen DarkOliveGreen1 DarkOliveGreen2 DarkOliveGreen3 DarkOliveGreen4 DarkOrange DarkOrange1 DarkOrange2 DarkOrange3 DarkOrange4 DarkOrchid DarkOrchid1 DarkOrchid2 DarkOrchid3 DarkOrchid4 DarkRed DarkSalmon DarkSeaGreen DarkSeaGreen1 DarkSeaGreen2 DarkSeaGreen3 DarkSeaGreen4 DarkSlateBlue DarkSlateGray DarkSlateGray1 DarkSlateGray2 DarkSlateGray3 DarkSlateGray4 DarkSlateGrey DarkTurquoise DarkViolet DeepPink DeepPink1 DeepPink2 DeepPink3 DeepPink4 DeepSkyBlue DeepSkyBlue1 DeepSkyBlue2 DeepSkyBlue3 DeepSkyBlue4 DimGray DimGrey DodgerBlue DodgerBlue1 DodgerBlue2 DodgerBlue3 DodgerBlue4 firebrick firebrick1 firebrick2 firebrick3 firebrick4 FloralWhite ForestGreen fuchsia gainsboro GhostWhite gold gold1 gold2 gold3 gold4 goldenrod goldenrod1 goldenrod2 goldenrod3 goldenrod4 gray gray0 gray1 gray10 gray100 gray11 gray12 gray13 gray14 gray15 gray16 gray17 gray18 gray19 gray2 gray20 gray21 gray22 gray23 gray24 gray25 gray26 gray27 gray28 gray29 gray3 gray30 gray31 gray32 gray33 gray34 gray35 gray36 gray37 gray38 gray39 gray4 gray40 gray41 gray42 gray43 gray44 gray45 gray46 gray47 gray48 gray49 gray5 gray50 gray51 gray52 gray53 gray54 gray55 gray56 gray57 gray58 gray59 gray6 gray60 gray61 gray62 gray63 gray64 gray65 gray66 gray67 gray68 gray69 gray7 gray70 gray71 gray72 gray73 gray74 gray75 gray76 gray77 gray78 gray79 gray8 gray80 gray81 gray82 gray83 gray84 gray85 gray86 gray87 gray88 gray89 gray9 gray90 gray91 gray92 gray93 gray94 gray95 gray96 gray97 gray98 gray99 green green1 green2 green3 green4 GreenYellow grey grey0 grey1 grey10 grey100 grey11 grey12 grey13 grey14 grey15 grey16 grey17 grey18 grey19 grey2 grey20 grey21 grey22 grey23 grey24 grey25 grey26 grey27 grey28 grey29 grey3 grey30 grey31 grey32 grey33 grey34 grey35 grey36 grey37 grey38 grey39 grey4 grey40 grey41 grey42 grey43 grey44 grey45 grey46 grey47 grey48 grey49 grey5 grey50 grey51 grey52 grey53 grey54 grey55 grey56 grey57 grey58 grey59 grey6 grey60 grey61 grey62 grey63 grey64 grey65 grey66 grey67 grey68 grey69 grey7 grey70 grey71 grey72 grey73 grey74 grey75 grey76 grey77 grey78 grey79 grey8 grey80 grey81 grey82 grey83 grey84 grey85 grey86 grey87 grey88 grey89 grey9 grey90 grey91 grey92 grey93 grey94 grey95 grey96 grey97 grey98 grey99 honeydew honeydew1 honeydew2 honeydew3 honeydew4 HotPink HotPink1 HotPink2 HotPink3 HotPink4 IndianRed IndianRed1 IndianRed2 IndianRed3 IndianRed4 indigo ivory ivory1 ivory2 ivory3 ivory4 khaki khaki1 khaki2 khaki3 khaki4 lavender LavenderBlush LavenderBlush1 LavenderBlush2 LavenderBlush3 LavenderBlush4 LawnGreen LemonChiffon LemonChiffon1 LemonChiffon2 LemonChiffon3 LemonChiffon4 LightBlue LightBlue1 LightBlue2 LightBlue3 LightBlue4 LightCoral LightCyan LightCyan1 LightCyan2 LightCyan3 LightCyan4 LightGoldenrod LightGoldenrod1 LightGoldenrod2 LightGoldenrod3 LightGoldenrod4 LightGoldenrodYellow LightGray LightGreen LightGrey LightPink LightPink1 LightPink2 LightPink3 LightPink4 LightSalmon LightSalmon1 LightSalmon2 LightSalmon3 LightSalmon4 LightSeaGreen LightSkyBlue LightSkyBlue1 LightSkyBlue2 LightSkyBlue3 LightSkyBlue4 LightSlateBlue LightSlateGray LightSlateGrey LightSteelBlue LightSteelBlue1 LightSteelBlue2 LightSteelBlue3 LightSteelBlue4 LightYellow LightYellow1 LightYellow2 LightYellow3 LightYellow4 lime LimeGreen linen magenta magenta1 magenta2 magenta3 magenta4 maroon maroon1 maroon2 maroon3 maroon4 MediumAquamarine MediumBlue MediumOrchid MediumOrchid1 MediumOrchid2 MediumOrchid3 MediumOrchid4 MediumPurple MediumPurple1 MediumPurple2 MediumPurple3 MediumPurple4 MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed MidnightBlue MintCream MistyRose MistyRose1 MistyRose2 MistyRose3 MistyRose4 moccasin NavajoWhite NavajoWhite1 NavajoWhite2 NavajoWhite3 NavajoWhite4 navy NavyBlue OldLace olive OliveDrab OliveDrab1 OliveDrab2 OliveDrab3 OliveDrab4 orange orange1 orange2 orange3 orange4 OrangeRed OrangeRed1 OrangeRed2 OrangeRed3 OrangeRed4 orchid orchid1 orchid2 orchid3 orchid4 PaleGoldenrod PaleGreen PaleGreen1 PaleGreen2 PaleGreen3 PaleGreen4 PaleTurquoise PaleTurquoise1 PaleTurquoise2 PaleTurquoise3 PaleTurquoise4 PaleVioletRed PaleVioletRed1 PaleVioletRed2 PaleVioletRed3 PaleVioletRed4 PapayaWhip PeachPuff PeachPuff1 PeachPuff2 PeachPuff3 PeachPuff4 peru pink pink1 pink2 pink3 pink4 plum plum1 plum2 plum3 plum4 PowderBlue purple purple1 purple2 purple3 purple4 red red1 red2 red3 red4 RosyBrown RosyBrown1 RosyBrown2 RosyBrown3 RosyBrown4 RoyalBlue RoyalBlue1 RoyalBlue2 RoyalBlue3 RoyalBlue4 SaddleBrown salmon salmon1 salmon2 salmon3 salmon4 SandyBrown SeaGreen SeaGreen1 SeaGreen2 SeaGreen3 SeaGreen4 seashell seashell1 seashell2 seashell3 seashell4 sienna sienna1 sienna2 sienna3 sienna4 silver SkyBlue SkyBlue1 SkyBlue2 SkyBlue3 SkyBlue4 SlateBlue SlateBlue1 SlateBlue2 SlateBlue3 SlateBlue4 SlateGray SlateGray1 SlateGray2 SlateGray3 SlateGray4 SlateGrey snow snow1 snow2 snow3 snow4 SpringGreen SpringGreen1 SpringGreen2 SpringGreen3 SpringGreen4 SteelBlue SteelBlue1 SteelBlue2 SteelBlue3 SteelBlue4 tan tan1 tan2 tan3 tan4 teal thistle thistle1 thistle2 thistle3 thistle4 tomato tomato1 tomato2 tomato3 tomato4 turquoise turquoise1 turquoise2 turquoise3 turquoise4 violet VioletRed VioletRed1 VioletRed2 VioletRed3 VioletRed4 wheat wheat1 wheat2 wheat3 wheat4 white WhiteSmoke yellow yellow1 yellow2 yellow3 yellow4 YellowGreen) end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/font-features.ui000066400000000000000000001576571511343406000252220ustar00rootroot00000000000000 600 500 1 1 Font Features 1 1 1 Reset 1 view-refresh-symbolic 1 1 1 never 1 1 10 vertical 6 1 1 1 Sans 12 1 1 1 20 20 10 vertical 1 1 1 1 Enabled 1 1 1 1 1 Kerning 1 1 1 1 20 20 10 vertical 1 1 1 1 Common 1 1 1 1 1 1 1 1 Discretionary 1 1 1 1 1 1 1 1 1 Historical 1 1 1 1 2 1 1 1 1 Contextual 1 1 1 1 3 1 Ligatures 2 1 1 1 20 20 10 vertical 1 1 1 1 Small Caps 1 1 1 1 1 1 1 1 Small Caps from Caps 1 1 1 1 1 1 Letter Case 3 1 1 1 20 20 10 vertical Default 1 1 1 1 Lining 1 1 1 1 numcasedefault 1 Old-Style 1 1 1 1 numcasedefault 2 1 Number Case 4 1 1 1 20 20 10 vertical Default 1 1 1 1 Proportional 1 1 1 1 numspacedefault 1 Tabular 1 1 1 1 numspacedefault 2 1 Number Spacing 5 1 1 1 20 20 10 vertical Off 1 1 1 1 Normal 1 1 1 1 fractiondefault 1 Alternate 1 1 1 1 fractiondefault 2 1 Fractions 6 1 1 1 20 20 10 vertical 1 1 1 1 Slashed Zero 1 1 1 1 1 1 1 1 Alt. Annotation 1 1 1 1 1 1 Numeric Extras 7 1 1 1 20 20 10 vertical 1 1 1 1 Swash 1 1 1 1 1 1 1 1 Contextual 1 1 1 1 1 1 1 1 1 Historical 1 1 1 1 2 1 1 1 1 Stylistic 1 1 1 1 3 1 Character Alternatives 8 1 1 1 20 20 10 vertical 1 1 1 1 Set 1 1 1 1 1 1 1 1 1 Set 2 1 1 1 1 1 1 1 1 1 Set 3 1 1 1 1 2 1 1 1 1 Set 4 1 1 1 1 3 1 1 1 1 Set 5 1 1 1 1 4 1 Alternative Stylistic Sets 9 1 vertical 1 20 20 20 20 1 1 1 0 0 start label 1 Lucky affluent actor asks to feast on giant 10.34" cheese-filled quiche in fjord. start entry 1 1 20 20 20 0 1 1 1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/font_features.rb000066400000000000000000000067071511343406000252570ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Pango/Font Features This demonstrates support for OpenType font features with Pango attributes. The attributes can be used manually or via Pango markup. =end class FontFeaturesDemo def initialize(_main_window) initialize_builder initialize_widgets builder_add_callback_symbols update(@toggle, @entry, @font, @settings, @label) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_builder @builder = Gtk::Builder.new(:resource => "/font_features/font-features.ui") end def initialize_widgets @window = @builder["window"] @label = @builder["label"] @settings = @builder["settings"] @resetbutton = @builder["reset"] @font = @builder["font"] @numcasedefault = @builder["numcasedefault"] @numspacedefault = @builder["numspacedefault"] @fractiondefault = @builder["fractiondefault"] @stack = @builder["stack"] @entry = @builder["entry"] @toggle = [] %w(kern liga dlig hlig clig smcp c2sc lnum onum pnum tnum frac afrc zero nalt swsh calt hist salt ss01 ss02 ss03 ss04 ss05).each do |name| @toggle << @builder[name] end @text = nil end def builder_add_callback_symbols @builder.connect_signals do |name| case name when "reset" reset_callback when "update" update_callback when "switch_to_entry" switch_to_entry_callback when "switch_to_label" switch_to_label_callback when "entry_key_press" entry_key_press_callback end end end def reset_callback proc do @numcasedefault.active = true @numspacedefault.active = true @fractiondefault.active = true @toggle.each do |widget| if widget.class != Gtk::RadioButton widget.active = false widget.sensitive = false end end end end def update_callback proc do update(@toggle, @entry, @font, @settings, @label) end end def switch_to_entry_callback proc do @text = @entry.text @stack.visible_child_name = "entry" end end def switch_to_label_callback proc do @text = nil @stack.set_visible_child_name("label") update(@toggle, @entry, @font, @settings, @label) end end def entry_key_press_callback proc do |_entry, event| if event.keyval == Gdk::Keyval::KEY_Escape @entry.text = @text @text = nil @stack.set_visible_child_name("label") update(@toggle, @entry, @font, @settings, @label) end Gdk::Event::PROPAGATE end end def update(toggle, entry, font, settings, label) text = entry.text font_desc = font.font s = "" has_feature = false toggle.each do |widget| next unless widget.sensitive? if widget.class == Gtk::RadioButton if widget.active? s += ", " if has_feature s += widget.builder_name s += " 1" has_feature = true end else s += ", " if has_feature s += widget.builder_name s += widget.active? ? " 1" : " 0" has_feature = true end end font_settings = s settings.text = font_settings s = "#{text}" label.markup = s end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/glarea-gl.fs.glsl000066400000000000000000000002751511343406000252050ustar00rootroot00000000000000#version 330 out vec4 outputColor; void main() { float lerpVal = gl_FragCoord.y / 500.0f; outputColor = mix(vec4(1.0f, 0.85f, 0.35f, 1.0f), vec4(0.2f, 0.2f, 0.2f, 1.0f), lerpVal); } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/glarea-gl.vs.glsl000066400000000000000000000001701511343406000252170ustar00rootroot00000000000000#version 330 layout(location = 0) in vec4 position; uniform mat4 mvp; void main() { gl_Position = mvp * position; } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/glarea-gles.fs.glsl000066400000000000000000000002611511343406000255300ustar00rootroot00000000000000precision highp float; void main() { float lerpVal = gl_FragCoord.y / 500.0f; gl_FragColor = mix(vec4(1.0f, 0.85f, 0.35f, 1.0f), vec4(0.2f, 0.2f, 0.2f, 1.0f), lerpVal); } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/glarea-gles.vs.glsl000066400000000000000000000001351511343406000255500ustar00rootroot00000000000000attribute vec4 position; uniform mat4 mvp; void main() { gl_Position = mvp * position; } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/glarea.rb000066400000000000000000000173251511343406000236440ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = OpenGL Area GtkGLArea is a widget that allows custom drawing using OpenGL calls. =end begin require "opengl" rescue LoadError puts("opengl-bindings gem is required") raise end OpenGL.load_lib class GlareaDemo include OpenGL X_AXIS, Y_AXIS, Z_AXIS = (0..2).to_a # The object we are drawing VERTEX_DATA = [0.0, 0.5, 0.0, 1.0, 0.5, -0.366, 0.0, 1.0, -0.5, -0.366, 0.0, 1.0].freeze def initialize(main_window) # Rotation angles on each axis @rotation_angles = [0.0, 0.0, 0.0] @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "OpenGL Area" @window.set_default_size(400, 600) box = Gtk::Box.new(:vertical, false) box.margin = 12 box.spacing = 6 @window.add(box) @gl_area = Gtk::GLArea.new @gl_area.hexpand = true @gl_area.vexpand = true box.add(@gl_area) # We need to initialize and free GL resources, so we use # the realize and unrealize signals on the widget @gl_area.signal_connect "realize" do |widget| # We need to set up our state when we realize the GtkGLArea widget widget.make_current unless widget.error init_buffers @program, @mvp_location = init_shaders(widget) end end @gl_area.signal_connect "unrealize" do |widget| widget.make_current unless widget.error # We should tear down the state when unrealizing glDeleteProgram(@program) end end # The main "draw" call for GtkGLArea @gl_area.signal_connect "render" do |area, _context| return false if area.error # Clear the viewport glClearColor(0.5, 0.5, 0.5, 1.0) glClear(GL_COLOR_BUFFER_BIT) draw_triangle glFlush true end controls = Gtk::Box.new(:vertical, false) box.add(controls) controls.hexpand = true (0..2).each do |i| controls.add(create_axis_slider(i)) end button = Gtk::Button.new(:label => "Quit") button.hexpand = true box.add(button) button.signal_connect "clicked" do @window.destroy end end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def init_buffers vao = " " glGenVertexArrays(1, vao) gl_vao = vao.unpack("L")[0] @position_buffer = gl_vao glBindVertexArray(gl_vao) # This is the buffer that holds the vertices buffer = " " glGenBuffers(1, buffer) gl_vbo = buffer.unpack("L")[0] glBindBuffer(GL_ARRAY_BUFFER, gl_vbo) glBufferData(GL_ARRAY_BUFFER, 3 * 4 * Fiddle::SIZEOF_FLOAT, VERTEX_DATA.pack("F*"), GL_STATIC_DRAW) glBindBuffer(GL_ARRAY_BUFFER, 0) end # Initialize shaders and link them into a programm def init_shaders(widget) context = widget.context if context.use_es? vertex_path = "/glarea/glarea-gles.vs.glsl" fragment_path = "/glarea/glarea-gles.fs.glsl" else vertex_path = "/glarea/glarea-gl.vs.glsl" fragment_path = "/glarea/glarea-gl.fs.glsl" end src_vertex = Gio::Resources.lookup_data(vertex_path, 0) src_fragment = Gio::Resources.lookup_data(fragment_path, 0) vertex = create_shader(GL_VERTEX_SHADER, src_vertex) return [0, nil] if vertex.zero? fragment = create_shader(GL_FRAGMENT_SHADER, src_fragment) return [0, nil] if fragment.zero? program = glCreateProgram glAttachShader(program, vertex) glAttachShader(program, fragment) glLinkProgram(program) # Check if the program is valid linked_buf = " " glGetProgramiv(program, GL_LINK_STATUS, linked_buf) status = linked_buf.unpack("L")[0] if status.zero? log_len = " " glGetShaderiv(program, GL_INFO_LOG_LENGTH, log_len) len = log_len.unpack("L")[0] info_log = " " * (len + 1) glGetProgramInfoLog(program, len, nil, info_log) STDERR.puts "Linking failure:\n#{info_log}\n" glDeleteProgram(program) glDeleteShader(vertex) glDeleteShader(fragment) program = 0 end mvp = glGetUniformLocation(program, "mvp") [program, mvp] end def create_shader(type, source) # Load the shaders sources shader = glCreateShader(type) glShaderSource(shader, 1, [source.pointer].pack("j"), [source.size].pack("I")) # Compile the vertex shader glCompileShader(shader) # Check the vertex shader compilation compiled_buf = " " glGetShaderiv(shader, GL_COMPILE_STATUS, compiled_buf) status = compiled_buf.unpack("L")[0] if status.zero? log_len = " " glGetShaderiv(shader, GL_INFO_LOG_LENGTH, log_len) len = log_len.unpack("L")[0] info_log = " " * (len + 1) glGetShaderInfoLog(shader, len, nil, info_log) type_name = type == GL_VERTEX_SHADER ? "vertex" : "fragment" STDERR.puts "Compile failure in #{type_name}:\n#{info_log}" return 0 end shader end def draw_triangle # Compute the model view projection matrix using the rotation angles # specified through the GtkRange widgets mvp = compute_mvp # Use our program glUseProgram(@program) # Update the "mvp" matrix we use in the shader glUniformMatrix4fv(@mvp_location, 1, GL_FALSE, mvp.pack("F16")) # Use the vertices in our buffer glBindBuffer(GL_ARRAY_BUFFER, @position_buffer) glEnableVertexAttribArray(0) glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0) # Draw the three vertices as a triangle glDrawArrays(GL_TRIANGLES, 0, 3) # We finished using the buffers and program glDisableVertexAttribArray(0) glBindBuffer(GL_ARRAY_BUFFER, 0) glUseProgram(0) end def compute_mvp phi = @rotation_angles[X_AXIS] theta = @rotation_angles[Y_AXIS] psi = @rotation_angles[Z_AXIS] res = Array.new(16, 0.0) x = phi * (Math::PI / 180.0) y = theta * (Math::PI / 180.0) z = psi * (Math::PI / 180.0) c1 = Math.cos(x) c2 = Math.cos(y) c3 = Math.cos(z) s1 = Math.sin(x) s2 = Math.sin(y) s3 = Math.sin(z) c3c2 = c3 * c2 s3c1 = s3 * c1 c3s2s1 = c3 * s2 * s1 s3s1 = s3 * s1 c3s2c1 = c3 * s2 * c1 s3c2 = s3 * c2 c3c1 = c3 * c1 s3s2s1 = s3 * s2 * s1 c3s1 = c3 * s1 s3s2c1 = s3 * s2 * c1 c2s1 = c2 * s1 c2c1 = c2 * c1 # initialize to the identity matrix res[0] = 1.0 res[5] = 1.0 res[10] = 1.0 res[15] = 1.0 # apply all three rotations using the three matrices: # # ⎡ c3 s3 0 ⎤ ⎡ c2 0 -s2 ⎤ ⎡ 1 0 0 ⎤ # ⎢ -s3 c3 0 ⎥ ⎢ 0 1 0 ⎥ ⎢ 0 c1 s1 ⎥ # ⎣ 0 0 1 ⎦ ⎣ s2 0 c2 ⎦ ⎣ 0 -s1 c1 ⎦ res[0] = c3c2 res[1] = -s3c2 res[2] = s2 res[3] = 0.0 res[4] = s3c1 + c3s2s1 res[5] = c3c1 - s3s2s1 res[6] = -c2s1 res[7] = 0.0 res[8] = s3s1 - c3s2c1 res[9] = c3s1 + s3s2c1 res[10] = c2c1 res[11] = 0.0 res[12] = 0.0 res[13] = 0.0 res[14] = 0.0 res[15] = 1.0 res end def create_axis_slider(axis) box = Gtk::Box.new(:horizontal, 0) text = case axis when X_AXIS "X axis" when Y_AXIS "Y axis" when Z_AXIS "Z axis" end label = Gtk::Label.new(text) box.add(label) label.show adj = Gtk::Adjustment.new(0.0, 0.0, 360.0, 1.0, 12.0, 0.0) adj.signal_connect "value-changed" do |widget| # Updte the rotation angle @rotation_angles[axis] = widget.value # Update the contents of the GL drawing area @gl_area.queue_draw end slider = Gtk::Scale.new(:horizontal, adj) box.add(slider) slider.hexpand = true slider.show box.show box end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnome-applets.png000066400000000000000000000060221511343406000253350ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA± üabKGDÿÿÿ ½§“ pHYs``zxEtIMEÐ (–ªŠ IDATxÚíšYŒ×u†¿Ú«»§»g㢤9Ò–dk¡MÑ–I¦@Ó’F² 'P q^b=Fâ ûI6ò”<YÀÉk Iˆ Ã@LÙ¢hQ#ÒÒˆÔˆξw³»ºö5}‹(·‡Ãe˜<)à  =·«þÿžÿœ{î¹#qs—$L.ÜK…¿gK ÷·ü’v\&¬H aùý-'r#äpU˜V¸W csÀ1,'“þoÈg])€6„é˽‘Ï~ „@Ðc±°[â õ: (à&PÌOÝsp÷3_:z|dxèpÉ4È’4'±á:NàØöZ³eM¯®o¾}ú½÷ߘ]XYïóÅ3ãB|üy@.€Ï—Ÿ|ìsû¿ö•§¿yûÞ½_“$‰,ËH’˜(Š ‚ß÷ñ<ϱ±]ÛvX[ßøÉÙ>úÑGç/nÁÉN(×9ó&P*/ÿ»üüÄñíÞ=r¿a–0Œº®£ëŠª **²,!!‘IR–B–¡ªò§†û_쯹³ +baGRR¶/dS*ÿ·?ø«{ïýÄ·+}5Õ,•)•ʦ‰n¨ª†ªj]ðR7² Ò4%Mb’$%NRUS¥/ì®Ì.¬¾ÙCâ–È¥£ç³ÿwóò÷ÆÆö}£Tî£T*S®”)•K覉a訪Š,É¿$’4!‰câ8!Šc’8¤‡ëåÅ•Í;%¡l3ûj>û?øþwÿäÀ»ÿ¼\©R*•)U*”ÊeÌRÃ4Q5EQd².ø$é‚•ð}Ÿ(މã˜8ŽˆÂˆLÊ•Kzk}³}¦^o˜„| ÚÓÇž¿{ß_꺎¦i¦iš˜å åJõŠ™å ¦ib˜š¦Ñ¯‚”¡êЬ )2²¬¢¨ ²,S)›ß®Ò°t+üNö9vôñoišnÊ²Š¢¨hš†¦F Ã,Q*WɃYӻ໱Ð/Ë Š,Q®T”î½$uM–es°¿ï;B¦ê6x®›@±Lкdp°ÿÅî edYñ)Ë2ªªc–úPUýÊwH2ùxI’d Y’»™ª\'Nº*‘$©û2Yz±RÖïr½a/ÈÛ¥Ï'}x"K3²,#ËR²,ƒ,íf–4%ŽC|Ï&ŽÃ+ß!Æåã³4#ÍR$Ecy­I(Wøpz«ã`Ù®RíÓ¿*2Ý {AÞ¦XS«ÕÊ#išt2‰ºEDa@x¾‡çv| ðˆÂ€(êŽKÓ˜$‰IÓ„4MI’Çqyá…xüèqÖ7/Ó±]TM£R.?ôÝŒämô¯jŠüÉ8ê®°QÔøÝ•Öw\§sÅ|×Á÷}¿K" C¢(&ŽºÙÈj5Ñ4z—^z‰;Flj☡¡a\Ï¿è/xAÚ‰®H“dO…A@„¾‹ï{xŽƒëØ¸¶…ݱpm ×±ñß÷|·;>£( ˜››g}}3gÞ£^ïgâ¹ç¨Vð\›,Í€ r£IÝ®úŒ¢Ðô=ïÊ +Ë]¾išE!ªª‘×B¹¼ßÅs=<ÏízÊó‚ÇõHâÿxí ‡wqäÈþú‡/£ëŠ¢*À° X¢àK®g]Ø.`$ÏóƒÀï‚Y_ßä¿Nüš8ΰ;mÛ¢cµéXÝOǶÄ÷Žcã:.žçŠø高øžËüü¿9u’0 ˜xî9ÒTUM€A &d¤]o0÷z ¸äâÜRóàø¾Û$I¢i9œýà<©¤òÈáдnž¿V5êx>—–™_fßþýì“eNœøtާŽ=Í/~þSJ†‰¨ uDµ*]Ë ÊUÖ(ùìCǧ/ÌÜÖ±]‚žxž³gÏ"e]ï¦iJŠ rñ|×qXZ\âÌÔ4—æ?È“?J…LNž& <×feeOßÿ‹ óÆek h 9b3tM]Í)Üq×þÿð…?:ôãþfæù³ïaee…ŸýçëŒÞ¹—O#IRV×6(—L.·ÚX–EÛ² ‚ñxæÙϳ²4χS°´¼€m;ŒŽÞN¬,^âÈçá×_KóŠW”í†À]kû©l³SSSkjæýÙ‰çYZ^å GŸâ¶½{ù‡ü'—ÛL›Æó|6M66[ôUk<ðÀƒ<úØcÿÒãÝSorñâǬo¬awl‚0$cöìÆ45ÖÖ79vü™ìäÉ“«À²ðBGr|-[y ßGËíÍÏOÿ¼Ùl›úxÅÅÆÇ0>>Îî]CܵŒGŽf×®aÂÀ'Í2,Ëbò·y·cÑhlà!žïá{>A!I…ƒÃÃ8V‹™ù¥ö=÷=X6Mó“¾ï¿½Å{Û8Ø*f9 xÿüÅWJ%ýI×q´Öåˬ­®ò¹‡?ÿþäÒ4¦ÝXãö=à I,ÌÏ’¥)aF1AAÅ1iS2M¢8¥¿V#ô¼ìÜôìlËþ÷êÄÄľW_}õN`¦ÐénvC“×C†ï‡Š¥¾ŠyŸë‡È²ÂÚê çΟ'=š–ÕÂî´ñ=? ñÿʪì!q#Ë2%䯯J¥ÆÐàozw}yus©Ùl^[[[«†aø« äëÙR–›­N§Z1ïlµÛ{² &'ß%ŠBÈRü Ä45â$&ŠÅ¬ûq% ’$¡© }• õZZµŠ¦›\º4c>{þ`˲fFFF5‹ÀA (lvnzSo}Í–mÉÄw¾szrÀ¶;¨ªBÿAà¡k*ª"“$ i’"+2Šª ©*¦aP¯Õì¯Ó_¯£éKË«ö/ßšœÎÁ–ã8‹Õju¤Õj'F!³›%{¡T;¶çÊ%IÒUU¦Z­aª*ÓW)£ë:•rÓ0é«”©×ê R«V©Öjhºž½õö鿩ɩ1Ã9ÐnµZoO¿>.´^n(ˆ‹íÁHôpZÀ°FÉFûòm»‡²f£Q¾{l CM쯡j*º¦#ÉJwK©t72ïœy?üÍäÔ\ÇvÛâ™¶ ‘›'´ÿ ðmàõë©…¶# öÐVå,ˆ¦gç C3TEÙsï½uM×ÕáÁ!YQU)#ËÚm+_Üˆææ—Üóæ?%! ¯@ ÓCÀ^>üðãkõ¤ëÈR†(u÷cÀ3À—óâ¥e‘·Õž¼]lðÊÀA¡í¬“ë_x¸)nˆ¢î/€o+Ûuï”›hîZÀQ`Q¼,ï<¸ùlúiŒO®ôŸ›U c‹g“7y³A|52ð”7]èB‡Ð9p¯ ™@xqª ›bç–ÇÆo?ÞÏÞÞÝÚ§Eý~ªp·Ò{ ¸ÂÖ‚tc Řð€5à.àaàÍ[A€‚¾ëÀ}À/ eÇÕäfç bà\„ŠæŠßGÀYàëÀÏÄDí˜@®Å6ð$ðÓ-<ÐE/´E,¼·Eäà=ñ¬<VDâ8q³Å//™¥¯.Ù‹!¾â¦<+d£M`·ÈPV˜³ø<}þðCÑv±wêbÉ}H¤¾ÙB&*za+9Bÿ{€zÀçõ4zó³µQàâ­$Pr8ÓC 7zeÔ^š)|çÀoÕ©ž à²{Ãê‹üü Èy Õ·XÔ~o£$š¹Qá·aáðïjmöÓ¢õÒØ "˜E‘êÜÂB¦b xvœõÄÂP‹ZÔsž|µEkSØŽ%”_‰XòóüÝ{.^å˜52* @ñNÁwBhŸÈJiOýÓ{È]´Xd¡ìZåò­8'ÞîZ† ®O º—¶YG2AdÇÝ;õ@ÔîÑzo—o«þøÿëÿÄõßÄÖAýkåIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnome-calendar.png000066400000000000000000000053031511343406000254370ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA† 1è–_ zIDATxÚí™]lWÇwvvwÖñÆÞÆNvc7ޓ֤¡}ˆB‘òÐ"TDA¨ VT­è‡¢Ò¨¼ òQ Ayªh¥‚à)•BB ŠRˆª>Ñ Tb'µó¹‰¿¿âÙ]Û;wwfîåaïìŽ7N²*ªD®u5³ã™;çÎÿœû¿wàN»Óî´;íNûnân“þ¤·0¨;ôÿ€èÀx½É}â†ë°?&ÃEÚÌx± …ôÍ@tàwßù¦RJ£µ"T!õ@QW …@ a „H Í_(®yJÀ6'C"™"aÛ$ì ËBûuüZ ß÷ ”BiM*ü ¤*=ܪD©;ÀÏweúBB­ E*öãˆÈes8ÝN£Û2H)A6žûÁË/éOïèãù×^Žã˜ÁZãJ)[?J%èíà•#/h´ÆÊl°34ç*Àê€ÒøaH†(­ÄÐω|>Ïêê*¡c76º $2äïÙ'\O6.8y}ìàB‘¹·ßÆ1€¾úÜaá…ŠÕÔ‘Êmãs‡u™'¬X¿ aH B|r÷ן£P(J¥(^)R¯Ô‘R¶¼´€ÔÕòúšD–J”NžDΗ^ä݈¢aîýòc_ÛûõkG-VVW6l ·í¶|êé#bhǶm†!nÅe~y¾e 9Fhfªòƒ¡ÛA^GÎÏ#‹ã”ÆÆ7Ð)rÀpðø¾$^<|˜þîñ]À ÙÞQøJ¡”"“Ìpyò2•• îªK­V£^­oð¸ $ŽíÄʈ†œà C÷;QØ{üI¤ÓÈ¥nÏc‹ë2}ü8ŸÙÚ­ôÎ;¿r€–k€ß ᇠLÙd´Gíàui²ëëÈ ãà8ƃ@ ñ"Z!§Š&7Ú—Ö½@^x¾Oÿì,kÕ*Ëóóœ)-l À]€o[¹€fMöƒ¥Cz8@oäܸ ¯K‰;7ÇÄ™ vïÛÝ(d6LJããxà½h-€œ©`µ¿¿Oèû¬•ËŒ—]í5êMØdU`ÎPHw@…„ª1’c; â9¦âD5#Mœ™@.}@îþ²7¾Övg«)â:Åç?€çyäóyF+CüëÜ ?ùí l÷ÖõSÏKôl ð=ŸÉË“¤R)¶/¢¶fY˜˜àZ©Ä)ßÇJgÈõäDeYZXbbGëFÐíç@oÐ84©ÓÛÛËÞ½¬­­á¤ÓX5ŸååeÖì!Jå:­ÉÌO“àêûïS)—¹¸¶N)‘ ¯¿‘‘òù<‰DËBˆÍ KsIjßb­£3­ukò±ÁénH‚Lƒ£-êÀ¶mÛ¨«:=çÏS­×¹zõ*ÊRìܽ“|`áž=Ët*Eya¹•ÎÙî,ÃCà  è!Z£ ‰˜×o™í‹pݘ´hoT£ã8­óxïvØ}ÏnºººH%möÝ¿ƒŸ=ÈÈÐõ‹çyøÕW©{K®ËDbmé&¿#ÏÀÀéTù]‹8¬X[7Ë뢠…Fk´c;¢¡ã$N·Ó(jAã7@.›kF)“Ì`Û6IÛfïÐ^r¹ 'þJßð0Çßxƒ]<ÂGî 3W®ÒßÛËž={ÈårXV˧ Ñô§h¡o6ëödÖZ£ôƆHŒI)7H Ä”W­5™L†ÕÙz³YæGG™>wŽ3cc¯ûd³Y†v 180Hº+Mm½Ö¢‚@ÄìQ›íNt¥µR|ï™'õÈCÜî^’øé_áéC‘ïïgzt”%×eTk–ì Z«25;…5¿‘ÑIX£ƒÂØ®h¡&û”B¯ûŠrÝçÄ»ÇtÛ[ˆjE“ºZj…c'¸«Ëak*Í®áa1yêK®ËTu]Tõ🰺Æ%o©ñ³€nl(r ñ ò~ض½rCÇ4 „¸Éd'„Æ„:o!:zûçGîc¥XdòÂ&«ëzÂI“ô} !Ò©¤¶–h+ß´Ö-úGº7 ÝI4À[ïÏ=À`зšÅµ $M©³ceΪ_Ü¿ûž'F¾ýÑ{ï1>7wù—ccïÛ€^óž²kž1.Z°\–ÌÒ10ãŨNVdÚÜëfÀº9v)c|tŒ¶=‘Ž<úè 3ccLÎÌ”Ž‹¿1ãE94yÚµ0nzÅ“æz=Duøœ•‡:°3<êQ$" ÖSÞWŸ›¾4;»òûññ×Öjfyš1*À¤Qš‘XócÝ3ï“4‹vËøÛ‰@Ôj1/E†Æ£`Ç€X_9\)—ùÛ•+¯—J3Æø.3æªÑø3ÀŠ3¢†£Mݼ7ê·M!Ñ$h§b/³ã}½R™›™ùÃ_&'OÛͺÖ2ž]®Æt¾jKÒvqúè–NëlË|Ã"ßôDL£Ø±ódlû/º¾Øe¶G2&Ÿ&MÖŒ1A[¹Œz‹NР“m½É¹Ž½È2ƒFjm«+–´«¦ÌÏWqí3m<²íçú¶·×Ûô‡Š½°ý£„µIÔt¬¢”Ly\0×T[ŽÅ›ÚdK]ý·_ht[^´ oð•ÆQaÅPHÝäÓÓÍŽû7²ö1­Xy L2ê[|ôÓ|šh[ÏÞêÃ^Çí? Äž®™ðÄöIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnome-foot.png000066400000000000000000000055441511343406000246440ustar00rootroot00000000000000‰PNG  IHDR/0§#âgAMA† 1è–_ IDATxÚíYkl×y=wfvvf¹»Ü—ø¶)Q¢‡®Ūl#H¬¨qd×mT i›4N A †´(Šnì šþ‹]Ë l´µì<ä§â8vÜ*–#%RDY$MJæŠÏå>¸»Ü÷Ìì¼·?2T ·€,‹T\À0»³çžïÜs¿ ¼_ï×e»/ýׇ Ýóµ»oß>Ð:qj¼Àýþ…^Ú·o߉¡¡m÷Xíæ—pöd åWMËjoô1Wð[â?kll,°cûСT*5â:6ÑM‹•$eW2þobï ð¿xù¥ÑÉ3§ò“Ç}ò3ºÿÆõü›¯}õ–xgô¥­PUÕÑjI´3&–cïò¸ß+øûÆwM&â rÕ¿%vì£{vÝ€ïéîú”$+Œ¥µQ)à˜:ÚšN•¶Æ˜–ýU¿OðdçΑ/ËR³7ODzHKR"ÉxôûÉDb›ªëƒ–!ÍzKéÏAHˆiY0  ïíR»’ºÜedLU©ó(fàyêQŠ–¤ôïûàݵr‘]] Cj6ѪU!É”¶J-Ë€€a³å>—­Áå奂‹JŠ‚zµ‚|q “ççˆEï0Ÿyúçæm{©¦µA=åJ™|¶ã¬7xx#™¿l«ÔuSÛ6Ð}Wz6˜™#gÞ˜%r[%-¹M²«¥ƒ–i|¢Zov,e ˜|óŸçQÀpÀ"zÕÀ}åÃ_¼ëówÔª•âñ_Ÿ¬hšÚU®ÔvycŠª­­ àѦ¬¤Y†|´)ÉB&_‚ã¸Ä; àqÕ«¶ßtÓMb¹\^”¥–÷ÄcÏŽŒØ& ÁGÔ}F+îå8nÿu;·ÿhdhp6ÒZbæew7Û%5¿ÿ“· 3 3Ôjµ`*Íá-ñ賎û¤n˜xÊw€-8pàÀéh$Rwmcg.›#««…\½Ùšm´d몂g ¬•Kdjê,ÍJ(”*Û}–ïðk_zúâÏ~º'žHýíµ×^sk¤£#¥È-¦­Èdzü7vq5_ÏVONžKçÄøÔÌF8Î%5¯*²¸­'ö¹QcŽþêÎ]X„iÙÞõõëÞ÷Ío„<øýëGG¿ïŒÞÐV”Ë4PŠ¥…y°ŒäÃz[¾®Öl}¶Ñ”Nj†™¿Òƽ$ó¯O¾‘?õÛñ)ž#»³…"Ñ ::Bâͪ¦Ï?ôàƒ±OìûøK× îiTËðAªDZõ*ÄpÍz0 m[”6–V 1YQ¿ àO|¹mªÏKO½ø_·gìƒÿ^ªÔ†|Ÿ6“ƒiÙŸðÄ¥âûoå²¹‰ë¯Ù#vDP0Ƕ‰`Y®ëooÌÃÏ<—WšÕ'oûØ-_n˱LƒºA±œYA¦P„iÙòì͘˜¹óK˯êºF M%‘αM,Ë¢§+…Á¾"ƒýä¸å—~yâŸ^=ùú3,ÇÑžAÒOV³×u±V­_\Ùwâ>ïzVY©TÕ?øÀŽ/ÏlË$ŽãÀ²,DÂ!ùM%c¡î-‰”¤¨¯™–ýV0íù¥ÌÌŸÿåçìélV+T‘%drLÌ\€ãº0ày?m¸lÐ’•Úøë'ÇFGîL%“4D2IEMÀ £ÔëM‰F>ûéOÝy3Šõ¨·°ã׳ݽý}±X|wo_oÿÊü,µl ¶ãbi¥ãúåuSÜÆ/#[(=948ðÇ `zz{a[aY᎞GPIg,¾íÚí#ð úúûHu¡^-CmËช¥]XÉ_äÀÄ;ñú+™{¿˜>¾¶V™WU ¶mƒåX0, Ï£4ÚC<‘ЪW©®©`Yº¦"³Fni¥|¹•e̤Pk´Ößû ï$>\é|Þr=×NÆ"·«í6  CJY¦Ç’b!ǶÈZ±@MC#Å\†VË«¤V)cöÂ=vjªn¬çüïøÌ»› Þ[«5ò‚ ìòÜVI’a[xŽƒØÑA¢qD¢1†×¶‰ ŠXYZ¥ Éd2ôÔÙÌgrç[óçAWåfD/Wk3Çý‘G½„iZ„eâyxž'ˆe™„BD1D8–%kkeL›%ÇOOÂõ<øáí²æ^-ðÔõ¼FµÞœ$ 1-;Ñ”dhªF$©EmS'–eQ]Ó‰m0Mƒ,g2xýó8vê,Õ~7ð|Æ/çjf£Š0Ö½%ñÏÑŽÐ^Â0l8$Òî-I° ƒ(J=j;.–²«XÈäˆaZëÞÊbMoÖåÛ;M©C| ð-Q®8΂<‚< ‰‚øð‘.ZÀvÂ9®^ùµ›ç[O|›ãÇæ7ç~ލGQT m[TC´ˆHW"»I¡*xÜ5‡‚ ­÷á9`aaq6ºti—_úÅL>¸ÿ¾»yþ…ç8~ìa®\{¯-•'” €ˆZï ¯+‹D *øÖã€ÖûìŠA¡~6W¯^ãÄS?äч¢ªwoajB§?u”kïÿ…üý¯ˆ¶A0 ~,’SÔ‡5Äk<‚÷¤ªÇ·ÁE[ Â{Ñ`•3øîwžäó?ÂÇ?H3·g[_UUšfžÓg^êrBNv!Ú¦ª"ƒjÈê‚£ª¢ZÑÔBðÎqçQGåïg´Àç?Îþ{ösaál,B «všU•2+«FwQ3ÇžäµDìšq,Íc¹TD&L±`jÀý‡ŽpùoêEŒÐµ¥ˆM+bA /Vxs†5d  D:N‰Tg;Ýè„E]Ôô”öóô´)…ö;1Š GÉŠè4O#]ý0Ù\=AûZÍ+ƘžW‚éÆ$þŸéT;m÷ tí} eïg bU €m„J¾Ÿ(Q¥7·+Åûcb,)g³àÉJ]t÷fR¹DáÊÀí’OxIa¥ ¥%m‹‰2ÈA1Wxigt!ï»2kf«ýi: .çÈ4€$Ôô<‰ä ]9ûŽ0™LhÛ6×ûA;@P‰\.ðÙ•Œ¥ç6ÜL¤#Ó0qŽö\Gs|ÌfS¿ Xëˤ2;óÿV )(VÄ‚-]Ð Ÿ-¡’×0ÀAœ\ˆ!áCfD¥p MûgCƒØàV“+ »}fÊÉK2XÌ{(ŠùiUªUD’﹬™,˜LÓªõ+¼}¶°f!Xçvbã ¨¶$O XšÞ@ Nðê vèï%%•‚V“À˜_t[Ë®;•æaJl-æj`A“Ô{~G|uU¹¬ùÊ9œ«pUÑôL¢IÖ.^x— Þ ÆÁ¥Vhîà5Ñ_|½HÖ÷eùœ·‚Úm–ˆÙ=5‹»®¯š„¥EgÏ9ǙӿµF@n–îö÷O~ÄOL·ûü>p8ìs½ ˜ëMÌ M|¸1ÅT•Ò¹­MŒëBµÝÿç«YC"ÞÜO=Æ6j¼ÚŸ›¶’žoMz œy¡ë} Qsí¾;¸[øèÒo¨&™$J Ä ´X*£U7 tÿEƒIz€ì|í=ÛÿuF©MÖ–¢cÉÁ—W½—ºörÿ›‹Þ¢¶ÙÀô>k«öõαsÜúñ_÷MËÚÛG×CIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnome-fs-regular.png000066400000000000000000000034031511343406000257340ustar00rootroot00000000000000‰PNG  IHDR04Ì“»‘bKGDùC»¸IDATxÚÕšKoWDZCÚ4³Ð*HtEÊ¢,‚RBÃ+ÚO€Ô]Yõ#ðP%XtQ‰Hx4< ‚À’MT‰v”‡`ÄĵöÜÓ…3ž;wî±SPÒ+dß¹w|ÿó?çÌ5Àw€,„«»»ûéúõëúN`u ¹wïžè£P(È|Œb±(cccrôèQ_©õÀ{@*VܺuKDDfffÞŠ@J©†®r¹,ÅbQ¦¦¦dttÔWâ“8%R¼ƒ!"ˆHÃû*• ="“ɰyóf._¾ ðX´Ùä Mlݺu^×G¹\ ££ƒ-[¶044Dkk«S‰Ð—Û·oÏ‹àþ~abb¥™L†M›6qòä :::¬J¤æÃâºÀú~…çy58yžGww77~ÊñãÇM85ÍBsÜ&0ˆ¡ ”J%¦¦¦¸sçccc\½z•R©Ä† Ýœ:u à{`©O±Í&„â”hDh÷Úª ¶y_¡#GŽP,Q¾¡Y±¢‹={ö| ü€Jó¦žu.Ã÷D¥„¾¾>–/_N.—£Xü‡\îãããœ8qÂ߸dF…¦Ù<zl¡P ½½=Qp×ýF¬_]+³Ÿ!•JQ©T˜žžæáäÓiòù<££·8vìÀ.à`ÒÊB.Œ»‚ÏÄrTèãzÀ*¥jó"Uæñ¼Êìž* õô|ÆôtžÞÞ/éééñ·7ùš“,÷6¬`”Š*¨”ªyšŒ5Áý¶¶¶ÈS›u¶mÛ¦YEæ„å8Œ›Êxž2Œ¢´õ¾ðÕ¸(fhnnv—"Âèè(©TÊbéÏd’2Ë&Á=ÏSšð¢Á‰Ð_‰+W.ÓÞþÕtÍ67×ïѬEÄšæ½@ý{ô·õ}I9'¡íÛ¿¨eÂ$,»•±1²qÀ>veOîÞýù|ž„jT¸yóétºXDï)U½|·ûÐðÌD›W³óÕDXLö€Ý2,\kƒ‹ù“I‚5¶¬ޝº $;wîä͛׆2Ñø.Nf´`Â%¬¨X!+"ìÝ»çÏŸ%AH¸~ý:--­šûUH€*Ó(“H„I|hDÆ¥°bºg.\8ϲeËŠ^õ@ÃÆ$f€Û˜M÷€ÉLÅ&@H)¡··—R©T³Š¿Ñ,®¢Êˆ5ù…ƒÜF™6Á%ÂBû÷ —›LNd×®ýÆâÅ‹5H ±B8i™î×á\žÆLññ«N³Zsç†éêZ™ÄzpÚù\êêõBÌ^'‰³Ä¶C’zXH±k×. …£$p?Ôœ”k’³÷qµUUŽxò$!¥ô²ÕUÛç}fr1IØâRc³°ðbíÞDÃÃgYµjM2 éÖò» [ÿj«ƒ\Lb&-[IaÖWîJ !úúv“ÏOÐgwe+äìl$k KýYbbâqR"S\º4Bgç’cø–ðk•(Yæþðš(Da©¯:ÃêÕk“šhÛhòr´­´¹ßÖ¸»˜%êMkÕ!€þþ~^¾|Q³F”“ÅÑ™¹ß8؊ðÁÄ)´/Ç¡Cƒd³'×B##¿²tiFK(n&ÑÝï×6îîMBJ†ë&Sè(„Ξ=Ú5%çàýŒ$ZÛäñ¨«%¶s‹ë«yµŠpÙên)MеCg9n[÷úrpð0'CÈ/[£Ü«×*ÊÊ"ÑžXOnQ|“b"àÌ™_X»v]r°¥ñzP›ÔóvÛž’Ï!B™xß¾ýärO-Ör»}®‚ÛâŵopðkÆÇÿJnêÏŸ?GW× ë›ã(LpÙzh˸[X™Ó§fݺ“=”Ó$0†;‰¹--uŸ34rêȘœœpÔþâÌØs=Ù©WðÇ¿I†ÃÃC¬\¹Ú€L´·¹¿‘à‹Â.~}]rõ©IïeÞ…Å)€û÷ïÂÀÀ!ž<ÉZš”xú{Û¯#55… ”Íf혜œdff†±±ßgON<Òé4 eܽû'Ùl–W¯^YoÁü_¨ÎëG`Õû´Ú÷9ð>ТŸ.À!Àkà)0áŸCõè¾Hÿð€P*MZ0/dÁmŠ(€¶Cžú@eIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnome-gimp.png000066400000000000000000000065221511343406000246260ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA† 1è–_ IDATxÚíYkŒ]ÕuþÖ>¯{ï9wÞ¶gllÏcÌ#¿ ŸÏǯô _Q¬Ü¹ŸuÔ7­êu„p,+çÒ ô÷ˆk,ðËô !Ä]›×?¶ûáíw ˆ ˆ@ôÑïÒu Ü´ryñ™¿ýÓý=>ÙÙ‘/$~IDhxùÀÐm›Æ~¿G‰È±Óþü=fR.êÛùwóÍ'{Ë¡C"_"ÿ#aŸ¢×Ûýð¶¯cv*­KDäv€ €Ü‚ÎõVK’6»žWztçÖïlÚ0úá[Þ;à Á.ô 9ñÿ<ckGn¿çÎß°l¾R;yêì介~¿ &€ð/ûÞxóÔ™ ±µÃÿøí§~w¯ç:¾Â$\"ò:ÖAnçÿ(©EðëFWŽ~ùñž#AcR)Ä­ä4Ÿˆ\‚¥OKs{&¥–Rÿ@*=tÓªåÏüÁWŸ|B$ÈBøDäàp-‹xgp 7züK÷~Ûô”RH©¦™ àÑ¢rW\OBy¤ÑñŸŸžÛóÈöÇ“4+þîå+ÝŸŸüè®ë‰÷~úßxëWQ,øÐZ`ïo·l¼ÅR„Zõ2Þø‰Çß-»Žv´ hÉÐJC ­µžƒg@ 0`Àæì¹éÎOÌ\!°8 3˜™Áv3ûX ëºëÃ0üzE_s]÷^fv™yÚó\ñoÿú£·„<øöÛïЦM›°zÍü „óçÎà¾ñç^¹Ú0´ÖðƒÖo¸–-[‰Ç~ c8—…ÔȤD–IdR!ËÒ,­”êáj­9ûÞÑic´Äêœ_[6#)fÑžçݼaÆïmÞ¼ù!!Dqbb‚§¦¦¾Çñ?=þȶKõF|çþýûñâ‹/b``{öìÁ·Þ5kÇJýûöáðáÃÇ–-[ µÆªÕëP*¡V™µR1ÐZ[ðJçz3ˆWp’d•ŸþÙû™T©M€d† ˜óldS*wx===¿¾mÛ¶GÆÇǽf³Io¾ù&Åq<†¥?öƒÀ­Õªxå•Wh~~ív›™iš ·^{m?â8¦àرcüꫯBJ‰V«Ï©¶“¡•‚R R*(£Á h®Ö’ƱŸ='¥’20I.gN;–ïH¨C ìyÞýQy…Bív»ãr'šœ©Ñ'ó³Ïþ=·Z víÚ…F£3'`õØF´Ûm<óÌ3˜™™Áž={ešÍ&’$A;IÐI¹J(­ò{»Ëf0$©’GŸ¹¤”V (mb 0V:Ÿð@”rhrr‡B£ÑÀìì,„þ_ÄÑ£GP,Å¡ÿ…‰s¿@«>‡áÕq߃aëÖ­\«ÕðÔSO¡Ñh Ýn£R¹Œf}ÚæuÕ™ÚÀ0ÀlÎ#óôÙ©T*­µ-ðuM0·8O*Ü…””²=== fF–ehµZ(•Jˆ¢ˆ¢(9çÏÂÌô9¸Žá€€‰3'0¶nž~úi(¥RJT« 8{ê}°Î ”^ô‚Ö Ã &òØàV’fX &  fg“se×’Ð3Ÿ­×ë|߇ïûâ(B…p ÑhÆPÚ‡çûðáoìÿÊ}+àex~€´ÝÂÔ…SH“Jk´Zm´³ ÆÆÛÔI¶Úš¯ÔUšÉ@BÓfœU€̈¯_éLk½ßqœßaæ¢çyÃða!mU'mhÙ€=Ž`6`f,Ì¥? V¥lÆÉ$æj ApY)å›rðÔ‡s1€„rÍ×í¬è€oÛ}©c}ÓÉž‹i4˲wÇùaE{{zz¢0 Q.GÃ¥bóÏCÉZIÈT¡PÈày>èÚ=µ­erðJkLL]„TŒþ¾¤I¼¸‰q¾3ñôÌ|–´³€fnqTòÉuþxðÊ+ÁŒ€ÖºZ©Tž £(ð…Ja I\C³¾Y”V AAƒ™lI§Hcëš¶Ìp¹Ò‘‡ÁÁ2z˦š Íy5@Œ4“<5}©nÁב˦p•õ®Mëªà?q ‰ãx®^¯Š¢R{dyÿÝZ§…¹™IÌΜG&SH©rk@+©²üÄ„ÔnNõF ³s—qnb–î¹}3ÆV£¸íÕZZk”RæÄÉóÕv;[P!`„iÓfÌ[µºÎü¿`fŠã¸9;;{xýèÐHàêÛÛIS¤iFJ*è¼â Ci©²T¡ÕJ0;WÁôÌ<.^Z@’dèé-“ç»(øBˆå½ú£¡/ÐSt‰zÍÈ@ ´n/ë5̘jgò<€9ëŽþ•ÿ‰Ó]ë` ÀÛ¼qôÑLéß |ï¾,ËHÏ6Œ¸Õ†ì”B T,¢T* ·7BO¡¿¿Ê=ŠÅ"šÍSg±r0äÑ}ÜßS®K0H3‰…z‚jSÖÏUÝÚÁƒÿ¬^¯ŸôuWuú™~NLWņ̃ñëóñ©Žÿ÷0iÿORÑIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnome-gmush.png000066400000000000000000000062541511343406000250170ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA† 1è–_ cIDATxÚí˜[Œ$×YǧNUß{î{õŽ×qŒlb³K¸¯"„1RŒ2QL B âÍ‘xˆKHŒŠà„<8h­„`@‰ÀÂö‚/+lÇ»k{–ÝÙÞ¹ôLwOwuuÕ9U禪U Þ Á ¹¥£ª­©­úÿ¿ïÿ}ßÿ|ðûà÷ÁïÿõO¼/}àáO Ä­Ñh(.]X}îò[W;ÿ§ <öç_^qƜȄX‰ÂÑò02#Lš¡cÅ•+kÿzñìkŸÚèô®\ï³ýïèGÿäw}Ïñ?’³Ç“åp2Á&´N1iFÍ÷¹uùvœµÄñä¾è®Iuvr§;\{ß |å鯭4ëÍÓ‰ŠQ©ÆXƒµ¦dÖK½Rg¶5‹ÖŠV½–£íC‹¿¾ÓþÊûFàϾñ—'Ïø‚C¬L’˜ÌXpŽz½ïWðœGŽÉ¬a0걺&ð=ŸîÎÖY*íÆççš_ô£Kÿ+ý‹ÇŽ¼ç¾“ó­™cì‰Ì˜åI‘(…µ‹c¶9Ë\{k-ã¹)vGCâ$áÍÞÛh­Ù ‡8Ö8Kó_ô£_þ®xåÍWWgæW„'t–-§©"Ñ <çyDKf-&K1YF"ÆŒµøRø{¯BÙŒXÅ€ÂÚƒÿãzãò…æ–¾à oE› c-išbL†6ƒCzRJÖY `¬a4M Œ'!›;Û8OJZÍ6Õ Æh<&Mõ¡¥#s÷ïlì~û¦ œ»üæ±cŽ>.„XÉL†³vïÎb¬Ù+Ng0Æ¢2E–eh‚³8kq´I‰z]T–2Gd6Åó%"È@ÒnµY>| ‰`§ßãóoÌF¿ÀÍXë^=vxþÀóÆšek-Σ·½Ej @f22k±ÖâU|Æaóƒ™s¤Ö <‡Ò÷ñ«5d¢ñ$´Z-ª~@µRcŽFáÏÞ´„Ž,:½¹¹¾üû¿÷Û¼üâ|ßGzÂóðr¹T‚€f³IµZ!|: ç8pð ¹9Æã1·Üùa°¤ž@Jüß—x•+6]æ[³ =Ó¦Ñj>püÀOn_Þþ§÷" ßíb¬’c¾”ö3?Ï›Îíukñ¤O!¨ÂDQ„ÔkuffZlnl±´¸Àîλ½> ÕRiΟy‰¥ Êb« ÒŒÔ¦h“2 GlûŒÂ½Ñ.Ãh„­x÷†Wûü^¼wM‹”Ç„Œ†‚ ¤ï£µ" C¢(Bk š&;;=¶º]œu4š ÖÖ®T*¤:Å“q“fKss´dWºw>?vÛÜ}t™Z­Æ$‰ÙnÓ°RàÕ*?xð£·ýá {!kíÚoþƯ-?ÿܳ{ò‘r¯ËàH…NSßGú’v³I¥Ra8 ŸÌ ~ø¾“ôû#&qL’$øR²¸0ÃÖÆeŽÝr”Üs7Æ¢hÂ$NXö¹°»Å¥Íu”V$J¡µ&Ý®ÿêúWrX._ïMÀ9·ÒÝÚ<ýÙÏ|ß—~€çK)ž‡5–8I˜Lb²,¥Z­Òn·¸ç#ʼn¥iš’$ J©éò}É÷ÝyœÞ`€1†jµÂìÌ ó sÔ*úqÈ·Îýom¬¡RÖ)v{ôÃsÝö‘p°×/øoHœþöß?½ò[~qÊÖX‡µ!RJjÕ*‰RÄqÂOúiA)Åd2A)E’$ÄyŠcµZÁs çÀ9GµZáà%æçX\œgqaŽšðåoþëý.ÎºŽ½<øøøò “·Åñ=í´sît·»µòØ—åâÅ·ñ¥Dú>Rz{ã„D)>tû|üÔŒÇc´ÖDQDE$IB†ŒÇã) ¥Öjl–rôÈ!.-Òh68rè ³³mæææh6ê„:æOŸùþáõ³¸Ì|=|öß?—ƒŸ®kÚ8çV€ÓßøÛ¯óôÓGŽkY–‘$ ¿øK¿Šs‚$I¦ ƒiš2 DQD†(¥Ÿ­ÎAµ0;3ÃÑ#‡8~|™ã·Þ²Gfn–±ŽùüýÝÑ€tµww|±ßLNÀ\“•B<éœ[þÄÏüÜã?~ê+Ïýó?òâ Ïqþ;¯Ñh6xàÁO²¼|| \)…”ß÷‰¢ˆ,ËÇT*¤”cPJ!„G«UG @ÀöNŸI†!Î:”Ò>rC ‹tÃ]¼ƒ­q±ÿÕBÍ€»f3'„蟎G'~à‡~äñï½÷ûOîôº¬wÖ¸cùêõúôÞJ¥B–eH)B0™Lð}ÏóBàœCks‚ápÄÒâFƒ…ùY¸uùfÚmêÏ_ø¯]^!°“t¨ºÇu»ÑÙÖÌàG/®¯­4š­Gî¸ëî“K9”RT*¬µ8çBÐn·§×…!¦·Ö²´´H·»E0Dx<RzD™â¯Ÿ}ž¯½ô,BxX~+~uãË2¬µ¥cò}ƒ™ê˜õœÀ¯U°Â/°dÂôîäÕxkøRº1º˜ë½‘ƒV@µD¿)iš>’eÙd!0 i·Ûh­QJM H)ó°WI§FfëIo§ZGÉnÔÉ&js€µ\*•x-'áçFôÆk ÛížHÓôdš¦$Švéû>išRÎŽ1fZE'2ÆzkôÜ ×Ó9Ph-'PX“ϸ,þíÝàÇ0Okýéb–IL&“½è&É;ˆÙ|7Wœ‹½Ý 9ØÂÔrÉÔóUË£_Ïåm€w#àÏó©$I S Zkâ8ž- Öú$œsÓVëûþ‘ü™2[/HÒ)d$J8®ë«Ä<àgY¶ìyÃáF£A–eÄqŒÖ)åt¹>Œ1SÅ— çÜ<Ð.Ùd›iZ’OZ’_rÑ™#àÏœ9³R´È 9çHÓ”4Mñ}cÌÔJGQôŽVÉ[l4K`MI&|^”êB»¢ˆÀx<ö‹èJ)§¦M›|Puš¦Óm©sn:äòá¦öi¾ú. Ý»ì],`½ë_è4Ã0(¢]¯×ÙÜÜDkM†Xk™L&ÄqÌp8¤ÓéLk¢N^J©/]º•4îçEêçïû:Q±Šì¸É€|衇¾Yg¥R¡×ëÑï÷§rŠã˜ÑhÄÅ‹i·ÛÓùPH¨°qoïÓvP~Oa™óÐùÑäç×ìFž€¿»»ûª”ò^¥Íf“ííí©ßBÐétò=4h­±ÖNmv~ßî[o½µYÚÚ}Eœ•fÃþ•]oþ‘W^yå‰bÒV*¶··I’„(Šèv»¬­­Q¯×ÑZ¿£zžÇ`0¸töìÙs9˜8_ •Î‹ë ˜ä×t©C “׼Т_$•gžyfýþûï¿KJy[–e¬®®N-ÃÕ«WqÎÑh4ÞÑN{½^çõ×_£Óélç ’‰$çD&ÀØÍ­Å(?Nò¥-¯·…–ЬòÔSO™ŸŸïµZ­CµZmáüùó„aH–e4 ºÝîúÕ«W¯¼üò˯¯®®n(¥Æ¥ £\”ƒåÇaiKà‹ÿ›ŠkÌ€WD¾4-›À 0 ,³§NúX†Uç\õÅ_\Ëﯔ²XL¶¤e]’GqŒJ„ÂÒå׈kÌ@ÑŠq^x“VNb.?oæ«^j²”Å2h“Ÿg¥ÂTù=q~-*Iª,«$¿÷š&qÑ!Dþoߥ†Ê^-/£ây*–˺¨-e@åçª$¹"òE¯yOìö “´Ê–¢8É£”\£·¯Mš}ÒÙŸ³Ï²JJà³!PHÿ B*zg@–<++|~’_/À‹Ò+öÝŸ–†—¹î[ïRв4=½}5â—À{eßRÒº.]7¥³ßâ›R´m)Źû $Ý’vÚIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnome-gsame.png000066400000000000000000000102471511343406000247650ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA† 1è–_^IDATxÚíšYŒdWyÇçœ[{UïÓÝÓ3Ó³Ú3Áa0¶Ù+f1FÆ !äHI”üÁÛã7x–,­ígë„~SüÝwžoïéߟkÄ0×ÜØ3×éÖ«6Yžš,ñb×MWrâ?ñ[÷?ð®;Þï—¸j¯ÁÉ1ñª´œS¬|ÛúÕüÙzþüð¯oY®|ì³·S;s%æÔË>sjÈ\3àÒ–Ï\+Aˆ ÃðáÝËø‹{?ù»+%y‰¨2ñ•‚ð P/=Sç .>ÓâÙ˜cƘ2­j;ñ_ùÆã 'VFÿò;ïkä wN;û–÷‹›÷ÏÒnjúY›o9¼£Ê-‡¦ÉdG-ÎʽÍÓ¿¹ï†w?úÓŸ=‰ÂB()¥°ÖÚÒ9  4€&0L“Å÷Ð.~¯•$%KL(KùÕ~âŒ|ð± _ýèѹÏ|þβÕh#B³4§xÛKÜx`©F¼i‘猆¾çíF¨©?òÜIkm«!…ÆqcŒQ%®7 B§Y`ªô¹£xÞ)ÞuJRcñ–Ò|ã'g8Òù½wìò¤Õë :Å{S@Ž‚é‰6Ïs:ë.ª&é­Rœ0 îûÄ=yò;ßýþÀzRJ„üßÜÿ¡[Þ²t_«¥îØ}&Ì[iØ‹.»Y÷ø™­•o<òâó/^ÜØ*¸œà[@è{¥wò«\Ú ?Ýjµ§Ž]`Ì*ósÓÌLÍ1Ñô6GU0!u¸¸òÎ['¸<_çk?vÙ=“·§gÚŸTJ=$„õ¿ùÓ{ï¼ëƒ·}yzjòˆª(´ª¢½@$iŒI‡éååewùÎ÷ÝòÞgÏv7øÖ#O?wn}½ Ð/$3QHm«Ð¯d æ*ÂæÂòȹŽ­M0Qó¹aÏIŒJ˜DpS[1í(”Ðí¾ù=<¶Î³ç3†n$&ñ¥Ôq!„ûÏõù/Ý~Çmïo´[(¥‘J|„SG™”Äi¡j +-êÀ»ë•ù—î¹ûÁÿøù™¯?ü̉B•¦Jv1V%Sr·ú*äéA£5q*éæ‚8™7d*#Ö†õÌ’:5™óÖ%Á·žöyòlVàFŠ(—ÓJ©å¯|é÷îÜ1³Ïë®Xì.ŒQµMp4ƒ`³hL`â˜<Œh©ŒÜ~膉jeòo¿ýÄ3…Ô ÂEAtTH(äUF¼të=éTj i-Ö¤˜<åèNGîh–K§ôÝ?ŒøÑ³ß}jDàG“’ÐZØÛv9s7.ÍîR¢"hÔ µºÂ©+œªÁiÍéhªõ:N»‰”!ëT¤Â˜+jìh;Mdµqêâ†[?¦3/¹Úȯ0ÿ¶~Ñ‘j›cóaÞy¨#öN’$`&Ø4ä›?ùÑ ®"òINfcnžÊ'2k@VDÍÇ‘(åÐìÔ©7« 2!T«jHcäèj$Ø0Æ’¢-쟞\Ûòâµ-7. ×±alà ]¥Bi>Kç°ÕU!Ejg;šÝÓ¶*ðsÍfœ¡ý„ó[)y’@‚ÍEØ ÇÈ^˜“ˆ‹G³Ù ÕL™^˜B6v@£$Ãæ9J@ª¦ÐYJ£¢@¾cŽÖp@hís×;í}òôj·P¥ `¦°ö8V\ÀI‚‡b+~ÛfÕªR9›™¦ïÖ˜®ç¤Æ0r#ž?chŠ„½­˜—ü°EòbÙ5USÁб2wd›Ð™BÌD¶—EœFá(´Õ -•4ƶæÉu†Œ Ýr™œìa·"nR­ÃÎÍœ>¿²Y1U¿ @É2€»Þqà{¡78æ‡aÒsC^,yœræ\Ä£'\ækWÜ!œWbJCäv¸¹Fœd„IJšj²D£SÎ2ÈB Çê¥#lž’‹µòÇè\ƒ­¢S‡8ÍÐIÂM‡–æJ‘¼VŠÔ@]eýðß³ß8ú®3£‘ÿñlu2mu¢°©6¡ŠÅZ‘YÿvWÏë…™‰št”h6jLL´Xœ›{wN±gy–¥=;˜ÛwæŽd»#lm'Yæ,ÕÅ}T [“„¾ Í6Ns‚D:b¤jø¹•Ç^ºt¡äûG…¶®)€“ÇŸž{ìàMoùó™‡îö³Ú{µ¬.[œF–xšt+‘ñ(MÝ ë†AE¡l–ØZE‰ºÕT³'12ÈnFÖ’Þ/"QlÈÒœ02ˆJ+%A³¹¢mÎ ¯D)C~l‰"“oK¥m! õªdn[yǹOõyñÔ£À%!Ä)å‚RjV)5©”jK)kRJØ8ÉL]"† Æi昭ŒnÔil M3"§ÊÒáÝ„±"OZVéöc6F.[ƒ«#7Œ·ÕãïúU¹P‰xSD»qà‹[kSkmbŒ©Œst!Dî@<ߪ´•„Åv¥©:;fª4§êÔêÕZ£G(9 ´åìÏΑ)‡ /Ã#ü$'ÔeZˆ¬bk®Ax>.v^ @^îÖÞ¶Ö¶¬µMkmÍZ+1Ba1™BºIÂT­ÓnÕ+ÌÖ$“:µvg²…jTˆ3p¦$õ(c˜'ähõ‹Ãê3MrÓ&&4à HP¡™iz—6û%ºt ¯Næ®Ä;¥jÈZkó‚èT‘!ª€Xí½…™Úp©55Ýafv†ÙɪVÁhCœE˜4ƒÍMbé"¥ÕŒé‡7N±:!«ÕèÅhk3¬\é JúŸ”r¡øµ$PF;*å µ6|kí˜1ÆL5!D0?9uY>´û…@§1ÃnR”ìIài²Ä’Š:½î6Ü/ʉ㔠Ɉ2Ö¶hQ8¼ôòê¥r®\ÐáÄg¯*h^£Í1b!D`­ÖÚE`Ñ3U” @=vìüÚáÍ÷Þ´øV»0M†Ø "•’¡Ÿ‘IÇ ƒ$ ¢”¨2ÉÔì.f[‚ `uu{¸ý­‹W[Bk­g¡^ ,Ààü’®ÅØhk­B$ÖÚØZ;²ÖŽ„¯$WÖÚà|íáŸ?Ô¬¿§º7æpGj†¹Àè”zôè}“““³½þ ûØ£ÿýàO<ù­,ËümFŸWuòÌ¥ÇO]{lÿ®Å#3íæ-ªR=И˜^Z˜ßéäIÊå+ë~`6tõ– Ôkurã>­Îd³Z«Ö’8ÉŠ3T©Ì¬\3*_;w.6ï¿ï¾ï¿ÿ¾?:p`ïÞf³9—çzïDgân©Ä®µKkß)Ô†€±ÎfBˆXJ©Ý ZÝzÏt‡îïx÷{nÞ¿wï¼5g1IšàT+dy&²,#I‚0À |ò$›[7 ƒn©[ðH^ÀÑ·ßú‡ºóÎ÷Nœ8ÍêÊ%ý>ZqðàÁÏî^Þsw‰ë~)Ñê !z…®v¡b(„pçæd:HÁÌìá(‡4I±yFµRE IµZ¥Q«’=û.T¶Zp¾ZÄ%^+•xå:ò–›¿!I‘f)I’àù>žï3ò\šÍöGŸÝh)cTÖZ)„§cG ýQÐëõÛõz@»Õ¦ÕêÐï­2rG¸¾Kžk¤kHuNž…IAp¥Ôn×Ë…^¹¤R7a@§Ý¡ßâ¹.Q¢uŽ”’ÎôÔ½À¿Ž];vuÝÒZ«„!T¯Û}j¥QûÐÒâN¤RT+U¦f¦°XüÐC›œ Î0&' B?LKÞRns­Ùu¬^\yJ yÇââív‹~¿ÏІ1qáFCà¦bðpq1à !B@K)m!)¥”W.|Ïòž;}?°QS«Ö¼€Í Ò4Ú°–,JÐVŒ†~© o·åk×w£NÅÑÓ33÷^€ëzb8’¤)qœ„±]Y¹x2‚aÑ%¨b Ÿí !¥TV©TRÇqr)eá±ÎÔÄg´ÑÓiš’§9#o$Ò4EaÓ,QØ<ׄQ¬\|ùœÖÆ+eƽ®z@¨®†ÍÉ$‰öGIòÖáÈÃÑßóLæÊú•“ëëë/cÆ&Já~TäNÉÜÜ\^­Vm¥R1Žãh!eê/4šÍO…Qä ]$‰q]_x^Dèh¢µ1'Ž{&ËóÜo f¯@à&Ëò‡ÜÑ`%‰“Ù4ËjÃáàôË.üèòúú)!D§äF“¹…÷ 4Ón·)½4ÍιýÞãJÚ»ã0nú^@–eB'q’Æaú§_|á9?ºRªš5Æ-ö„oL ÅëŒÀªJìökgÑ£©ÄËÀËÀ…â°4­`aaAôû}Õl6fçæÿx¢Ó¾£V«íÜóƒ­n¯ßï_LŽãLçy¾^ì8 œ+Îê½Þ)¥,"à°ì ÕÂ}€MàR±ù ]gÞU/ºmóCöCŽ™Ò€Ãºß/˜² \KÁylAˆ[åÅýø»_ˆ×/MƒÆÞË-u¡Ç½ŸvÉóÄ%õJ©y#òÒ„D‡v @¶tpP¨Ôë™ûŽK×Qq?6Ô6Ð*y¶¨Ä ¯|ÆtKÕRRUÝVe¥ˆœn·×òØÅ~ÍbÕŠ5.e³mmõqA£•I}y`=ëNéù¸«‘m+À_ϾNi Jg”3Þ¤´÷›òW± ¥ùî¯ô÷’´e)q+·|ÌÿÅ%Ķê;Éû^sÏÿÖ1ÐÁaæIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gnu-keys.png000066400000000000000000000074141511343406000243320ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA± üaÃIDATxœí˜kt]e™Ç゙[rré-MÒ&iÚ4Io´Å¦ ´ÒŽÈÀ¨C;D™gPQ†¼T•²Æê×Tg´ule€‚´¢Pš^Ò¦—¤-msk’æ~9IÎmŸ}y÷|ˆ¸)¢ÂÌ—þÖ:Ÿö~÷yþûyþû}Ÿ.q‰K\âê»ü¬2 àC^‰ÅFíd"弋ÏK´¿t᪵ËUËrL+éÍ·RéuÕóæä-©YVV^ºzÍÚU+W­ —”•(=ݽœoí `˜L-(`Fy9&NÀ•šªaYVü왳Év½°mÛ·íª:ÿ/LÖ/zßeŸ½fÍÕ¯ºúÊB01o2µjyñù_³è²Å8®ÃPÿçšÏ±î¶uÜpà H)B0Äãqm_µòý[úûû¿ È¿VÀ;ñ@V(\{Ãß^¿îº¿¹fr(6¤  IG{ÏîÜÅæÿøÉx‚3¯céKàÕ½¯¢( ª*H$â|ñžÏ)ñT¼4h×?å]È‚òî¹üëeýÇn»eŽ®†©‡š¢Y9œkj¢xú4J¦—bè¶þd+W^y%ÕÕÕ¬ÿ‡õhBÃÐ š›š¸ûîÏÐÔÖL  ’™[³|aåÛýéœù³ßIl2F~~þ‡®¿îƒ+÷¨Õ&OÊGÓ Œ@UÓ©®ªâø‘|àA<×ÃÇç _øŽã 8n†S§Oòõ¯n$I1½¤UÂfV^~î<`wn~®ˆ ÅtÓ4'8ŽÉÉÍž-„Z¦éêXYyñÙÞÞÎTÂ’€÷æßÖª¢ÖÜ{ß½Û¿ô¯_šŽq¸®ŽãÇŽR\RȬŠJŠ I§lÚ[Û8yú%e¥¬^½UQÑ5•M›cÏî_‘•“EVvÏ•xŽK"‘ ¯§ï•y‹«n ƒ•/ï®»ñæßø’ò’iK–,ö55ä4kØ÷ê>+cY­Ï=û\mOwÏ0ð ÐÎxçmÿ×O~ú“/œ¿P „¨Be``}û÷ràÀ!ÊÊŠ)-Á¬Ù 3bÃÃlýÑÙ[»—i%…hšF*™$•Lc†u¬T††c§ÁPðÀôâ’Š;>u{áäÂ)j0Àµ%yyB’Ê` èp㉸õ퇿]WWWwôBç…ÇQ`ô¢òróJnþðÍ'¿ñÐ7†j€B4EÃ4L¤ï³oß«4Ÿk¦§¿‹p$ÂâË/§¿w]»þ‡ÁÁ¦•MÅP5úb$“q¤ëÓÖ|žtÚbáå—±öúkœÒ²r=šeltŒ_=ÿ"GeÓæÇÈÍÍG7t¤¯MÓ0MÓ÷¤×ûäö'ýÃü°þøñãß½¨€ÂÂÂÍ;~¹ãîòòrt]G"ñéIÏAÓ4¡0º®‹ÅhhlàÈázFÆFÈÉ 3:Ã÷$ccc$IFãcœ8zšÊ9ÜzÛG ‡B„B&äMæØ±c<óô.ª««¸é¦›)/+ÇW|Õ¢|f9ápEQP… <ÿÂ.·¾þøÐÓ¿xºúb&ÎÎ8™ÒŠÙøîøîo¨R‘¸ž‹°inm&77JÕÜj–-_Ƽyó9sö4gÎ"•Š“JY8R"}Ÿá¡·ßùqÊʦaè&šj`A4Måà¾ÃlذkÖ\ƒ¦k  ³óéÔ¾ZËÆolDUUt]§¥¥‰_û}ƒ}RL7^L@éG>ú‘2EUPuðéïëãøñÔ××ãù.+®ZJñ´Bz{zùþ¿of$6JEE% Š;î.ß' ÐßÝ˪Õïg΂ùHÏC× ²"Y˜z€@0H__/C±AŽ=Æ¡C‡Ø¹s'K–,aÓc›ض͑#uüÛ}÷ct¦L%O²xɼåÍ@QQQov(»ª­£Gþ&]]]Ì]PÅe‹1µ¨€ìHªªSPXÀ+¯À0LÚšÛhhlॗv“HÅ©¨˜‰c»H–.»ÓÐiiiÆq,²ª*QUáÃí·‚×ΞáÕ½ûÈÍËå¡GbÖÌYƒAžx|;wî$;7‹p(„¦*˜ƒ–æ–ª‹y øÁŒòïËËÏxãÍdá¢ùÍ0 §xþ…Ý öö³ó™_bÛfù»/›ª¨H_ÒÙy_î|І'˜<©‡¾ù¹9¹¨BcÇŽ§8yº¬ìå3Ë™;g¡P×s ˜&¾ªÁpl˜Ç}Œ£G3½´„RKÌ Òv¶5öVý€>3½tZ͆O~¼ìƒ7^/fÌ(£«³—¯=¸‘žž>.\ÄàÀwÜùI à­­áÁa&Mš„/}TM#;+ÏÑ#Çøä§?EQQ¢*ÌŸ;ŸË—ãz’ÎŽN¶oŠd*Iii¾2~nìçË÷}™îÞ.**g‰d‹‘ÉØhšŠ¦+HOjo.¡ˆaè‹ïüÇ 7\±rY…¢¨"޲õ¿ŸàÜÙ&6>¼‘¥55<óì.<×¥­¥•-?Üž÷pÓÍ7QZVŠi˜ öóo=BÝá:’©=Ý=¬X¶Çu°,‹¤›K–ÔpõÊUܱAR{`?ßûîwÉÎÉE 'OP6£ן‚"#±QtM! 12Cúž”Ê›K¨âcëo}ðÖõÿwcñ˜¡)ùùˆ ŽR0u ùù‡#<ú­ïp¾½ƒ“'©YZÃ]ÿt††ùâçîå|{EÓ èëígé’+xtÓ&©8¾ëc;6®çŽÑ„@Ó5BÁ0éLšî®nNŸ:…í¤¸ÐÓAr,M"1F*™&™Jáú.©x ¡Hñ´û† L™2eõº[o½ÉJY†›ñ‘Š ŠŠ§¢é:ŠP‘,²³³ÙýÒnÂá0ªªâã³ûÅ_ñ£-[H¦’L)žŒišDó¢?QÏðÈ3€‡‡çz(BAø8¶Ã`jES˜R0™¡¡!z{»HéáI#`ɤQ…FBz(¾B$’Õý‡Ìše5wÏš5+0!wÃ#Ãlßþs×aÑâ…0ƒø Ÿ[Ö}”P8‚P¶m£h ;žÚÁÖ­?&šeJáD‚x"®©ô ÷ÒÚÒJUUŽ;~Ðó¸¾;nð%Ž'Ñ4 UÅ?‚ø>D"YÃyù¹ßÿêƒ_¹å?·ð³í? —Ï,kšf:Žƒ”oÌ„m[¸ž+¤ç¢k&±¡¹¿öàñöópm÷ØïTTT,›]=[(Šòûº”Þx3޾¯SEŒ_Ï8R©Žë’É88®‡çI‚¦ª*šŽ"@Õâñ³+Ë_ŒF£¿êîêþâÕW\ýÜ=Ÿ½§©¹©ù|v4Û ƒ¨ªŠÀ²,\W MÓÑ ƒó-í郵ugóósîrm÷ù7d m¥½Ý½íšªùB<ÏÃr-¤/ñ<!žôpÜ7¦]Ótð\|O¢j vÆÁóÁ“>¾P@(hB;uáÂ…Ï5?=Èx'uÔ÷ýyjûS_ºöškO¬YµæpÝ¡:+>—š6¾MéËÞî>÷™»Úî«Û¾dù‚;O5ž;üæ’{}#»6//oÃ<°xÝmëòMÓŒ¦’)||×ÁõÜ?ªUUUéì¸Àkgèho#ã8Ø™ –e“N¥q‹3§ZÚ\/ó‰“ g_~K·‚ ÌÖTÏ©¾º²²ryAÁT[QeüÀþƒÁ¶ó­Ï&¶e,û7\dª÷ºÈ>“ÍYðäŽ''UTTT™3šL'ßÒlªªÒ××K}ýA¿³«CøRJ%A ’é”êÄk£Bãöžþg[šÛÿÔŒT²€èïâ˜4«Šhõ¤Ÿz»…o>JhÀBàÎÕkVÏÝúøÖjUSÙLÏóÞ DUUº»;©?vÐëììT¡aYvÆáÈ¡c=gN7==ö'ÿ«yóiT]ÀËm-mÝÛßV 3ÓK¦«ÑìháËqª¢Ò×ßCow·’L&0 ƒŽŽ Ní¾C½‰DüŸûzû·ò.LÞþ\¯“Τ’©Ã/íyÉÚûÛ½ÅݺÝeË—…r²sMÑÐ5ž¾.bÃÃ$ ¿áDcêx}ãk+V.þNg{ÏÏcC#4Ãy/x'³QÈV·¬]»¶êÊ«®œYZZêŒ Y{öìQ~û›WR‰ä¶ínaƒÿž¿ù×ùsÇë âw¿¨®ŽkwD"áß&Éöw?¼K\â—¸Ä{Ìÿê;Ô$Í誂IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/grab_cursor.png000066400000000000000000000025601511343406000250750ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±MIDATX…í–ÏkGÇ?»Zk¥J.8Ð4µŒˆBkƒ{IÈ¡à€¡÷` 5‚Á>zé!‡ü_kãLÁ—8´'_ƒ¡†º4 ­š€£´U‚~:–×–V–V»3=X^kI¶Óä ûÕŒÞûÎwÞìŸ[·n¡ª*“““˜¦Éüü|Ûäm4:p‡ß¾}ûàŽÃÌÌÌ‘‰÷Ñ´…-ø¿ÑT€”Ò …Bo#sÅbñ¾¾>­¿¿ÿ¿'PUΟ?/·¶¶Š4éšÖÀäääOóóó>|ø°eeÃ0ŽsmÓÑÑ!;;;= ¢Ñ(±XŒ©©©_8¸„Ü9­zB½··7vãÆoÏž=û…ßïÕ/“¶¨T*¶eYŽ¢(nÃ0ª³³³¿?xð`ˆ¿9êI+*¢À§ÀiZ«£pØfÁÞÊ3@HÕ¹l'@©' ²×\jmæ7âðéìÙnE BC[vTÀ}!Ê1æ%jß™·r¼ßü dƒC%÷iµIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/grabbing_cursor.png000066400000000000000000000023001511343406000257250ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±IDATX…í•ÍK+W‡Ÿ™˜›´Í~Ô Õj+èB, Ö•Ô•JŠèu%âºÿ€Ü)rÕtåÆlTêÆÂ%VĶÙ4½jÔF¥·'Mfæt£!¹Øè¶þ`˜ó›óõÌ{Î{<ëYÏzÖ¤ªj£ªª?꺞BÙlö§h4ê,€ô˜±*n¬iÚ ð•aUÀgÉdò“©©©ªÛÛ[æççu»Ý®!TY–5]×ÃN§ó â¡q«*Ìf³C‹euggG¿¹¹‘<´±±!///Ð××gñù|î½½=·×ëerrrvssSéïï_À(R€âÛX,&«ÆÆÆP¥Ð ‘HN§ ‡ÃtuuMMMßÍÍÍ}J¥~‡Ão€DÄL–L&³³¸¸(î:‹ÑÓÓSðÝÝÝ"üúúº¸W>ŸÏïîî¾>\TºO„Ÿær¹MUU·óùüU1@KK‹p¹\oµZE{{{Á‡B!ÑÛÛ+¼^¯˜˜˜º®KKKߟ5€üàä###/TUý=ë âììLH’T(›=>Ÿ¯Ä¯­­ÛÛÛ¿/Š–ÞtŒa·Û›B¡´µµ‰â° ñð2¦Óé¯i†aÈÀ{wsÆ2 Eccã—çççÚÁÁº®?*·#S‡ÃñÑþþ~¡Î0Œ’z·ÛËå*ë=‡£"€²iXæ`0XH»††R©~¿»ÝN2™ ®®ŽÚÚZ‰’$áp8JÒµbI’J... e¿ßO6›Åb±àóùp¹\\^^âp8p»Ý477sxxXh÷$Y–±Ùlÿú¾··Çðð0š¦‰D$‰@ €¢(D£QŽ ƒœžž²µµ…ÍfC–Ëg)€¦iÙêêjÃétšö\__Àét‹ÅJ|$)ñV«õq™Læ×ŽŽ©¾¾žëëë²+UMM‘J¥n19†Mÿpfffø{zzZx<œN瓟ÖÖV:;;åx<~†É}P.¿ß_YYùfhhh6—ËU)Šòè ä^ÕÕÕòÉÉÉŸ===KWWW¯×ÀùHYpŽŽöõ÷÷-IÒ‡š¦•_Ètttô×ìììÏoß¾ý ˆo•»(k ̯ZqWw ü\Oþ_÷õàïœá&¿ß•äË@>ë®ô+§Êà&IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/gtk-logo-rgb.gif000066400000000000000000000144331511343406000250430ustar00rootroot00000000000000GIF89akŒçÿÿÿïûõïô󪫹ÔÄèÔÜÔ˜¸­Æ¹ÅÄ/L”\lÀu’x 4# "7èÕï„x¤:Z¬5d Y$]'+4 ."dª¢Ü»Ò¼-E76Z7nNdlG7]9$7L 5(4…=`Ûëà-LE*48  ; &M–=rá2fÆpˆz$L-M¸>vâ!C‚ÌåÚ %<’/e®o{,D´9MG 'Þõç=WW +T›,[Ÿ’ª¬43\Ç,  7gÓOkw1U» Ã¸DVr¦” ‚¤Œ=!2kFZûîú&Rl #4Td\ھس˜JmÍ ,š~¬ÕÌâ($;DL&p,X%I 5'iU!¤):ÉFA9GDjÓÔÖÕe²)<9 H ØFE‚,)7 ëIKj)%6#&¨89;4P 4E&¶@4˜âÞ•pA àYhPJ,A‡~(Ût,0ñC&Η"ŠCÎwÅa¥…†Œ9ñŽˆÝ Û” @¡ƒƒ¼5¤ÚqGZp¤X@QHñ"\Ö6eS´d–¦Xä–:¼b¥˜R\T¥Ž 2AdvP0CMà  àp%‘õ ‰ƒ„¥ÝpÊRBY±D‡ÞMwÙlBL‘å h6¥l5„¢zP §þÜ10abK%qE‹9JY‚@+ÀªõÂ,Ø6儳æGÁ‚[j7°•¢2YЀët»Vaâ-œ:®ù…›#š,4!*}Ù51‚¬¥a° ü™ë¡šÈ"¶ùmÆB¥Nh[¿•V0…vCú0A ¸†TIZ´p&š:º *ƒLˆ(®¸³"›,¸h: ­‰¼1ÑBùÅ’[àŠ˜?8„[û;B: ¬ÃLÖ­;n|ÃpΗƒ¢$#F*`EÉÂuY ‚>¨C·ãF9âÀB«èCÝJÕ7Ô ôƒC#‰æ(ª¨–áÞ0BB¸ºÂGÉ@­fÍàþœCd6t·uCÞsù®yNDWAš†[ÖÍzv'»%Ô ­ŠÍÖ7\]¼ð凇‰€îœsSѹQTýaÜ[É`hRš"€Œ.ÙYúðÅe-d¦,Ù Ë÷BÓ¡¬âJAÂçqA´v`0@i,ÂUAì½<¶ñ@¿™Ø\b‰â'×^ÊcDÆQÖP†«pò6"˜Áù †ù›zkÖ|¸U)<ŠKô)\ *ÅŠõaI ÀO¿6S³Ø¹ê~EÌJšEêM˜ÃNþU»e-RrÊÁïJÓŠ…(!'€AÐT6 ¬{ZÚŽun7®”è„þ*ªÙ£æÄ›{ÉæC.H`ÐR¸%­Ì¯èŠ@œ0ƒ<1RÀ€ ä¶DMM-NCS| '·4áY?`ÂØ„ðUˆ&Ü[‘ìW4¸ÀBèŠf ƒ#\àjà€âÖ½ïõîY`€Ø‡(@¸½¡h°MØ\0„ïOwK$]œb!‹Ö•`!Ã,† °¡ nxCà ¼qP€_íz'‰Ìn#ãXHG ‰7´€B,j±† Ø!Vàc Ô9ÌlÈbtðAAn Tdî FFüÆjì© ÷¸HF&îm :¸.fÄ |ÈBìðÁ”wþÀCÌt€@ ,\Ц€|u°š½¹Ÿø@׃’±xDœ#o¨°† HF»èD x ìá4àCü€<üpá¢Æ»¬1!Œp] ‹4©ªmljôC別ˆÆ‚ hÀÒP2ôÂ6¸À/:º…#Ðà€DIñ 3¹èÓ4Ÿ§p;Žý€GºØ"Õòƒ–q>è¤ÅL ¤áÀ†\…A‚ #(yÌ B ˆ©â!„‚‹.PƒB”¯§>0\ ƒ&™ön`CøÁ¦bv™`òƒ½ó->`Èà k0ˆA aÜ@ Å@H‘†#ð!ª~Åþ"øY>¨ ôÓRWÛ‚&ÍQ>ÞT™ÝzGÂéJWXÁ†(c´¤%-%JP âÐäxjb[R? áE|@¬$@:·‹\c÷ô‡± @A—åÕÃVpOXÄ€n~I{Œ°i€"NÐ Œ”»xðÃ"PúÇ#`€ X«oü6Á(ÁnKÀ ®¤I¹êVG¸ÁÝç7н@2ˆðA¤REp ñÇI! .X£‰˜ ·`+c,øAC‡Æ?qQàr¯”O~€‹ÖÀ% ÆØotõ«ŒDªAyiÄBÚ‡Ë ^æN ½úŒ@’®ëØþˆ$®$à°¿ÔÁ"ó¥,C¿¤….t™ŸR$$Š Š`¿ dƒÔÀ‡4”á€(Š‚tš&ÖvÒæë Œ°„ Ôµk‰ñ]f¬vÄ^Ć©>¢Ðx ÃS£ùâ#À¡Uõ Í<Ô1±Þ`"7{“N#È SÎ5±‰ñ쌷\pˆÞA•Ð ‡{ÝH$Ћ$ÐKGZáPPÖ I$Ó‡qàyÝå¬8hùáw±um– ÜàW‚Ї~èÐCà ÇP‹K° ·§ƒËVZo!A @ŽæHW¦l˜{À!q` [s –Àâr|ðÜE¸ŒÝµ ‹F·”à øÑ‹K@o2¨}ѵrˆpqö #—<Ƹ÷´ t@~EAM)^ˆÁo`un "ems þ H†œ`а Ýpޤ¥ y|–ŽpÊðqÊЀ~¦0°ø’Û[ßà’€$x_—Hˆ~4à¤7Uƒ` 6Ðr¥ “¨ƒÁ  Ù`6P”r—_#W àtúÕ < ‘3@2›€É7UtPcA”}‚x° !¥„0Uß6Œ¸``†`à §gáW `Ž¥æÇdŒO@2Ü@}YR‘Pc€t&¢ˆj 16„°`|pxð ‹`Oƒž¹ ½È)• l9já 2$ mIZað°0°o± ß@|~… ¬Øš•öG~þ· „p àP×ø ƒ@A€‘æÈ $0oë°“£¶{ê Ëà™ÑUœpñlJ/À nÀ†  X•.²Lmà~ð€à߇¸QrÙ`Yðä™ ÂrÄ  ìUQ™qŽ.Òƒ‘ú)ÎøŸ±õ8˜ÙiJâ@Rt âÙ‹A€™¶G Ý`6P¡%Îð; ]Ê€‚áR ¹ˆbô lÏRÜ  j0ÕmÀ—o€ùväð~â飊@jÊ`‡H¦`à †€ %F‘ùAÈ _hbU†wÉФå› ¥{Xm„ kjt¦Ôr’Pþtʦ ÚAY`žÄ l†b)Z!7¦pqeŒq¬ã"›° µY|‚ ¥ýÈù4Un``pˆ`p¨j™Ž6à fðÌ` ÌÀ ÂU–•ÊC¡`r ¡'ä/ùyH [èW5 O w̉·óh*¤Ê°<„$°ù¨oq‹À«Qð"}PUTJ¬(•F÷”S% `¡ŽZŸdZ¦%œ0޵.Apg2 ÃÍ®OðG›–`›.§ ¢Zl°m÷Ø®K€6¯¤e¿Ù!7° °Î`‘ú£»ð“GWÎÖ¤N:Щ–pþ®.7Á^üX‹v{ZRnpl¦&f²ˆAËp Yà Šͺ­(†ô€²dò",+Å÷ á¢åš®®Ù•Œù®fÙ_Ú!ÎÀ cˆ+äÉ›¹Ø“`ЭõÀI°œŠ° [m3$Š+~@séz]êW‘ðÞ—£¶™BëP™!KàžÉ ¿yÚ€²€&Xäð‹·°VJ ^PkmöW[ìZi ÚZbG‰+4`>š2ð\ô©lëà!GP (+`µEp[hXWR·¥7+[€ÀŠ"y›’f™o 2 !‹¡…g] ¡€²Q þDÛ`Ÿ–|€µ G^Éf7à}Ê ¢ˆ1™Ë›¾ÃÙ–£u¾>š” !•0h}ðj`¹¹km»ËšÉZ|tp­% ¸ù•o¢žŸœ‚&¾Ð…ÑU¤„j a½æu›[m~ /˾Õö ,§ (V$P¦©{`wºº% Á Q 7``ç€ k°»¥qšÌC6pgxv“•¦7Ù‹©[f0²Ê¶ f2%`)Á‚ŇŸ7òb`Å÷Wt A$0Ÿ£f¤â¢·c¦ YYà“&æ `H7p‰ !`&PܲŸçä w…æ êÉŽÂùþØP­ ù›#\)Ç`Æ¤å ¨¢ °vƒÆç ÇêçWTL·3[ûkU˜Pþ lbzˆ•Ðˋ؈÷êT7œ £M…Ð’o å!¾ ÁΜM¡Ç° DMÝrI 7¸¥îà× £ Âç¹Z^h‚%ì “‰× êÀ;º\Xæ;°î°L3íãÙ¬ -ÒËë¡^m¾ k6)ÅÆ!F@ ï GçéíãEè4ÞÇt¬,ËÊæaVWWÿœ››ûЋye«=,Úý~ÿ·étºÑçóíO§Óض À½{÷Ü6@8fppùùy®]»¦Y–ÅØØÝÝÝ5gΜùÁ4ÍÖ–––ï€e ³€Ê÷íÛ÷óÓ§Oƒ333ÚÑ£GU>ÆÇÇ t]/òéªh¼^oÍF—Æãq±²²@0t“­©©‰ŠŠ fgg¨¯¯§®®ŽG!„@×u‰ÄxÊËËk,Ër½sìØ1÷eSSÉdÇCCC†a`Yº®S]]Mss3ÏŸ?wç½ €&„¨X]]-Z8"‘Ç'“ÉpõêU„œ8qÛ¶Æ4MNž<É£££Ûß @H)¥¦m]¥¯\¹â¶•R ¹ýL&ÃÀÀÀކó*j%“ɤ+++UÉ_ÙA{÷î%•J­• µ,ëIGGÁ`pׯ[[[ééé‘“““³€ ~¬Xœ÷twwºtéÒ/µµµ ±XLnÞ††aˆíB´Qº®kÏž=‹9räÇX,6Ìnfðþ:}úô×iš¶gã„D"‘ʾ¾‘ì¤ÅÅÅ¥óçÏÿ¾¼¼ü˜b€³@¾bé@PÃúÕKs¡ÜðÜI`qà/rg†­Îèü­¦Œ\íÞ|ýVlŠåÊÏsÈ@Ù×½×ÿH([[xIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/headerbar.rb000066400000000000000000000030701511343406000243160ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Header Bar GtkHeaderBar is a container that is suitable for implementing window titlebars. One of its features is that it can position a title (and optional subtitle) centered with regard to the full width, regardless of variable-width content at the left or right. It is commonly used with gtk_window_set_titlebar() =end class HeaderbarDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.set_default_size(600, 400) header = Gtk::HeaderBar.new header.show_close_button = true header.title = "Welcome to Facebook - Log in, sign up or learn more" header.has_subtitle = false button = Gtk::Button.new icon = Gio::ThemedIcon.new("mail-send-receive-symbolic") image = Gtk::Image.new(:icon => icon, :size => :button) button.add(image) header.pack_end(button) box = Gtk::Box.new(:horizontal, 0) box.style_context.add_class("linked") button = Gtk::Button.new image = Gtk::Image.new(:icon_name => "pan-start-symbolic", :size => :button) button.add(image) box.add(button) button = Gtk::Button.new image = Gtk::Image.new(:icon_name => "pan-end-symbolic", :size => :button) button.add(image) box.add(button) header.pack_start(box) @window.titlebar = header @window.add(Gtk::TextView.new) end def run if !@window.visible? @window.show_all else @window.destroy end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/help_cursor.png000066400000000000000000000030151511343406000251060ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±êIDATX…í–OLTWÆïÍtZë8JËŸˆ4)­iAŒ‚“¦„Ú˜’4I*¶–BC‰M\”6vÑ…%Á. e¡]¨ÑPÑcŒ1X@ˆÊ$€Ri¤B±80ÈÐùûÞ½]Ì 2Ö™ê(®ú%'/¹ï÷}ïÜóÝóà<9”ÑÑÑ•óóóÜn÷—˵ñÌ™3fÀ¨€²$¬V«UÕ4í#¯×û‹®ëš\MÓ.—«ëÆ{ÒÒÒ–‡Å<;!sss¯ú|¾ËBqöìY½¬¬LfggËÕ«WËœœY^^./\¸  !ä½{÷ú:” ,#T‘§ÃÌÌÌJŸÏ72>>(((@Ì(((·nÝÒfggÿÚ·oß»ÀЧ¡ø|¾¶©©©àš5kâ’G"%%EŽŒŒhcccÃ&“i=°m\¼¾wï^ÚÚÚBü~ìØ±N§Ó9|òäIJKK£òÛÛÛ•ÌÌ̵@`‰ÇõH8Î,)¥ÌÏÏ_øªääd977§·´´ôÀ·À—‡càܹsúâ ”””H)¥LMMýÈ!´ _UU“&&&Ö 1›ÍjMMM0\:-˸Åb‘‹óM&BéõzarãxŒZ0«&''£ÖÝn·zzÚ Œ¿Ý½{wKjjꇈj²¬¬,fff¼n·[焌)àöíÛC³³³5ׯ_Ïv¹\ÉBÀüü¼˜¦&''‹SRRŽ777ÓÒÒ²k0¨¬¬½½½£@ z,®XxPmveáØ lµÛí_!ô¦¦&¡(J”¤ßï× Ÿo†ß÷DP—԰בÑÞÞþ¾¦iþ£G ²ßþýû¥BÚl¶KÀw@1B‚‡‘N4DbÇŽ&ÇókwwwÐ`0D‘6ð \ ú«y»§§ç|0Û·o"¯¯¯—º®ËÚÚÚK„üÿ! ®â?\ðD"L&Ó:»ÝÞĶmÛžùb+Ìfóz‡ÃÑéõzʼn'¤®ëÒjµv,5y”ˆ¤¤¤ CCCׄÂf³ý Ø€r w)ÉáÁl°¤§§o²Z­ßêöO€‰'¢2"b9¼¸€?y 2!—L@$O!4åL„~8| display) @regular_cursor = Gdk::Cursor.new("text", :display => display) end def initialize_view @view = Gtk::TextView.new @view.wrap_mode = :word @view.left_margin = 20 @view.right_margin = 20 @buffer = @view.buffer end # Fills the buffer with text and interspersed links. In any real # hypertext app, this method would parse a file to identify the links. def show_page(page) @buffer.text = "" case page when 1 generate_page_1 when 2 generate_page_2 when 3 generate_page_3 end end def generate_page_1 iter = @buffer.get_iter_at(:offset => 0) @buffer.insert(iter, "Some text to show that simple ") insert_link(iter, "hyper text", 3) @buffer.insert(iter, " can easily be realized with ") insert_link(iter, "tags", 2) @buffer.insert(iter, ".") end def generate_page_2 iter = @buffer.get_iter_at(:offset => 0) @buffer.insert(iter, <<-EOF) A tag is an attribute that can be applied to some range of text. For example, a tag might be called "bold" and make the text inside the tag bold. However, the tag concept is more general than that; tags don't have to affect appearance. They can instead affect the behavior of mouse and key presses, "lock" a range of text so the user can't edit it, or countless other things.\n EOF insert_link(iter, "Go back", 1) end def generate_page_3 iter = @buffer.get_iter_at(:offset => 0) tag = @buffer.create_tag(nil, "weight" => :bold) @buffer.insert(iter, "hypertext:\n", :tags => [tag]) @buffer.insert(iter, <<-EOF) machine-readable text that is not sequential but is organized so that related items of information are connected EOF insert_link(iter, "Go back", 1) end def insert_link(iter, text, page) tag = @buffer.create_tag(nil, "foreground" => "blue", "underline" => :single) tag.page = page @buffer.insert(iter, text, :tags => [tag]) end # Links can also be activated by clicking or tapping. def event_after(event) case event.type when Gdk::EventType::BUTTON_RELEASE return false unless event.button == Gdk::BUTTON_PRIMARY when Gdk::EventType::TOUCH_END else return false end buffer = @view.buffer # we shouldn't follow a link if the user has selected something range = buffer.selection_bounds return false if range && range[0].offset != range[1].offset x, y = @view.window_to_buffer_coords(:widget, event.x, event.y) iter = @view.get_iter_at_location(x, y) follow_if_link(iter) if iter true end # Looks at all tags covering the position of iter in the text view, # and if one of them is a link, follow it by showing the page identified # by the data attached to it. def follow_if_link(iter) tags = iter.tags tags.each do |tag| if tag.page show_page(tag.page) break end end end # Looks at all tags covering the position (x, y) in the text view, # and if one of them is a link, change the cursor to the "hands" cursor # typically used by web browsers. def set_cursor_if_appropriate(text_view, x, y) iter = text_view.get_iter_at_location(x, y) return unless iter hovering = false tags = iter.tags tags.each do |tag| if tag.page hovering = true break end end if hovering != @hovering @hovering = hovering window = text_view.get_window(:text) window.cursor = @hovering ? @hand_cursor : @regular_cursor end end end module Gtk class TextTag attr_accessor :page end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/iconview.rb000066400000000000000000000102651511343406000242300ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Icon View/Icon View Basics The GtkIconView widget is used to display and manipulate icons. It uses a GtkTreeModel for data storage, so the list store example might be helpful. =end class IconviewDemo COL_PATH, COL_DISPLAY_NAME, COL_PIXBUF, COL_IS_DIRECTORY = (0..3).to_a FOLDER_NAME = "/iconview/gnome-fs-directory.png".freeze FILE_NAME = "/iconview/gnome-fs-regular.png".freeze def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Icon View Basics" @window.set_default_size(650, 400) load_pixbufs vbox = Gtk::Box.new(:vertical, 0) @window.add(vbox) tool_bar = Gtk::Toolbar.new vbox.pack_start(tool_bar, :expand => false, :fill => false, :padding => 0) up_button = Gtk::ToolButton.new up_button.label = "_Up" up_button.use_underline = true up_button.icon_name = "go-up" up_button.is_important = true up_button.sensitive = false tool_bar.insert(up_button, -1) home_button = Gtk::ToolButton.new home_button.label = "_Home" home_button.use_underline = true home_button.icon_name = "go-home" home_button.is_important = true tool_bar.insert(home_button, -1) sw = Gtk::ScrolledWindow.new sw.shadow_type = :etched_in sw.set_policy(:automatic, :automatic) vbox.pack_start(sw, :expand => true, :fill => true, :padding => 0) # Create the store and fill it with the contents of '/' @parent = "/" create_store fill_store icon_view = Gtk::IconView.new(:model => @store) icon_view.selection_mode = :multiple # Connect to the "clicked" signal of the "Up" tool button up_button.signal_connect "clicked" do @parent = File.dirname(@parent) fill_store # Maybe de-sensitive the up button up_button.sensitive = @parent == "/" end # Connect to the "clicked" signal of the "Home" too button home_button.signal_connect "clicked" do @parent = ENV["HOME"] fill_store up_button.sensitive = true end # We now set which model columns that correspond to the text # and pixbbuf of each of item icon_view.text_column = COL_DISPLAY_NAME icon_view.pixbuf_column = COL_PIXBUF # Connec the "item-activated" signal icon_view.signal_connect "item-activated" do |_widget, tree_path| iter = @store.get_iter(tree_path) path = iter[COL_PATH] directory = iter[COL_IS_DIRECTORY] if directory @parent = path fill_store up_button.sensitive = true end end sw.add(icon_view) icon_view.grab_focus end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def load_pixbufs # Loads the images for the demo and returns whether the operation succeeded return if @file_pixbuf @file_pixbuf = GdkPixbuf::Pixbuf.new(:resource => FILE_NAME) return false unless @file_pixbuf @folder_pixbuf = GdkPixbuf::Pixbuf.new(:resource => FOLDER_NAME) return false unless @folder_pixbuf end def create_store @store = Gtk::ListStore.new(String, String, GdkPixbuf::Pixbuf, TrueClass) # Set sort column and function @store.set_default_sort_func do |_model, a, b| sort_function(a, b) end @store.set_sort_column_id(Gtk::TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, :ascending) end def fill_store @store.clear Dir.glob(File.join(@parent, "*")).each do |path| is_dir = FileTest.directory?(path) iter = @store.append iter[COL_DISPLAY_NAME] = File.basename(path) || "-" iter[COL_PATH] = path iter[COL_PIXBUF] = is_dir ? @folder_pixbuf : @file_pixbuf iter[COL_IS_DIRECTORY] = is_dir end end def sort_function(a, b) if !a[COL_IS_DIRECTORY] and b[COL_IS_DIRECTORY] 1 elsif a[COL_IS_DIRECTORY] and !b[COL_IS_DIRECTORY] -1 elsif !a[COL_DISPLAY_NAME] and b[COL_DISPLAY_NAME] 1 elsif a[COL_DISPLAY_NAME] and !b[COL_DISPLAY_NAME] -1 else a[COL_DISPLAY_NAME] <=> b[COL_DISPLAY_NAME] end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/iconview_edit.rb000066400000000000000000000050771511343406000252420ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Icon View/Editing and Drag-and-Drop The GtkIconView widget supports Editing and Drag-and-Drop. This example also demonstrates using the generic GtkCellLayout interface to set up cell renderers in an icon view. =end class IconviewEditDemo COL_TEXT = 0 NUM_COLS = 1 def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Editing and Drag-and-drop" initialize_store initialize_icon_view icon_view_add_renderer_pixbuf icon_view_add_renderer_text @window.add(@icon_view) end def run if !@window.visible? @window.show_all else @window.destroy end @window end def initialize_store @store = Gtk::ListStore.new(String) %w(Red Green Blue Yellow).each do |color| @store.append.set_values([color]) end end def initialize_icon_view @icon_view = Gtk::IconView.new(:model => @store) @icon_view.selection_mode = :single @icon_view.item_orientation = :horizontal @icon_view.columns = 2 @icon_view.reorderable = true end def icon_view_add_renderer_pixbuf renderer = Gtk::CellRendererPixbuf.new @icon_view.pack_start(renderer, true) @icon_view.set_cell_data_func(renderer) do |_layout, cell_renderer, model, iter| text = model.get_value(iter, COL_TEXT) if text begin color = Gdk::RGBA.parse(text) rescue ArgumentError color = nil end if color pixel = (color.red * 255).to_i << 24 | (color.green * 255).to_i << 16 | (color.blue * 255).to_i << 8 | (color.alpha * 255).to_i else pixel = 0 end pixbuf = GdkPixbuf::Pixbuf.new(:colorspace => :rgb, :has_alpha => true, :bits_per_sample => 8, :width => 24, :height => 24) pixbuf.fill!(pixel) cell_renderer.set_property("pixbuf", pixbuf) end end end def icon_view_add_renderer_text renderer = Gtk::CellRendererText.new @icon_view.pack_start(renderer, true) renderer.set_property("editable", true) renderer.signal_connect("edited") do |_cell, path_string, text| model = @icon_view.model path = Gtk::TreePath.new(path_string) iter = model.get_iter(path) iter[COL_TEXT] = text end @icon_view.set_attributes(renderer, "text" => COL_TEXT) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/images.rb000066400000000000000000000132641511343406000236540ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Images GtkImage is used to display an image; the image can be in a number of formats. Typically, you load an image into a GdkPixbuf, then display the pixbuf. This demo code shows some of the more obscure cases, in the simple case a call to gtk_image_new_from_file() is all you need. If you want to put image data in your program as a C variable, use the make-inline-pixbuf program that comes with GTK+. This way you won't need to depend on loading external files, your application binary can be self-contained. =end require "thread" class ImagesDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Images" @window.signal_connect "destroy" do GLib::Source.remove(@load_timeout) if @load_timeout @pixbuf_loader.close if @pixbuf_loader end @vbox = Gtk::Box.new(:vertical, 8) @vbox.margin = 16 @window.add(@vbox) frame = generate_frame("Image loaded from a file ") image = Gtk::Image.new(:icon_name => "gtk3-demo", :size => :dialog) frame.add(image) # Animation frame = generate_frame("Animation loaded from a file") image = Gtk::Image.new(:resource => "/images/floppybuddy.gif") frame.add(image) # Symbolic icon frame = generate_frame("Symbolic themed icon") gicon = Gio::ThemedIcon.new("battery-caution-charging-symbolic") image = Gtk::Image.new(:icon => gicon, :size => :dialog) frame.add(image) # Progressive frame = generate_frame("Progressive image loading") # Create an empty image for now; the progressive loader # will create the pixbuf and fill it in. image = Gtk::Image.new frame.add(image) start_progressive_loading(image) # Sensitivity control button = Gtk::ToggleButton.new(:label => "_Insensitive", :use_underline => true) @vbox.pack_start(button) button.signal_connect "toggled" do |toggle| @vbox.children.each do |child| child.sensitive = !toggle.active? if child.class != Gtk::ToggleButton end end end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def start_progressive_loading(image) # This is obviously totally contrived (we slow down loading # on purpose to show how incremental loading works). # The real purpose of incremental loading is the case where # you are reading data from a slow source such as the network. # The timeout simply simulates a slow data source by inserting # pauses in the reading process. image_stream = nil @pixbuf_loader = nil @load_timeout = GLib::Timeout.add(150) do if image_stream begin buf = image_stream.read(256) rescue => error buf = "" show_dialog_on_error("Failure reading image file 'alphatest.png': \ #{error.message}") end if buf.empty? # Errors can happen on close, e.g. if the image # file was truncated we'll know on close that # it was incomplete. begin image_stream.close rescue => error show_dialog_on_error("Failed to load image: #{error.message}") end begin @pixbuf_loader.close rescue => error show_dialog_on_error("Failed to load image: #{error.message}") end @pixbuf_loader = nil GLib::Source::REMOVE else begin @pixbuf_loader.write(buf) rescue => error show_dialog_on_error("Failed to load image: #{error.message}") end GLib::Source::CONTINUE end else begin image_stream = Gio::Resources.open_stream("/images/alphatest.png") rescue => error show_dialog_on_error(error.message) end @pixbuf_loader.close if @pixbuf_loader @pixbuf_loader = GdkPixbuf::PixbufLoader.new @pixbuf_loader.signal_connect "area-prepared" do |loader| pixbuf = loader.pixbuf pixbuf.fill(0xaaaaaaff) image.from_pixbuf = pixbuf end @pixbuf_loader.signal_connect "area-updated" do # progressive_updated_callback # We know the pixbuf inside the GtkImage has changed, but the image # itself doesn't know this; so give it a hint by setting the pixbuf # again. Queuing a redraw used to be sufficient, but nowadays # GtkImage uses GtkIconHelper which caches the pixbuf state and will # just redraw from the cache. pixbuf = image.pixbuf image.from_pixbuf = pixbuf end GLib::Source::CONTINUE end end source = GLib::MainContext.default.find_source(@load_timeout) source.name = "[gtk+] progressive_timeout" end def show_dialog_on_error(message) dialog = Gtk::MessageDialog.new(:parent => @window, :flags => :destroy_with_parent, :type => :error, :buttons => :close, :message => message) dialog.modal = true dialog.present dialog.signal_connect("response") { |w| w.destroy } GLib::Source.remove(@load_timeout) @load_timeout = nil false end def generate_frame(title) label = Gtk::Label.new label.markup = title @vbox.pack_start(label) frame = Gtk::Frame.new frame.shadow_type = :in frame.halign = :center frame.valign = :center @vbox.pack_start(frame) frame end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/infobar.rb000066400000000000000000000066501511343406000240300ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Info Bars Info bar widgets are used to report important messages to the user. =end class InfobarDemo def initialize(main_window) @actions = Gtk::Box.new(:horizontal, 0) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.set_title("Info Bars") @window.margin = 8 @vbox = Gtk::Box.new(:vertical, 0) @window.add(@vbox) generate_simple_infobar("info") generate_simple_infobar("warning") generate_infobar_with_dialog generate_simple_infobar("error") generate_simple_infobar("other") frame = Gtk::Frame.new("Info bars") @vbox.pack_start(frame, :expand => false, :fill => false, :padding => 0) frame.margin_top = 8 frame.margin_bottom = 8 vbox2 = Gtk::Box.new(:vertical, 8) vbox2.margin = 8 frame.add(vbox2) label = Gtk::Label.new("An example of different info bars") vbox2.pack_start(label, :expand => false, :fill => false, :padding => 0) @actions.show_all vbox2.pack_start(@actions, :expand => false, :fill => false, :padding => 0) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def generate_infobar_label(message) label = Gtk::Label.new(message) label.line_wrap = true label.xalign = 0 label end def add_a_label_message_in_an_infobar(bar, message) label = generate_infobar_label(message) bar.content_area.pack_start(label, :expand => false, :fill => false, :padding => 0) end def generate_simple_infobar(message_type) bar = Gtk::InfoBar.new @vbox.pack_start(bar, :expand => false, :fill => false, :padding => 0) bar.message_type = message_type.to_sym message = "This is an info bar with message type Gtk::MessageType::#{message_type.upcase}" add_a_label_message_in_an_infobar(bar, message) link_bar_to_a_toggle_button(bar, message_type.capitalize) end def link_bar_to_a_toggle_button(bar, message) button = Gtk::ToggleButton.new(:label => message) button.bind_property("active", bar, "visible", :bidirectional) @actions.add(button) button end def generate_infobar_with_dialog bar = Gtk::InfoBar.new bar.add_button("_OK", Gtk::ResponseType::OK) bar.show_close_button = true manage_response_event_of_infobar(bar) @vbox.pack_start(bar, :expand => false, :fill => false, :padding => 0) bar.message_type = :question message = "This is an info bar with message type Gtk::MessageType::QUESTION" add_a_label_message_in_an_infobar(bar, message) button = link_bar_to_a_toggle_button(bar, "Question") button.active = false end def manage_response_event_of_infobar(bar) bar.signal_connect "response" do |info_bar, response_id| info_bar.hide if response_id == Gtk::ResponseType::CLOSE dialog = Gtk::MessageDialog.new(:parent => info_bar.toplevel, :flags => [:modal, :destroy_with_parent], :type => :info, :buttons => :ok, :message => "You clicked a button on an info bar") dialog.secondary_text = "Your response has id #{response_id}" dialog.signal_connect("response") do dialog.destroy end dialog.show_all end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/links.rb000066400000000000000000000036261511343406000235300ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Links GtkLabel can show hyperlinks. The default action is to call gtk_show_uri() on their URI, but it is possible to override this with a custom handler. =end class LinksDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Links" label = Gtk::Label.new(<<-MESSAGE) Some text may be marked up as hyperlinks, which can be clicked or activated via keynav and they work fine with other markup, like when searching on Go og le . MESSAGE label.use_markup = true label.signal_connect "activate-link" do |widget, uri| if uri == "keynav" generate_dialog(widget) true else false end end @window.add(label) label.show end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def generate_dialog(widget) dialog = Gtk::MessageDialog.new(:parent => widget.toplevel, :flags => :destroy_with_parent, :type => :info, :buttons => :ok, :message => <<-MESSAGE) The term keynav is a shorthand for keyboard navigation and refers to the process of using a program (exclusively) via keyboard input. MESSAGE dialog.use_markup = true dialog.modal = true dialog.present dialog.signal_connect("response", &:destroy) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/list_store.rb000066400000000000000000000144621511343406000245770ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Tree View/List Store The GtkListStore is used to store data in list form, to be used later on by a GtkTreeView to display it. This demo builds a simple GtkListStore and displays it. =end class ListStoreDemo Bug = Struct.new("Bug", :fixed, :number, :severity, :description) COLUMN_FIXED, COLUMN_NUMBER, COLUMN_SEVERITY, COLUMN_DESCRIPTION, COLUMN_PULSE, COLUMN_ICON, COLUMN_ACTIVE, COLUMN_SENSITIVE, NUM_COLUMNS = *(0..8).to_a DATA = [ [false, 60_482, "Normal", "scrollable notebooks and hidden tabs" ], [false, 60_620, "Critical", "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" ], [false, 50_214, "Major", "Xft support does not clean up correctly" ], [true, 52_877, "Major", "GtkFileSelection needs a refresh method. " ], [false, 56_070, "Normal", "Can't click button after setting in sensitive" ], [true, 56_355, "Normal", "GtkLabel - Not all changes propagate correctly" ], [false, 50_055, "Normal", "Rework width/height computations for TreeView" ], [false, 58_278, "Normal", "gtk_dialog_set_response_sensitive doesn't work" ], [false, 55_767, "Normal", "Getters for all setters" ], [false, 56_925, "Normal", "Gtkcalender size" ], [false, 56_221, "Normal", "Selectable label needs right-click copy menu" ], [true, 50_939, "Normal", "Add shift clicking to GtkTextView" ], [false, 6_112, "Enhancement","netscape-like collapsable toolbars" ], [false, 1, "Normal", "First bug :=)" ], ].collect do |ary| Bug.new(*ary) end def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "List Store" @timeout = 0 @window.signal_connect "delete-event" do @model = nil GLib::Source.remove(@timeout) unless @timeout.zero? @timeout = 0 false end vbox = Gtk::Box.new(:vertical, 8) vbox.margin = 8 @window.add(vbox) label = Gtk::Label.new(<<-EOF) This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though). EOF vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) sw = Gtk::ScrolledWindow.new(nil, nil) sw.shadow_type = :etched_in sw.set_policy(:never, :automatic) vbox.pack_start(sw, :expand => true, :fill => true, :padding => 0) # create tree model create_model # create tree view treeview = Gtk::TreeView.new(@model) treeview.search_column = COLUMN_DESCRIPTION sw.add(treeview) # add columns to the tree view add_columns(treeview) # finish and show @window.set_default_size(280, 250) end def run if !@window.visible? @window.show_all add_spinner else @window.destroy GLib::Source.remove(@tiemout) unless @timeout.zero? @timeout = 0 end @window end private def create_model # create list store @model = Gtk::ListStore.new(TrueClass, Integer, String, String, Integer, String, TrueClass, TrueClass) # add data to the list store DATA.each_with_index do |bug, i| icon_name = "" icon_name = "battery-caution-charging-symbolic" if i == 1 || i == 3 sensitive = i == 3 ? false : true iter = @model.append iter.set_values([bug.fixed, bug.number, bug.severity, bug.description, 0, icon_name, false, sensitive]) end end def add_columns(treeview) # column for fixed toggles renderer = Gtk::CellRendererToggle.new renderer.signal_connect("toggled") { |_cell, path| fixed_toggled(path) } column = Gtk::TreeViewColumn.new("Fixed?", renderer, "active" => COLUMN_FIXED) # set this column to a fixed sizing (of 50 pixels) column.sizing = :fixed column.fixed_width = 50 treeview.append_column(column) # column for bug numbers renderer = Gtk::CellRendererText.new column = Gtk::TreeViewColumn.new("Bug number", renderer, "text" => COLUMN_NUMBER) column.sort_column_id = COLUMN_NUMBER treeview.append_column(column) # column for severities renderer = Gtk::CellRendererText.new column = Gtk::TreeViewColumn.new("Severity", renderer, "text" => COLUMN_SEVERITY) column.sort_column_id = COLUMN_SEVERITY treeview.append_column(column) # column for description renderer = Gtk::CellRendererText.new column = Gtk::TreeViewColumn.new("Description", renderer, "text" => COLUMN_DESCRIPTION) column.sort_column_id = COLUMN_DESCRIPTION treeview.append_column(column) # column for spinner renderer = Gtk::CellRendererSpinner.new column = Gtk::TreeViewColumn.new("Spinning", renderer, "pulse" => COLUMN_PULSE, "active" => COLUMN_ACTIVE) column.sort_column_id = COLUMN_PULSE treeview.append_column(column) # column for symbolic icon renderer = Gtk::CellRendererPixbuf.new column = Gtk::TreeViewColumn.new("Symbolic icon", renderer, "icon-name" => COLUMN_ICON, "sensitive" => COLUMN_SENSITIVE) column.sort_column_id = COLUMN_ICON treeview.append_column(column) end def fixed_toggled(path_str) path = Gtk::TreePath.new(path_str) # get toggled iter iter = @model.get_iter(path) fixed = iter[COLUMN_FIXED] # do something with the value fixed ^= 1 # set new value iter[COLUMN_FIXED] = fixed end def add_spinner if @timeout.zero? @timeout = GLib::Timeout.add(80) do GLib::Source.remove(@timeout) unless @model iter = @model.iter_first pulse = iter[COLUMN_PULSE] pulse = pulse == GLib::MAXUINT ? 0 : pulse + 1 iter[COLUMN_PULSE] = pulse iter[COLUMN_ACTIVE] = true true end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/listbox.rb000066400000000000000000000126071511343406000240730ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = List Box GtkListBox allows lists with complicated layouts, using regular widgets supporting sorting and filtering. =end class ListboxDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "List Box" @window.set_default_size(400, 600) vbox = Gtk::Box.new(:vertical, 12) @window.add(vbox) label = Gtk::Label.new("Messages from Gtk+ and friends") vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) scrolled = Gtk::ScrolledWindow.new scrolled.set_policy(:never, :automatic) vbox.pack_start(scrolled, :expand => true, :fill => true, :padding => 0) listbox = Gtk::ListBox.new scrolled.add(listbox) listbox.set_sort_func do |a, b| a.sort(b) end listbox.activate_on_single_click = false listbox.signal_connect("row-activated", &:row_activated) vbox.show_all data = Gio::Resources.lookup_data("/listbox/messages.txt", 0) data.to_s.each_line do |line| message = Message.new(line) row = GtkMessageRow.new(message) row.show listbox.add(row) end end def run if !@window.visible? @window.show_all else @window.destroy end @window end end class Message attr_reader :id, :sender_name, :sender_nick, :message, :time, :reply_to, :resent_by attr_accessor :n_favorites, :n_reshares def initialize(str) strv = str.split("|") parse(strv) end private def parse(array_of_strings) @id = array_of_strings[0].to_i @sender_name = array_of_strings[1] @sender_nick = array_of_strings[2] @message = array_of_strings[3] @time = array_of_strings[4].to_i @reply_to = array_of_strings[5] || nil @resent_by = array_of_strings[6] || nil @n_favorites = array_of_strings[7] ? array_of_strings[7].to_i : nil @n_reshares = array_of_strings[8] ? array_of_strings[8].to_i : nil end end class GtkMessageRow < Gtk::ListBoxRow type_register class << self def init set_template(:resource => "/listbox/listbox.ui") bind_template_child("content_label") bind_template_child("source_name") bind_template_child("source_nick") bind_template_child("short_time_label") bind_template_child("detailed_time_label") bind_template_child("extra_buttons_box") bind_template_child("details_revealer") bind_template_child("avatar_image") bind_template_child("resent_box") bind_template_child("resent_by_button") bind_template_child("n_reshares_label") bind_template_child("n_favorites_label") bind_template_child("expand_button") set_connect_func do |name| method(name) end end private def favorite_clicked(button) row = button.parent row = row.parent while row.class != GtkMessageRow row.message.n_favorites += 1 row.message_row_update end def expand_clicked(button) row = button.parent row = row.parent while row.class != GtkMessageRow row.row_expand end def reshare_clicked(button) row = button.parent row = row.parent while row.class != GtkMessageRow row.message.n_reshares += 1 row.message_row_update end end attr_reader :message def initialize(message) super() @message = message @avatar_pixbuf_other = GdkPixbuf::Pixbuf.new(:resource => "/listbox/apple-red.png", :width => 32, :height => 32, :preserve_aspect_ratio => false) message_row_update extra_buttons_box.hide extra_buttons_box.visible = false extra_buttons_box.unset_state_flags([:prelight, :selected]) set_state_flags(Gtk::StateFlags::NORMAL, false) signal_connect "state-flags-changed" do |widget, _previous_flags| flags = widget.state_flags is_prelight_or_selected = flags & (Gtk::StateFlags::PRELIGHT | Gtk::StateFlags::SELECTED) if is_prelight_or_selected.nonzero? widget.extra_buttons_box.visible = true else widget.extra_buttons_box.visible = false end end end def message_row_update source_name.text = @message.sender_name source_nick.text = @message.sender_nick content_label.text = @message.message short_time_label.text = Time.at(@message.time).utc.strftime("%e %b %y") detailed_time_label.text = Time.at(@message.time).utc.strftime("%Y - %e %b %Y") n_favorites_label.visible = !@message.n_favorites.zero? n_favorites_label.markup = "#{@message.n_favorites}\nFavorites" n_reshares_label.visible = !@message.n_reshares.zero? n_reshares_label.markup = "#{@message.n_reshares}\nReshares" resent_box.visible = !@message.resent_by.nil? resent_by_button.label = @message.resent_by if @message.resent_by if @message.sender_nick == "@GTKtoolkit" avatar_image.set_from_icon_name("gtk3-demo", Gtk::IconSize::DND) else avatar_image.from_pixbuf = @avatar_pixbuf_other end end def sort(b) @message.time - b.message.time end def row_expand expand = !details_revealer.reveal_child? details_revealer.reveal_child = expand expand ? expand_button.label = "Hide" : expand_button.label = "Expand" end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/listbox.ui000066400000000000000000000340741511343406000241070ustar00rootroot00000000000000 1 1 Email message 1 1 Embed message 1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/main.rb000077500000000000000000000327361511343406000233430ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (C) 2006-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 require "gtk3" require "optparse" require "fileutils" current_path = File.expand_path(File.dirname(__FILE__)) gresource_bin = "#{current_path}/demo.gresource" gresource_xml = "#{current_path}/demo.gresource.xml" system("glib-compile-resources", "--target", gresource_bin, "--sourcedir", current_path, gresource_xml) gschema_bin = "#{current_path}/gschemas.compiled" system("glib-compile-schemas", current_path) at_exit do FileUtils.rm_f([gresource_bin, gschema_bin]) end resource = Gio::Resource.load(gresource_bin) Gio::Resources.register(resource) ENV["GSETTINGS_SCHEMA_DIR"] = current_path TITLE_COLUMN = 0 FILENAME_COLUMN = 1 STYLE_COLUMN = 2 def script_info(path) title = depend = nil file = File.open(path) file.each do |ln| if !title && ln =~ /^=\s+(.*)$/ title = Regexp.last_match(1) if title =~ /^(.*)\((.+?)\)$/ title = Regexp.last_match(1) depend = Regexp.last_match(2) end end break if title end [title, depend] end def generate_index # Target scripts scripts = Dir.glob(File.join(File.dirname(__FILE__), "*.rb")) # Generate index tree children = {} index = [] scripts.each do |script| next if "main.rb" == File.basename(script) title, depend = script_info(script) next if depend && !Gtk.const_defined?(depend) if title =~ %r{^(.+?)/(.+)$} parent = Regexp.last_match(1) child = Regexp.last_match(2) unless children[parent] children[parent] = [] index += [[parent, nil, []]] end children[parent] += [[child, script]] else index += [[title, script]] end end # Sort children children.each_key do |parent| children[parent].sort! do |a, b| a[0] <=> b[0] end end # Expand children index.collect! do |row| row[2] = children[row[0]] if row[2] row end index.sort! do |a, b| a[0] <=> b[0] end index end def append_children(model, source, parent = nil) source.each do |title, filename, children| iter = model.append(parent) iter[TITLE_COLUMN] = title iter[FILENAME_COLUMN] = filename iter[STYLE_COLUMN] = Pango::Style::NORMAL append_children(model, children, iter) if children end end def get_demo_name_from_filename(filename) File.basename(filename, ".rb").tr("-", "_") end def get_class_name_from_filename(filename) pattern = get_demo_name_from_filename(filename) class_name = pattern.split("_").map(&:capitalize).join class_name << "Demo" end def list_demos(source, is_child = false) source.each do |title, filename, children| if is_child printf("%-30.30s", "\t" + title) printf("%-30.30s", get_demo_name_from_filename(filename)) puts "" elsif filename printf("%-38.38s", title) printf("%-30.30s", get_demo_name_from_filename(filename)) puts "" else puts "#{title} : " end list_demos(children, true) if children end end def find_demo_filename_from_name(source, name) demo_filename = nil source.each do |_title, filename, children| if filename && name == get_demo_name_from_filename(filename) demo_filename = filename end break if demo_filename (demo_filename = find_demo_filename_from_name(children, name)) if children end demo_filename end def get_demo_filename_from_name(name) index = generate_index filename = find_demo_filename_from_name(index, name) puts "Demo not found" unless filename filename end def run_demo_from_file(filename, window) class_name = get_class_name_from_filename(filename) require filename unless Object.const_defined?(class_name) klass = Object.const_get(class_name) demo = klass.new(window) demo_window = demo.run if demo_window.is_a?(Gtk::Window) demo_window.set_transient_for(window) demo_window.modal = true end demo_window end def select_treeview_item(treeview, filename) to_select = nil treeview.model.each do |model, path, iter| if iter[FILENAME_COLUMN] == filename to_select = path break end end treeview.expand_to_path(to_select) treeview.set_cursor(to_select, nil, false) end class Demo < Gtk::Application def initialize super("org.gtk.Demo", [:non_unique, :handles_command_line]) @current_file = nil action = Gio::SimpleAction.new("quit") action.signal_connect "activate" do |_action, _parameter| quit end add_action(action) action = Gio::SimpleAction.new("about") action.signal_connect "activate" do |_action, _parameter| Gtk::AboutDialog.show(active_window, "program_name" => "GTK+ Demo", "version" => Gtk::Version::STRING, "copyright" => "(C) 1997-2013 The GTK+ Team", "license_type" => Gtk::License::LGPL_2_1, "website" => "http://www.gtk.org", "comments" => "Program to demonstrate GTK+ widgets", "authors" => ["The GTK+ Team"], "logo_icon_name" => "gtk3-demo", "title" => "About GTK+ Demo") end add_action(action) @options = {} @exit_status = 0 signal_connect "startup" do |application| @builder = Gtk::Builder.new(:resource => "/ui/main.ui") appmenu = @builder["appmenu"] application.set_app_menu(appmenu) @info_buffer = Gtk::TextBuffer.new @source_buffer = Gtk::TextBuffer.new @info_buffer.create_tag("title", "font" => "Sans 18") @source_buffer.create_tag("comment", "foreground" => "red") @source_buffer.create_tag("const", "foreground" => "ForestGreen") @source_buffer.create_tag("string", "foreground" => "RosyBrown", "weight" => Pango::Weight::BOLD) @source_buffer.create_tag("reserved", "foreground" => "purple") end signal_connect "activate" do |_application| begin run_application rescue => error report_error(error) @exit_status = 1 end end signal_connect "command-line" do |_application, command_line| begin parse_command_line(command_line.arguments) rescue SystemExit => error error.status rescue OptionParser::InvalidOption => error puts error.message 1 rescue => error report_error(error) 1 else activate @exit_status end end end private def parse_command_line(arguments) parser = OptionParser.new parser.on("-r", "--run EXAMPLE", "Run an example") do |example| @options[:name] = example end parser.on("-a", "--autoquit", "Quit after a delay") do @options[:autoquit] = true end parser.on("-l", "--list", "List examples") do @options[:list] = true end parser.parse(arguments) end def report_error(error) puts "#{error.class}: #{error.message}" puts error.backtrace end def run_application if @options[:list] list_demos(generate_index) quit end window = @builder["window"] add_window(window) action = Gio::SimpleAction.new("run") action.signal_connect "activate" do |_action, _parameter| selection = @treeview.selection iter = selection.selected filename = iter[FILENAME_COLUMN] if filename begin run_demo_from_file(filename, windows.first) rescue => error puts("failed to run demo: #{filename}") report_error(error) end end end window.add_action(action) @notebook = @builder["notebook"] @info_view = @builder["info-textview"] @source_view = @builder["source-textview"] headerbar = @builder["headerbar"] @treeview = @builder["treeview"] model = @treeview.model append_children(model, generate_index) @source_sw = @builder["source-scrolledwindow"] scrollbar = @source_sw.vscrollbar @menu = Gtk::Menu.new item = Gtk::MenuItem.new(:label => "Start") @menu.append(item) item.signal_connect "activate" do adj = scrollbar.adjustment adj.value = adj.lower end item = Gtk::MenuItem.new(:label => "End") @menu.append(item) item.signal_connect "activate" do adj = scrollbar.adjustment adj.value = adj.upper - adj.page_size end @info_sw = @builder["info-scrolledwindow"] @menu.show_all scrollbar.signal_connect "popup-menu" do |_widget, _button, _activate_time| @menu.popup(nil, nil, 0, Gtk.current_event_time) end @treeview.signal_connect "row-activated" do |_tree_view, path, _column| iter = model.get_iter(path) filename = iter[FILENAME_COLUMN] begin demo = run_demo_from_file(filename, windows.first) rescue => error puts("failed to run demo: #{filename}") report_error(error) else if demo iter[STYLE_COLUMN] = Pango::Style::ITALIC demo.signal_connect "destroy" do iter[STYLE_COLUMN] = Pango::Style::NORMAL end end end end treeview_selection = @builder["treeview-selection"] treeview_selection.signal_connect "changed" do |selection, _model| iter = selection.selected if iter filename = iter[FILENAME_COLUMN] title = iter[TITLE_COLUMN] load_file(filename) if filename headerbar.set_title(title) end end window.show_all if @options[:name] filename = get_demo_filename_from_name(@options[:name]) if filename select_treeview_item(@treeview, filename) run_demo_from_file(filename, windows.first) end end if @options[:autoquit] GLib::Timeout.add_seconds(1) do quit end end end def fill_buffers_from(file) start = @info_buffer.get_iter_at(:offset => 0) state = :before_header file.each do |line| case state when :before_header state = :in_header if line =~ /^=begin$/ when :in_header if line =~ /^=end$/ state = :body start = @source_buffer.get_iter_at(:offset => 0) elsif line =~ /^=\s+(.*)$/ title = Regexp.last_match(1) title.gsub!(/\s*\(.*\)$/, "") # Delete depend field last = start @info_buffer.insert(last, title) start = last.clone start.backward_chars(title.length) @info_buffer.apply_tag("title", start, last) start = last else @info_buffer.insert(start, line) end when :body # Reading program body @source_buffer.insert(start, line) end end end def load_file(filename) return if filename == @current_file # implement add_data_tab @info_buffer.delete(*@info_buffer.bounds) @source_buffer.delete(*@source_buffer.bounds) file = begin File.open(filename) rescue $stderr.puts "Cannot open: #{$ERROR_INFO}" if $DEBUG return end fill_buffers_from(file) fontify @source_view.buffer = @source_buffer @info_view.buffer = @info_buffer @current_file = filename end 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 = 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), @source_buffer.get_iter_at(:offset => last)) end end 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+|$)/) def tokenize(str, index = 0) until str.empty? tag = nil case str when /".+?"/, /'.+?'/ tag = :string when /#.*$/ tag = :comment when RESERVED_WORDS_PATTERN tag = :reserved when /[A-Z][A-Za-z0-9_]+/ tag = :const end if tag tokenize($LAST_MATCH_INFO.pre_match, index) do |*args| yield(*args) end yield(tag, index + $LAST_MATCH_INFO.begin(0), index + $LAST_MATCH_INFO.end(0)) index += (str.length - $LAST_MATCH_INFO.post_match.length) str = $LAST_MATCH_INFO.post_match else index += str.length str = "" end end end end end demo = Demo.new exit(demo.run([$PROGRAM_NAME] + ARGV)) ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/main.ui000066400000000000000000000160471511343406000233470ustar00rootroot00000000000000 800 600 GTK+ Demo 1 1 1 center 1 win.run 1 Run 1 1 120 1 1 never 150 1 1 treestore 0 browse 2 0 1 1 1 1 0 1 1 1 1 20 20 20 20 2 2 0 word 0 1 1 _Info 1 1 0 1 1 1 1 20 20 20 20 0 0 1 1 1 Source 1 0 1 1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/markup.rb000066400000000000000000000046341511343406000237070ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Text View/Markup Gtk::TextBuffer lets you define your own tags that can influence text formatting in a variety of ways. In this example, we show that Gtk::TextBuffer can load Pango markup and automatically generate suitable tags. =end class MarkupDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Markup" @window.set_default_size(450, 450) initialize_stack initialize_show_source initialize_headerbar sw = generate_sourceview @view = sw.child @stack.add_named(sw, "formatted") sw = generate_sourceview @view2 = sw.child @stack.add_named(sw, "source") populate_sourceviews end def run if !@window.visible? @window.show_all else @window.destroy end end private def initialize_stack @stack = Gtk::Stack.new @stack.show @window.add(@stack) end def initialize_headerbar header = Gtk::HeaderBar.new header.pack_start(@show_source) header.show_close_button = true header.show_all @window.titlebar = header end def show_source_toggled_signal @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 start_iter, start_end = buffer.bounds buffer.delete(start_iter, start_end) buffer.insert_markup(buffer.start_iter, markup) @stack.visible_child_name = "formatted" end end end def initialize_show_source @show_source = Gtk::CheckButton.new("Source") @show_source.valign = :center show_source_toggled_signal end def generate_sourceview view = Gtk::TextView.new view.wrap_mode = :word view.left_margin = 10 view.right_margin = 10 sw = Gtk::ScrolledWindow.new(nil, nil) sw.set_policy(:automatic, :automatic) sw.add(view) sw.show_all sw end def populate_sourceviews markup = Gio::Resources.lookup_data("/markup/markup.txt", 0) buffer = @view.buffer buffer.insert_markup(buffer.start_iter, markup) buffer = @view2.buffer buffer.insert(buffer.start_iter, markup) @stack.show end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/markup.txt000066400000000000000000000026351511343406000241220ustar00rootroot00000000000000 Text sizes: tiny very small small normal large very large huge Text colors and backgrounds Colorful underlines and more Colorful strikethroughs Superscripts and subscripts: ðœ€0 = ðœ”ðœ”ðœ”... Letterspacing OpenType font features: feast versus feast Shortcuts: Monospace – Bold – Italic – Big – Small – Underlined – Strikethrough – Superscript – Subscript ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/menus.rb000066400000000000000000000067021511343406000235350ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Menus There are several widgets involved in displaying menus. The GtkMenuBar widget is a menu bar, which normally appears horizontally at the top of an application, but can also be layed out vertically. The GtkMenu widget is the actual menu that pops up. Both GtkMenuBar and GtkMenu are subclasses of GtkMenuShell; a GtkMenuShell contains menu items (GtkMenuItem). Each menu item contains text and/or images and can be selected by the user. There are several kinds of menu item, including plain GtkMenuItem, GtkCheckMenuItem which can be checked/unchecked, GtkRadioMenuItem which is a check menu item that's in a mutually exclusive group, GtkSeparatorMenuItem which is a separator bar, GtkTearoffMenuItem which allows a GtkMenu to be torn off, and GtkImageMenuItem which can place a GtkImage or other widget next to the menu text. A GtkMenuItem can have a submenu, which is simply a GtkMenu to pop up when the menu item is selected. Typically, all menu items in a menu bar have submenus. =end class MenusDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Menus" accel_group = Gtk::AccelGroup.new @window.add_accel_group(accel_group) box = Gtk::Box.new(:horizontal, 0) @window.add(box) box1 = Gtk::Box.new(:horizontal, 0) box.add(box1) @menubar = Gtk::MenuBar.new @menubar.expand = true box1.pack_start(@menubar, :expand => false, :fill => true, :padding => 0) { "test\nline2" => 2, "foo" => 3, "bar" => 4 }.each do |k, v| create_menu_item(k, v) end box2 = Gtk::Box.new(:vertical, 10) box1.pack_start(box2, :expand => false, :fill => true, :padding => 0) button = generate_flip_button box2.pack_start(button, :expand => true, :fill => true, :padding => 0) button = generate_close_button box2.pack_start(button, :expand => true, :fill => true, :padding => 0) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_menu(depth) return nil if depth < 1 menu = Gtk::Menu.new last_item = nil (0..5).each do |i| j = i + 1 label = "item #{depth} - #{j}" menu_item = Gtk::RadioMenuItem.new(nil, label) menu_item.join_group(last_item) if last_item last_item = menu_item menu.append(menu_item) menu_item.sensitive = false if i == 3 menu_item.submenu = create_menu(depth - 1) end menu end def create_menu_item(label, depth) menuitem = Gtk::MenuItem.new(:label => label) menuitem.submenu = create_menu(depth) @menubar.append(menuitem) end def generate_flip_button button = Gtk::Button.new(:label => "Flip") button.signal_connect("clicked") do |_widget| parent = @menubar.parent orientation = parent.orientation.to_i parent.orientation = 1 - orientation if orientation == Gtk::Orientation::VERTICAL @menubar.set_property("pack-direction", Gtk::PackDirection::TTB) else @menubar.set_property("pack-direction", Gtk::PackDirection::LTR) end end button end def generate_close_button button = Gtk::Button.new(:label => "Close") button.signal_connect("clicked") { @window.destroy } button.can_default = true button.grab_default button end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/menus.ui000066400000000000000000000103241511343406000235420ustar00rootroot00000000000000
_New app.new <Primary>n _Open app.open _Save app.save <Primary>s Save _As... app.save-as <Primary>s
_Quit app.quit <Primary>q
_Preferences
_Prefer Dark Theme app.dark _Hide Titlebar when maximized win.titlebar _Color
_Red app.color red <Primary>r _Green app.color green <Primary>g _Blue app.color blue <Primary>b
_Shape
_Square win.shape square <Primary>s _Rectangle win.shape rectangle <Primary>r _Oval win.shape oval <Primary>o
_Bold win.bold <Primary><Shift>b
_Help _About win.about <Primary>a
ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/messages.txt000066400000000000000000001667251511343406000244450ustar00rootroot000000000000001|GTK+ and friends|GTKtoolkit|@breizhodrome yeah, that's for the OpenGL support that has been added recently|1416751697|0||2|1 2|Emmanuele Bassi|ebassi|RT @ebassi: embloggeration happened: http://t.co/9ukkNuSzuc — help out supporting GL on windows and macos in GTK+ 3.16.|1416086824|0|GTKtoolkit|0|9 3|Matthew Waters|ystreet00|RT @ystreet00: .@GTKtoolkit + @gstreamer integration using the new #gtk #opengl support https://t.co/IeBpFjbjes http://t.co/WptPHCfFIb|1416086780|0|GTKtoolkit|0|13 4|Emmanuele Bassi|ebassi|RT @ebassi: embloggeration happened — OpenGL integration lands in GTK+ — http://t.co/sUGwcvZhRg|1413214719|0|GTKtoolkit|0|8 5|Allan Day|allanday|RT @allanday: New Human Interface Guidelines coming for @gnome and @GTKtoolkit . http://t.co/SMNndyo6rl|1408615736|0|GTKtoolkit|0|12 6|Christian Hergert|hergertme|RT @hergertme: being able to set opacity on an individual widget in gtk ... you've come a long way since 2.x days.|1408601183|0|GTKtoolkit|0|2 7|Richard Brown|sysrich|RT @sysrich: hmm, good thing Iike eating with chopsticks #GUADEC http://t.co/7aG9CYpdZg|1406543731|0|GTKtoolkit|0|82 8|Javier Jardón|jjardon|RT @jjardon: #GNOME 3.13.4 has just been released from Strasbourg, this year #GUADEC city. Enjoy! https://t.co/hgHDVOWvRC|1406303072|0|GTKtoolkit|0|6 9|GNOME|gnome|RT @gnome: This year's @guadec schedule has been published. Lots of great talks on there, as usual. https://t.co/rpGPxIRCuB|1405929795|0|GTKtoolkit|0|20 10|GTK+ and friends|GTKtoolkit|New features of GtkInspector : http://t.co/EOgcv1lh8D #gtk #gtk3|1402076874|0||2|3 11|The Valeyard|breizhodrome|RT @breizhodrome: @GTKtoolkit and his multipoint gesture, good thing for mobile applications :) #Gtk|1402076810|0|GTKtoolkit|0|1 12|GTK+ and friends|GTKtoolkit|@Gin_Cheng sorry about that, should be fixed now|1402076785|0||0|0 13|GTK+ and friends|GTKtoolkit|@teadriven sorry about that, should be fixed now|1402076751|0||0|0 14|Javier Jardón|jjardon|RT @jjardon: #GNOME 3.13.2 (developer version) released! Try it, brake it, file bugs! https://t.co/cyCLBCtqKo|1401318926|0|GTKtoolkit|0|2 15|GTK+ and friends|GTKtoolkit|Gtkparasite has been integrated in #GTK+: Introducing gtkinspector: http://t.co/dP3DzgPNM3 #gtk3|1400231807|0||8|11 16|GTK+ and friends|GTKtoolkit|GTK+ 3.12 released! Improvements in Wayland, Broadway, OSX ... New widgets: GtkFlowBox,GtkActionBar and GtkPopover: https://t.co/5hBIlfrxc3|1395842503|0||5|8 17|Javier Jardón|jjardon|RT @jjardon: Second beta of #GNOME 3.12 just released! https://t.co/8oTfZaatVr|1394147916|0|GTKtoolkit|0|3 18|Javier Jardón|jjardon|RT @jjardon: First beta of GNOME 3.12 (3.11.90) has just been released. Enjoy! https://t.co/d5wzYWXUnv #gnome|1393006697|0|GTKtoolkit|0|4 19|GTK+ and friends|GTKtoolkit|Some thoughts on portability by @desrt : http://t.co/zyFT6i4we3 #glib|1392903834|0||1|0 20|GTK+ and friends|GTKtoolkit|Popovers support merged in master: http://t.co/5JE0RLhEDo Thanks @garnacho for getting this done! #gtk3|1390500627|0||5|7 21|GTK+ and friends|GTKtoolkit|The continuous build environment now generates 64-bit #GTK+ Windows bundles! Read the announcement from @tarnyko : https://t.co/wXVOAzCYTt|1386169565|0||6|10 22|GTK+ and friends|GTKtoolkit|GTK+ 3 packages for Windows available! Thanks for the hard work of @tarnyko to make this possible!\nhttp://t.co/U9JgsGoBLm|1382633636|0||7|23 23|GTK+ and friends|GTKtoolkit|Status of support of high resolution displays in #GTK+ (and #GNOME ) http://t.co/SPQN2E6Qxo Thanks to Brion Vibber for the donation!|1372531560|0||2|3 24|Javier Jardón|jjardon|RT @jjardon: Firefox GTK+3 port ready for testing https://t.co/onpxJaTKO5 #gtk #gtk3|1371557291|0|GTKtoolkit|0|22 25|GTK+ and friends|GTKtoolkit|GTK+ 3.8.0 (STABLE) released: wayland, Multi-application Broadway, improved CSS support and more ... http://t.co/RlLmrNPyYs #gtk #gtk3|1364435230|0||0|5 26|Daniel Svensson|dsvensson|RT @dsvensson: Bringing an application up to the new features in GTK 3.x = tons of negative diffs, awesome work by @GTKtoolkit devs <3|1352906611|0|GTKtoolkit|0|3 27|GTK+ and friends|GTKtoolkit|GLib status update and a warning: http://t.co/quQP8dLf #glib|1352905826|0||1|1 28|GTK+ and friends|GTKtoolkit|GProperty status: http://t.co/Nk28V2Rh #glib|1352905797|0||1|1 29|GTK+ and friends|GTKtoolkit|GTK+ 3.6.2 (STABLE) available: http://t.co/ah87o7cC #gtk #gtk3|1352905768|0||1|2 30|GTK+ and friends|GTKtoolkit|GLib 2.34.2 (STABLE) available: http://t.co/yavkTJwr #glib|1352905722|0||2|1 31|GTK+ and friends|GTKtoolkit|GTK+ 3.6.0 (STABLE) released: http://t.co/3NDAT5K9 #gtk #gtk3|1350075620|0||0|4 32|GTK+ and friends|GTKtoolkit|GLib 2.34.0 (STABLE) released: http://t.co/eWRD7hNy #glib|1350075583|0||0|6 33|GTK+ and friends|GTKtoolkit|GLib 2.33.10 (UNSTABLE) released: http://t.co/3BCdOPDy #glib|1347299317|0||2|2 34|Javier Jardón|jjardon|RT @jjardon: GnomeGoals status update: https://t.co/q5j7mJ1c #gnome|1342143404|0|GTKtoolkit|0|1 35|Emmanuele Bassi|ebassi|RT @ebassi: Saturday, 28/07, 11:45 - I'll be talking about Rainbows and Unicorns @ GUADEC https://t.co/WOiF6QU6|1341984820|0|GTKtoolkit|0|2 36|Harvey|cd0|RT @cd0: According to the sourcecode zipball the browser in the samsung smart tvs (UNxxES8xxx) is webkit-gtk 20120109. Not bad. @GTKtoolkit|1341712733|0|GTKtoolkit|0|3 37|Claudio Saavedra|csaavedra|RT @csaavedra: Accelerated compositing in WebKitGTK+: http://t.co/yxl0BooF #webkit #gnome|1341712291|0|GTKtoolkit|0|2 38|GTK+ and friends|GTKtoolkit|GTK+ 3.5.6 (UNSTABLE) released, now featuring GtkSearchEntry and GtkMenuButton http://t.co/adHtm2OA #gtk #gtk3|1341689740|0||0|3 39|GTK+ and friends|GTKtoolkit|GTK+ 3.4.0 (STABLE) released: http://t.co/KPSfJQSg #gtk #gtk3|1332870781|0||0|17 40|Javier Jardón|jjardon|RT @jjardon: GTK+ 2.24.9 (STABLE) released: https://t.co/OgcL5jnR #gtk|1327437929|0|GTKtoolkit|0|2 41|GTK+ and friends|GTKtoolkit|Multitouch is near… by @garnacho http://t.co/68iK8m9S #gtk #gtk3|1327090575|0||1|7 42|GTK+ and friends|GTKtoolkit|@dylanmccall Follow this bug: https://t.co/9vCpBVSm|1326802580|0||0|0 43|GTK+ and friends|GTKtoolkit|@cd0 Nice. Please, report any issue next time ;)|1326802460|0||0|0 44|GTK+ and friends|GTKtoolkit|RFC: new features http://t.co/uiqYWx4O #gtk #gtk3|1326802266|0||1|2 45|GTK+ and friends|GTKtoolkit|@cd0 Did you file a bug?|1326776652|0||0|0 46|GTK+ and friends|GTKtoolkit|@dylanmccall You mean this? http://t.co/BXbocqE9|1326776459|0||0|0 47|GTK+ and friends|GTKtoolkit|@trufae https://t.co/xlq75hDL|1326776153|0||0|0 48|GTK+ and friends|GTKtoolkit|RFC: UI design: http://t.co/Lu8Gnnfg #gtk #gtk3|1326305191|0||2|2 49|GTK+ and friends|GTKtoolkit|#win32 users: GTK+ 2.24.8 bundles available here: http://t.co/WhuY2XoN It not needed to use 2.16 anymore #gtk|1323190462|0||1|4 50|GTK+ and friends|GTKtoolkit|RFC: Model-View-Controller http://t.co/Lmw4lW9V #gtk #gtk3|1321546108|0||1|1 51|GTK+ and friends|GTKtoolkit|RFC:boxes http://t.co/eZABFgTp #gtk #gtk3|1321546061|0||2|1 52|GTK+ and friends|GTKtoolkit|GTK+ 2.24.8 (stable) released: update of the win32 backend, it now works at least as well as the old 2.16.x http://t.co/6wrhs7hm #gtk|1321297367|0||0|2 53|GTK+ and friends|GTKtoolkit|GTK + #Clutter next step(s): http://t.co/UDIezbyW #gtk #gtk4|1318265984|0||3|4 54|GTK+ and friends|GTKtoolkit|Tutorial for #Python, #GStreamer and #GTK 3: http://t.co/hvfRx18E #gtk3|1317781925|0||5|0 55|GTK+ and friends|GTKtoolkit|@jonobacon nice, but pyGTK is deprecated, use pygobject instead|1317353873|0||1|0 56|GTK+ and friends|GTKtoolkit|GTK+ 3.2 (STABLE) released: http://t.co/EqHjTmol #gtk #gtk3|1317043650|0||0|11 57|GTK+ and friends|GTKtoolkit|New D-Bus features in GLib 2.30: http://t.co/rzHui2Q2 #gtk #glib|1316732697|0||3|4 58|Lanedo GmbH|LanedoTweets|RT @TimJanik: New #GTK+ building instructions for #Mac OS X now up in the #GNOME wiki: http://t.co/lLt2fb1B|1316646621|0|GTKtoolkit|0|3 59|GTK+ and friends|GTKtoolkit|GTK+ 3.1.90 (UNSTABLE) released: http://t.co/KRz34jp #gtk #gtk3|1315961535|0||0|3 60|Lanedo GmbH|LanedoTweets|RT @TimJanik: There's a Win32 security advisory for Gtk+, it's recommended to upgrade to latest Gtk+ (2.24.6) if you haven't yet: http:/ ...|1315914861|0|GTKtoolkit|0|5 61|GTK+ and friends|GTKtoolkit|GTK+ 4.0 and #Clutter 2.0: rainbows and unicorns: http://t.co/SKbl0vQ #gtk #gtk4|1314883483|0||2|14 62|GTK+ and friends|GTKtoolkit|Some #Glib plans for the next cycle: http://t.co/a6YybK0 #gtk|1314883427|0||0|3 63|Nat Friedman|natfriedman|RT @natfriedman: Any Gtk+ experts who want to make some consulting money fixing bugs in Gtk/Mac, email me: nat@xamarin.com.|1314355269|0|GTKtoolkit|0|28 64|Kristian Rietveld|krietvel|RT @krietvel: Blog post: 'Merged “treemodel-fix†branch into GTK+: call for testing, blog post series' http://t.co/yAUnneo #gtk|1314096198|0|GTKtoolkit|0|2 65|GTK+ and friends|GTKtoolkit|@ArcherSeven Help improving the patch here: http://t.co/r74hP79|1313493595|0||0|0 66|GTK+ and friends|GTKtoolkit|GTK+ 3.1.12 (UNSTABLE) released: http://t.co/3iPAlNq Try the new Font Dialog! #gtk #gtk3|1313493256|0||0|4 67|GTK+ and friends|GTKtoolkit|@cimi @DanielFore Patches always welcomed!|1313493010|0||0|0 68|GTK+ and friends|GTKtoolkit|a11y branch was merged into master: http://mail.gnome.org/archives/gtk-devel-list/2011-July/msg00004.html #gtk #gtk3|1309962425|0||0|2 69|GTK+ and friends|GTKtoolkit|Another update in the effort to improve #a11y in #gtk: http://mail.gnome.org/archives/gtk-devel-list/2011-June/msg00057.html #gtk3|1309606597|0||0|0 70|GTK+ and friends|GTKtoolkit|@cd0 What is wrong in that page? freetype already appears as a required dependency. Anyway patches always welcomed ;)|1307359139|0||0|0 71|GTK+ and friends|GTKtoolkit|Of course, everyone is welcomed to improve the #gtk website. git repo: http://ur1.ca/4bwbw bugzilla: http://ur1.ca/4bwc1|1307038767|0||0|1 72|GTK+ and friends|GTKtoolkit|Check out the new #gtk website!!: www.gtk.org|1307036644|0||0|4 73|GTK+ and friends|GTKtoolkit|@jikri Take a look to http://live.gnome.org/action/login/GTK+/Roadmap and http://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html|1306673774|0||0|0 74|GTK+ and friends|GTKtoolkit|Introducing Cossa, a GTK+ theme previewer for gedit, by @garnacho http://ur1.ca/4ate8 #gtk #gtk3|1306672611|0||1|5 75|GTK+ and friends|GTKtoolkit|#GProperty, new API for Property and Accessor declaration, by @ebassi : http://ur1.ca/47lgk #gtk #glib|1305717028|0||0|2 76|GTK+ and friends|GTKtoolkit|GLib 2.29.4 (UNSTABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-May/msg00012.html #gtk #glib|1304593138|0||0|2 77|GTK+ and friends|GTKtoolkit|RT @acruiz: Gtk+ FontSelection progress http://bit.ly/iikP2f #gtk #gtk3|1303089979|0||0|1 78|GTK+ and friends|GTKtoolkit|RT @krietvel: New blog post: CoreText backend now in Pango master http://bit.ly/dTE0a1 #gtk #pango #osx|1303089938|0||0|0 79|GTK+ and friends|GTKtoolkit|GTK+ 3.0.9 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-April/msg00087.html #gtk #gtk3|1302883958|0||0|0 80|GTK+ and friends|GTKtoolkit|GLib 2.28.6 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-April/msg00074.html #gtk #glib|1302780112|0||0|3 81|GTK+ and friends|GTKtoolkit|GTK+ 3.1.2 (UNSTABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-April/msg00072.html #gtk #gtk3|1302737279|0||0|2 82|GTK+ and friends|GTKtoolkit|GLib 2.29.2 (UNSTABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-April/msg00071.html #gtk #glib|1302702936|0||0|3 83|Kristian Høgsberg|hoegsberg|RT @hoegsberg: yay, merged the Wayland GTK+ backend to the master branch - no, it's still not compete.|1302621000|0|GTKtoolkit|0|9 84|GTK+ and friends|GTKtoolkit|Someone willing to help with the client side decorations branch? http://git.gnome.org/browse/gtk+/log/?h=client-side-decorations #gtk #gtk3|1302620918|0||1|1 85|GTK+ and friends|GTKtoolkit|#Wayland GTK+ backend merged in master: http://git.gnome.org/browse/gtk+/commit/?id=c7514e8f0d19a833257497caff413bb4dfae6eb4 #gtk #gtk3|1302620838|0||1|9 86|GTK+ and friends|GTKtoolkit|gtkmm 3.0.0 (STABLE) released: http://mail.gnome.org/archives/gtkmm-list/2011-April/msg00025.html #gtk #cpp|1302355894|0||0|3 87|GTK+ and friends|GTKtoolkit|RT @alex_igalia: WebKit2 MiniBrowser for the GTK+ port running! http://ur1.ca/3t3ov #gtk #webkit|1302261488|0||1|0 88|GTK+ and friends|GTKtoolkit|#GNOME3 is out, using all the power of #gtk3 , congrats everyone! #gtk #gnome|1302219444|0||0|2 89|GTK+ and friends|GTKtoolkit|HTML5 backend update, now with real toplevel windows!! http://blogs.gnome.org/alexl/2011/04/07/broadway-update-2/ #gtk #gtk3|1302218981|0||2|10 90|GTK+ and friends|GTKtoolkit|Glade 3.10 (STABLE) released: With support for GTK+3, pygobject and all the new stuff: http://ur1.ca/3s8wk #rad #gtk|1302032523|0||0|6 91|GTK+ and friends|GTKtoolkit|GTK+ 3.0.8 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-April/msg00009.html #gtk #gtk3|1301878240|0||0|4 92|GTK+ and friends|GTKtoolkit|GTK+ latest performance improvements (with video): http://blogs.gnome.org/otte/2011/03/30/the-book-was-better/ #gtk #gtk3|1301594293|0||1|6 93|GTK+ and friends|GTKtoolkit|Benjamin Otte is improving GTK+ performance with some impressive results, check latest commits #gtk #gtk3|1301409776|0||1|2 94|Javier Jardón|jjardon|RT @jjardon: Also nice to see that a firefox GTK+3 port was started: https://bugzilla.mozilla.org/show_bug.cgi?id=627699 #gtk #gtk3 #fi ...|1301166992|0|GTKtoolkit|0|8 95|GTK+ and friends|GTKtoolkit|RT @krietvel: Oh yea, I still have to upstream the CoreText backend I wrote for Pango. Completely forgot about that. #gtk|1301149034|0||0|0 96|GTK+ and friends|GTKtoolkit|GTK+ 3.0.5 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-March/msg00099.html #gtk #gtk3|1300925808|0||0|1 97|GTK+ and friends|GTKtoolkit|Nice article of @cgwalters about analyzing memory use in #glib with #SystemTap: http://ur1.ca/3m0ak #gtk|1300672197|0||2|1 98|GTK+ and friends|GTKtoolkit|GLib 2.28.3 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-March/msg00065.html #gtk #glib|1300374677|0||0|2 99|GTK+ and friends|GTKtoolkit|GTK+ HTML backend merged: http://blogs.gnome.org/alexl/2011/03/15/gtk-html-backend-update/ #gtk #gtk3|1300334447|0||3|4 100|GTK+ and friends|GTKtoolkit|GTK+ 3.0.3 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-March/msg00059.html #gtk #gtk3|1300151113|0||0|5 101|GTK+ and friends|GTKtoolkit|PyGObject (new gobject introspection-based bindings) 2.28.0 (STABLE) released: http://ur1.ca/3fcsp #python #gtk|1299620983|0||0|1 102|GTK+ and friends|GTKtoolkit|GTK+ team meeting now in #gtk-devel on irc.gimp.net #gtk|1299615099|0||0|1 103|GTK+ and friends|GTKtoolkit|REMINDER: GTK+ Team IRC Meeting - 2011-03-08 at 20:00 UTC: http://ur1.ca/3ezpn Agenda: http://ur1.ca/3ezpp #gtk|1299517986|0||0|0 104|GTK+ and friends|GTKtoolkit|GTK+ 3.0.2 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-March/msg00010.html #gtk|1299517909|0||1|3 105|GTK+ and friends|GTKtoolkit|PyGObject, the new Python introspection based bindings almost ready for the 2.28 stable release: http://ur1.ca/3dfaj #python #gtk|1299081554|0||0|5 106|GTK+ and friends|GTKtoolkit|GTK+ 3.0.1 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2011-February/msg00088.html #gtk|1298379744|0||0|4 107|GTK+ and friends|GTKtoolkit|More features/ideas for gtk+ 3.2: pictures: https://mail.gnome.org/archives/gtk-devel-list/2011-February/msg00038.html #gtk|1297815657|0||1|2 108|GTK+ and friends|GTKtoolkit|New features/ideas for gtk+ 3.2: Translucent TextViews : http://blogs.gnome.org/tvb/2011/02/14/translucent-textviews/ #gtk|1297707521|0||1|2 109|GTK+ and friends|GTKtoolkit|Blog post of our tireless maintainer, Matthias Clasen: http://blogs.fedoraproject.org/wp/mclasen/2011/02/10/gtk-3-is-here/ #gtk #gtk3|1297378021|0||0|5 110|GTK+ and friends|GTKtoolkit|Highlights: Cairo-based, XI2, new theming API, Flexible geometry management, Multiple backend support for GDK, easy application support ...|1297373117|0||0|3 111|GTK+ and friends|GTKtoolkit|GTK+ 3.0 released!! : http://mail.gnome.org/archives/gtk-devel-list/2011-February/msg00020.html gtk!|1297372977|0||1|20 112|GTK+ and friends|GTKtoolkit|GLib 2.28.0 (stable) released: https://mail.gnome.org/archives/gtk-devel-list/2011-February/msg00014.html #gtk #glib|1297196093|0||0|2 113|GTK+ and friends|GTKtoolkit|GTK+ 2.99.3 released: latest beta before GTK+3 http://mail.gnome.org/archives/gtk-devel-list/2011-February/msg00004.html #gtk|1296609072|0||1|1 114|GTK+ and friends|GTKtoolkit|Glade 3.9.2 released: off screen, workspace new look, GtkComboBoxText, GtkFileFilter, GtkApplication and more! http://ur1.ca/335is #gtk #rad|1296608221|0||1|0 115|GTK+ and friends|GTKtoolkit|GTK+ 2.24 ( STABLE ) released: This will be the latest 2.x release. http://ur1.ca/32cft #gtk|1296438857|0||2|0 116|GTK+ and friends|GTKtoolkit|More progress on #Glade, the GTK+ #interface #designer: http://ur1.ca/2uzpa Note that Glade 3.8 -> #gtk2 and Glade 3.10-> #gtk3 #gtk|1295186227|0||0|2 117|GTK+ and friends|GTKtoolkit|RT @prcutler RT @fcrozat: First shot at GNOME3 evaluation usb stick : http://bit.ly/i1wM8X #gnome #gnome3 #gnome-shell #opensuse #gnome|1295186033|0||1|0 118|GTK+ and friends|GTKtoolkit|If you want to try the #wayland backend, checkout this branch: http://git.gnome.org/browse/gtk+/log/?h=gdk-backend-wayland #gtk|1294739562|0||1|5 119|GTK+ and friends|GTKtoolkit|GTK+ 2.99.1 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2011-January/msg00005.html #gtk|1294738413|0||0|0 120|GTK+ and friends|GTKtoolkit|GTK+ 2.99: It is now possible to include multiple GDK backends in a single library. Use --enable-{x11,win32,quartz}-backend #gtk|1294344201|0||0|0 121|GTK+ and friends|GTKtoolkit|GTK+ 2.99: The removal of GSEALEd struct members has been completed in this release #gtk|1294344070|0||0|1 122|GTK+ and friends|GTKtoolkit|GTK+ 2.99.0 (unstable) released http://mail.gnome.org/archives/gtk-devel-list/2011-January/msg00001.html #gtk|1294344044|0||0|2 123|GTK+ and friends|GTKtoolkit|GLib 2.27.90 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2011-January/msg00000.html #glib|1294343933|0||0|0 124|GTK+ and friends|GTKtoolkit|Glade 3.9.0 (unstalbe) released: snapshot leading up to Glade 3.10 that will depend on GTK+3 http://ur1.ca/2rir0 #gtk #rad|1294343894|0||0|1 125|GTK+ and friends|GTKtoolkit|Glade 3.7.3 (unstable) released: snapshot leading up to Glade 3.8 that\nwill depend on GTK+ 2.24 http://ur1.ca/2riqg #gtk|1294343835|0||0|0 126|GTK+ and friends|GTKtoolkit|RT @hoegsberg: Multi-backend support in GTK+: http://bit.ly/gDwugJ - switch between #Wayland and X11 by setting GDK_BACKEND #gtk|1294201849|0||0|0 127|GTK+ and friends|GTKtoolkit|RT @krietvel Blog post \"GDK 3.0 on Mac OS X\" http://bit.ly/ihr9kH or how GDK became awesome in GTK+ 3.0. #gtk #osx|1293728637|0||0|1 128|GTK+ and friends|GTKtoolkit|RT @krietvel Blog post \"Refactoring GtkTreeView using GtkCellArea\" http://bit.ly/g9aArE #gtk|1293728607|0||0|0 129|GTK+ and friends|GTKtoolkit|Also, the treeview-refactor branch has been merged too|1293036166|0||1|0 130|GTK+ and friends|GTKtoolkit|New in GTK+ 2.91.7: gdk-backend branch have been merged: the goal is allowing to build a single gdk library that contains multiple backends|1293036118|0||0|0 131|GTK+ and friends|GTKtoolkit|GTK+ 2.91.7 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-December/msg00155.html #gtk|1293035980|0||1|2 132|GTK+ and friends|GTKtoolkit|GTK+ 2.23.3 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-December/msg00156.html #gtk|1293035865|0||0|2 133|GTK+ and friends|GTKtoolkit|GLib 2.27.5 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-December/msg00152.html #gtk #glib|1293035786|0||0|0 134|GTK+ and friends|GTKtoolkit|Glade 3.7.2 (unstable) released: http://lists.ximian.com/pipermail/glade-devel/2010-December/001853.html #gtk #RAD|1292589571|0||0|0 135|Andrea Cimitan|cimi|RT @cimi: reading migration docs, later Murrine will start to be ported over GtkStyleContext (so CSS fun :))|1291813590|0|GTKtoolkit|0|1 136|GTK+ and friends|GTKtoolkit|Work to building multiple backends on the same system started: http://ur1.ca/2ieid #gtk|1291614285|0||0|2 137|GTK+ and friends|GTKtoolkit|RT @garnacho : gtk-style-context landed in GTK+ master, if gnome3 looks temporarily uglier that was me :) #gtk #gnome|1291613819|0||0|0 138|Stormy|storming|RT @storming: Anyone know of any call centers that use GNOME? Potential funding for a11y work if we do ...|1291387291|0|GTKtoolkit|0|4 139|GTK+ and friends|GTKtoolkit|Final part of the Benjamin Otte GTK3 rendering\ncleanup has landed: http://ur1.ca/2hrc9 #gtk|1291375493|0||0|0 140|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtkmm 2.91.5 (unstable) released: http://mail.gnome.org/archives/gtkmm-list/2010-December/msg00000.html #gtk #bindings #cplusplus|1291212942|0||0|0 141|GTK+ and friends|GTKtoolkit|ANNOUNCE: glibmm 2.27.4 (unstable) released: http://ur1.ca/2h77z #glib #bindings #cplusplus|1291212883|0||0|0 142|GTK+ and friends|GTKtoolkit|GtkAppChooser landed in master: https://bugzilla.gnome.org/show_bug.cgi?id=582557#c10 #gtk|1291212784|0||0|0 143|GTK+ and friends|GTKtoolkit|larger changes in GTK+ soon: GtkStyleContext, rendering-cleanup, app-chooser branch, GtkRadioGroup branch, http://ur1.ca/2gs5u #gtk|1291211812|0||2|0 144|GTK+ and friends|GTKtoolkit|New widget: GtkSwitch http://blogs.fedoraproject.org/wp/mclasen/2010/11/29/onoff/ thanks to @ebassi and Matthias Clasen for the review #gtk|1291211711|0||2|1 145|GTK+ and friends|GTKtoolkit|GTK+ html backend (broadway branch) landed: http://mail.gnome.org/archives/gtk-devel-list/2010-November/msg00103.html #gtk|1291211452|0||0|1 146|GTK+ and friends|GTKtoolkit|GTK+ 2.91.5 (unstalbe) released: http://mail.gnome.org/archives/gtk-devel-list/2010-November/msg00109.html #gtk|1291211337|0||0|1 147|GTK+ and friends|GTKtoolkit|GLib 2.27.4 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-November/msg00108.html #gtk #glib|1291211331|0||0|0 148|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtkmm 2.91.4 released: http://mail.gnome.org/archives/gtkmm-list/2010-November/msg00095.html #gtk #cplusplus #bindings|1290451737|0||0|0 149|GTK+ and friends|GTKtoolkit|Introducing GtkCellArea: height-for-width geometry management for GtkTreeViews http://ur1.ca/2e5pe #gtk|1290310899|0||1|2 150|Javier Jardón|jjardon|RT @jjardon: gtk+3 packages landed in #Debian experimental: http://packages.debian.org/experimental/libgtk3.0-0 #gtk|1290036413|0|GTKtoolkit|0|2 151|GTK+ and friends|GTKtoolkit|WIP Porting guide to migrate from GTK+2 to GTK+3: http://ur1.ca/1xbzs #gtk #xfce #lxde #gnome|1290036396|0||4|6 152|GTK+ and friends|GTKtoolkit|#GSettings is fast (really): http://blogs.gnome.org/desrt/2010/11/15/gsettings-is-fast/ #gtk #glib|1289853926|0||1|2 153|GTK+ and friends|GTKtoolkit|Help making Glade ready for GTK+ 3: http://blogs.gnome.org/johannes/2010/11/15/help-making-glade-ready-for-3-0/ #gtk|1289853600|0||1|0 154|GTK+ and friends|GTKtoolkit|Anyone up to fix it? RT @vwduder: I wish #gtk wouldn't actually show the window until all of the contents have been rendered to the drawable|1289434823|0||0|0 155|GTK+ and friends|GTKtoolkit|PyGObject 2.27.0 (unstable) released: http://mail.gnome.org/archives/python-hackers-list/2010-November/msg00013.html #python #bindings #gtk|1289431671|0||0|0 156|GTK+ and friends|GTKtoolkit|glibmm 2.27.3 (unstable) released: http://mail.gnome.org/archives/gtkmm-list/2010-November/msg00058.html #glib #cplusplus #bindings|1289387769|0||0|0 157|GTK+ and friends|GTKtoolkit|GLib 2.27.3 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-November/msg00043.html #gtk #glib|1289322725|0||0|1 158|GTK+ and friends|GTKtoolkit|GTK+ 2.91.3 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-November/msg00010.html #gtk|1288758787|0||0|1 159|GTK+ and friends|GTKtoolkit|GLib 2.27.2 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-November/msg00002.html #gtk #glib|1288758720|0||0|0 160|GTK+ and friends|GTKtoolkit|Gtk 3.0 motto: \"We are fixing it!\"|1288630204|0||1|4 161|GTK+ and friends|GTKtoolkit|Recent Openismus contributions to @GtkToolkit http://bit.ly/amuAdX Thank you guys!|1288343314|0||0|0 162|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtkmm 2.91.2 (unstable) released: http://mail.gnome.org/archives/gtkmm-list/2010-October/msg00058.html #gtk #cplusplus|1288098381|0||0|0 163|GTK+ and friends|GTKtoolkit|ANNOUNCE: glibmm (unstable) 2.27.1 released: http://mail.gnome.org/archives/gtkmm-list/2010-October/msg00059.html #gtk #cplusplus|1288098335|0||0|0 164|GTK+ and friends|GTKtoolkit|GTK+ 2.91.2 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-October/msg00230.html #gtk|1288058960|0||0|0 165|GTK+ and friends|GTKtoolkit|GLib 2.27.1 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-October/msg00222.html #gtk #glib|1288049934|0||0|1 166|GTK+ and friends|GTKtoolkit|@garnacho shows off 3.0 CSS awesomness as a result of his work at #gtkhackfest http://bit.ly/aV99F|1288015424|0||0|0 167|GTK+ and friends|GTKtoolkit|GtkGrid landed:new container similar to GtkTable without unnecessary restrictions.It does height-for-width geometry management. #gtkhackfest|1287759681|0||0|1 168|GTK+ and friends|GTKtoolkit|RT @bertogg: The GTK+ artillery: http://flic.kr/p/8M16nu http://flic.kr/p/8M16d7 #gtkhackfest #gtk|1287744902|0||0|0 169|GTK+ and friends|GTKtoolkit|GtkScrollable interface landed in master: http://git.gnome.org/browse/gtk+/commit/?id=55196a705f00564a44647bfc97981db0a783369a #gtk|1287744793|0||0|0 170|Kristian Rietveld|krietvel|RT @krietvel: Blogged on \"Optimizing legacy code\". Or \"Color space conversion is more expensive than you might think\". http://bit.ly/duA ...|1287711819|0|GTKtoolkit|0|1 171|GTK+ and friends|GTKtoolkit|Rounded corners in GtkEntry (thanks Boram Park!) http://ur1.ca/257f0 #gtk #gtkhackfest|1287711709|0||0|6 172|Berto Garcia|bertogg|RT @bertogg: Ryan and Benjamin discussing GtkStyle at the Hercules Tower #gtkhackfest http://twitgoo.com/1pw774|1287708209|0|GTKtoolkit|0|1 173|GTK+ and friends|GTKtoolkit|RT @bertogg Working late at night #gtkhackfest http://twitgoo.com/1pvw46 #gtk|1287602614|0||0|0 174|GTK+ and friends|GTKtoolkit|WIP docs of the new theme API : http://mail.gnome.org/archives/gtk-devel-list/2010-October/msg00134.html #gtkhackfest #gtk|1287564745|0||0|0 175|GTK+ and friends|GTKtoolkit|GtkApplication landed in master: http://ur1.ca/24fhe Feedback welcome #gtk #gtkhackfest|1287564609|0||0|0 176|Emmanuele Bassi|ebassi|RT @ebassi: lots of discussions at the #gtkhackfest - it's great to see the roadmap for 4.0 take shape|1287564383|0|GTKtoolkit|0|2 177|Berto Garcia|bertogg|RT @bertogg: Update from the GTK+ Hackfest 2010: http://blogs.igalia.com/berto/2010/10/19/gtk-hackfest-2010/ #gtkhackfest|1287564380|0|GTKtoolkit|0|3 178|Berto Garcia|bertogg|RT @bertogg: Photos from the #gtkhackfest in Coruña: http://www.flickr.com/photos/tags/gtkhackfest2010/ #igalia #gnome|1287564365|0|GTKtoolkit|0|2 179|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtkmm 2.91.1 released: http://mail.gnome.org/archives/gtkmm-list/2010-October/msg00033.html #gtk #cplusplus|1287478956|0||1|0 180|GTK+ and friends|GTKtoolkit|The #gtkhackfest started today. Thanks a lot to the event sponsors: #igalia, #lanedo, #codethink and the #GNOME foundation.|1287447826|0||0|2 181|GTK+ and friends|GTKtoolkit|#gtkhackfest started today at the #igalia offices in A Coruña http://live.gnome.org/Hackfests/GTK2010 #gnome #gtk|1287422775|0||0|0 182|GTK+ and friends|GTKtoolkit|libnotify, gtk API changes in 2.91.1: http://mail.gnome.org/archives/desktop-devel-list/2010-October/msg00193.html #gtk #gnome #xfce #lxde|1287324866|0||0|0 183|GTK+ and friends|GTKtoolkit|GTK+ 2.91.1 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-October/msg00127.html #gtk|1287324761|0||0|1 184|GTK+ and friends|GTKtoolkit|GTK+ 2.23.0 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-October/msg00128.html #gtk|1287324697|0||0|1 185|GTK+ and friends|GTKtoolkit|RT @bratschegnome: Backported gtk window resize grips to 2.x and posted to ppa:bratsche/gtk for any #ubuntu people who want to use/test it.|1287156390|0||0|1 186|GTK+ and friends|GTKtoolkit|Resize grip in all the GtkWindows now: http://blogs.fedoraproject.org/wp/mclasen/2010/10/09/getting-a-grip/ thanks to @bratschegnome #gtk|1286600672|0||0|1 187|GTK+ and friends|GTKtoolkit|@judsontwit You have some tips for porting here: http://live.gnome.org/PyGObject/IntrospectionPorting No many changes needed #python|1286298188|0||0|0 188|GTK+ and friends|GTKtoolkit|@UstunOzgur take a look here: http://live.gnome.org/PyGTK and here: http://live.gnome.org/PyGObject|1286297979|0||0|0 189|Kristian Rietveld|krietvel|RT @krietvel: Just pushed the last patch that finishes the transition of the OS X backend to the new rendering goodness. #gtk|1286297494|0|GTKtoolkit|0|1 190|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtkmm 2.91.0 (#C++ bindings) released: http://mail.gnome.org/archives/gtkmm-list/2010-October/msg00000.html #gtk|1286128646|0||0|1 191|GTK+ and friends|GTKtoolkit|GTK+ 2.91.0 (unstable) released: http://ur1.ca/1xbzr The rendering cleanup work has landed. Porting guide here: http://ur1.ca/1xbzs #gtk|1286073059|0||0|0 192|GTK+ and friends|GTKtoolkit|Anyone up to the challenge of writing a WebP gdkpixbuf loader?|1285950573|0||0|3 193|Clutter Toolkit|cluttertoolkit|RT @cluttertoolkit: Clutter 1.4.0 - new stable release! grab it while it's hot, on www.clutter-project.org|1285731448|0|GTKtoolkit|0|10 194|GTK+ and friends|GTKtoolkit|We strongly recommend not using PyGTK for new projects and to port existing applications from #PyGTK to #PyGObject #python #gtk|1285721997|0||5|39 195|GTK+ and friends|GTKtoolkit|ANNOUNCE: PyGObject 2.26.0 released:http://mail.gnome.org/archives/python-hackers-list/2010-September/msg00019.html #gtk #python #bindings|1285721968|0||0|0 196|GTK+ and friends|GTKtoolkit|ANNOUNCE: GLib 2.26.0 (STABLE) released: http://mail.gnome.org/archives/gtk-devel-list/2010-September/msg00284.html #glib #gtk|1285721379|0||0|0 197|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtkmm 2.22.0 (STABLE) released: http://mail.gnome.org/archives/gtkmm-list/2010-September/msg00095.html #gtk #c++ #bindings|1285721312|0||0|0 198|GTK+ and friends|GTKtoolkit|PyGTK 2.22.0 released: http://ur1.ca/1sc2n Note that new and existing PyGtk applications are recommended to use PyGObject|1285596826|0||0|0 199|GTK+ and friends|GTKtoolkit|GTK+ 2.22.0 ( STABLE ) released: http://mail.gnome.org/archives/gtk-devel-list/2010-September/msg00263.html #gtk|1285286958|0||2|5 200|GTK+ and friends|GTKtoolkit|Last call for the people interested in attending the #GTK+ hackfest in A Coruña: Please sign up at latest tomorrow! http://ur1.ca/1r2gt|1285255897|0||0|2 201|GTK+ and friends|GTKtoolkit|#GLib status update: GLib 2.25.17 and 2.27.0 released: http://mail.gnome.org/archives/gtk-devel-list/2010-September/msg00232.html #gtk|1285245997|0||0|0 202|GTK+ and friends|GTKtoolkit|Thoughts about #GtkTreeView refactoring: http://mail.gnome.org/archives/gtk-devel-list/2010-September/msg00260.html #gtk|1285245546|0||0|1 203|GTK+ and friends|GTKtoolkit|GTK+ 2.21.8 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-September/msg00204.html #gtk|1284485086|0||0|0 204|GTK+ and friends|GTKtoolkit|New GObject API added: g_object_class_install_properties(), an efficient way to install properties: http://ur1.ca/1mh3s #gobject #glib #gtk|1284484816|0||0|0 205|GTK+ and friends|GTKtoolkit|legacy-free grid container proposed by @havocp: http://mail.gnome.org/archives/gtk-devel-list/2010-September/msg00089.html #gtk|1283965732|0||0|1 206|GTK+ and friends|GTKtoolkit|Minutes of the #GTK team meeting - 2010-09-07: http://mail.gnome.org/archives/gtk-devel-list/2010-September/msg00115.html|1283965715|0||0|0 207|GTK+ and friends|GTKtoolkit|New work to get #DirectFB backend in a good state, thanks Lionel Landwerlin! #gtk http://ur1.ca/1k0hx|1283965546|0||0|0 208|GTK+ and friends|GTKtoolkit|GTK+ 2.21.7 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00291.html #gtk|1283198533|0||0|0 209|GTK+ and friends|GTKtoolkit|GObject Introspection status: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00254.html #gtk #glib|1282939837|0||1|2 210|GTK+ and friends|GTKtoolkit|GDateTime, the new time & date API just landed in Glib: https://bugzilla.gnome.org/show_bug.cgi?id=50076#c85 #gtk #glib|1282699797|0||0|1 211|GTK+ and friends|GTKtoolkit|CSS-like styling for #GTK+ thanks to Carlos Garnacho: http://blogs.gnome.org/carlosg/2010/08/23/css-like-styling-for-gtk/ #gtk|1282602303|0||0|3 212|GTK+ and friends|GTKtoolkit|RT @migueldeicaza: Gtk+ getting cascading stylesheets: http://blogs.gnome.org/carlosg/2010/08/23/css-like-styling-for-gtk/|1282594548|0||0|1 213|andreasn1|andreasn1|RT @andreasn1: ♺ @hbons: thanks to gtk+ maintainer mclasen we can now ditch icon-naming-utils :)|1282356193|0|GTKtoolkit|0|2 214|GTK+ and friends|GTKtoolkit|GTK+ schedule: glib 2.26 and #gtk+ 2.22 for #GNOME 2.32 (Sep'10). glib 2.28, gtk+ 2.24 and gtk+ 3.0 for Dec'10 http://ur1.ca/16o49|1282256544|0||0|0 215|GTK+ and friends|GTKtoolkit|@thomasvs I saw someone with an N900 in my lift yesterday, had the same thought|1282217985|0||0|0 216|Simón P.|spenap|RT @spenap: GObject Introspection has landed in Grilo! http://bit.ly/9f4DAa #mswl #igalia #pygobject #gobject-introspection|1282166595|0|GTKtoolkit|0|4 217|GTK+ and friends|GTKtoolkit|Minutes of the GTK+ Team Meeting - 2010-08-17: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00155.html #gtk|1282094165|0||0|0 218|GTK+ and friends|GTKtoolkit|GTK+ 2.90.6 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00146.html #gtk|1282061092|0||0|0 219|Emmanuele Bassi|ebassi|RT @ebassi: http://bit.ly/9gabxR - @cluttertoolkit + gobject-introspection + pygobject. say goodbye to pyclutter!|1282043493|0|GTKtoolkit|0|3 220|GTK+ and friends|GTKtoolkit|GTK+ 2.21.6 (unstable) Relased: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00127.html #gtk|1282006494|0||0|0 221|Stormy|storming|RT @storming: Novell is looking for a GNOME developer to work on SUSE Linux. http://linkd.in/bEAUUj|1282001084|0|GTKtoolkit|0|19 222|Tommi Komulainen|tko|RT @tko: I want my libglib-gslist.so and libglib-glist.so .. and some popcorn. maybe just popcorn|1282000936|0|GTKtoolkit|0|1 223|GTK+ and friends|GTKtoolkit|GLib 2.25.14 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00123.html #gtk|1282000398|0||0|0 224|Emmanuele Bassi|ebassi|RT @ebassi: I'm pretty pleased with the API that landed in json-glib for 0.12|1281810990|0|GTKtoolkit|0|1 225|GTK+ and friends|GTKtoolkit|The @ebassi implementation to support common licenses in about dialog has been added to #GTK: http://ur1.ca/11u5a|1281436699|0||0|0 226|GTK+ and friends|GTKtoolkit|Web inspector support lands in #WebKitGtk+ check the screencast demo http://blog.kov.eti.br/?p=118|1281376660|0||1|0 227|GTK+ and friends|GTKtoolkit|#GTK+ #Python developers are recommended to use the\nGObject-Introspection features available in PyGObject. http://live.gnome.org/PyGObject|1281362391|0||0|0 228|GTK+ and friends|GTKtoolkit|PyGTK 2.21.0 (unstable) released: http://ur1.ca/11gse . 2.22 will be the last release in the PyGTK series.|1281362089|0||0|0 229|GTK+ and friends|GTKtoolkit|#GTK+ Hackfest, October 18-22, A Coruña, Spain. http://ur1.ca/11f6u . Add yourself if you are interested in attending http://ur1.ca/11f6v|1281350218|0||0|4 230|GTK+ and friends|GTKtoolkit|Benjamin Otte's proposal for GTK+ drawing API: gtk_widget_draw(): http://ur1.ca/11f5m #gtk|1281350013|0||2|0 231|GTK+ and friends|GTKtoolkit|Some drawing APIs have been deprecated in GTK+ 2.22. Start porting your drawing to Cairo! http://ur1.ca/11f4t|1281349855|0||0|0 232|GTK+ and friends|GTKtoolkit|GLib 2.24.2 (stable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00057.html #gtk|1281349547|0||0|0 233|GTK+ and friends|GTKtoolkit|glib (unstable) 2.25.13 released: http://mail.gnome.org/archives/gtk-devel-list/2010-August/msg00052.html #gtk|1281201884|0||0|0 234|GTK+ and friends|GTKtoolkit|glib 2.25.12 is here! http://mail.gnome.org/archives/gtk-devel-list/2010-July/msg00052.html There have been many API changes in GDBus.|1280601329|0||0|0 235|Chema Casanova|txenoo|RT @txenoo: Dispoñible a foto de grupo de #guadeces2010 http://www.flickr.com/photos/davizin/4822344878/ gracias a David Cabrero|1280002637|0|GTKtoolkit|0|2 236|Andrea Cimitan|cimi|RT @cimi: Gtk+ 3.0 theming engines... let's start the discussion :)|1279678340|0|GTKtoolkit|0|1 237|Alberto Ruiz|acruiz|RT @acruiz: Marker support in GtkScrollbar http://bit.ly/cKUTeW|1279580539|0|GTKtoolkit|0|2 238|GTK+ and friends|GTKtoolkit|RT @ebassi: today I moved #clutter-gtk to depend on #gtk3; tomorrow w I'll fix the double-events bug; on wednesday I'll rework the API|1279561116|0||0|0 239|Sandy Armstrong|sandyarmstrong|RT @sandyarmstrong: @awafaa gconf is obsolete, fool|1279301600|0|GTKtoolkit|0|1 240|Jonh Wendell|jwendell|RT @jwendell: #vinagre ported to GtkApplication :) !gtk|1279228583|0|GTKtoolkit|0|1 241|Clutter Toolkit|cluttertoolkit|RT @cluttertoolkit: #clutter 1.3.8 is the first snapshot with cally, the accessibility library for clutter apps and toolkits|1278972910|0|GTKtoolkit|0|4 242|GTK+ and friends|GTKtoolkit|GTK+ 2.90.5 released: http://mail.gnome.org/archives/gtk-devel-list/2010-July/msg00021.html #gtk|1278952963|0||0|0 243|GTK+ and friends|GTKtoolkit|Glib 2.25.11 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-July/msg00019.html #gtk|1278952925|0||0|0 244|Johan Dahlin|johandahlin|RT @johandahlin: New blog post: Using LLVM to speed up function invocation in a dynamic language binding http://bit.ly/dA6IjH|1278620689|0|GTKtoolkit|0|4 245|GTK+ and friends|GTKtoolkit|GTK+ bindings for #Falcon announced: http://mail.gnome.org/archives/gtk-list/2010-June/msg00183.html #gtk|1278000421|0||0|0 246|GTK+ and friends|GTKtoolkit|#GSettings / #dconf is ready: http://mail.gnome.org/archives/desktop-devel-list/2010-June/msg00226.html . Please port your modules! #gtk|1277909398|0||0|1 247|GTK+ and friends|GTKtoolkit|More work in height-for-width layout system for GTK+ : http://blogs.gnome.org/tvb/2010/06/30/gtk-learns-height-for-width-episode-ii/ #gtk|1277909313|0||0|0 248|GTK+ and friends|GTKtoolkit|GLib 2.25.10 (unstable) released: http://ur1.ca/0ee7o WARNING: There have been API changes in GDBus. #gtk|1277685452|0||0|1 249|GTK+ and friends|GTKtoolkit|gdk-pixbuf is now a standalone package: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00172.html #gtk|1277685365|0||0|1 250|GTK+ and friends|GTKtoolkit|GTK+ 2.90.4 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00182.html #gtk|1277685274|0||0|0 251|GTK+ and friends|GTKtoolkit|GTK+ 2.21.3 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00183.html #gtk|1277685237|0||0|0 252|GTK+ and friends|GTKtoolkit|We are open to fix API that make the life of #bindings harder but only by addition+rename, or addition+deprecation. File bugs, please #gtk|1277312749|0||0|0 253|GTK+ and friends|GTKtoolkit|Minutes of the GTK+ team IRC meeting - 2010-06-22: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00155.html #gtk|1277312445|0||0|0 254|GTK+ and friends|GTKtoolkit|GTK+ team IRC meeting 2010-06-22. In #gtk-devel on irc.gnome.org at 20:00 UTC. Agenda: http://ur1.ca/q6jh #gtk|1277226823|0||0|0 255|Clutter Toolkit|cluttertoolkit|RT @cluttertoolkit: the new #clutter website is now live: http://www.clutter-project.org|1276948072|0|GTKtoolkit|0|5 256|GTK+ and friends|GTKtoolkit|Proposed #GNOME goal: Port your #PyGTK to the new #PyGI bindings http://bit.ly/cvfzO8|1276941335|0||1|2 257|Christian Hergert|hergertme|RT @vwduder: im sad because @ebassi doesn't like my in/out param comments :-)|1276904611|0|GTKtoolkit|0|1 258|Guillaume Mazoyer|gmazoyer|RT @gmazoyer: ♺ @GTKtoolkit: #java bindings version 4.0.16 released: http://article.gmane.org/gmane.comp.gnome.bindings.java/1796 #gtk|1276889421|0|GTKtoolkit|0|1 259|GTK+ and friends|GTKtoolkit|#java bindings version 4.0.16 released: http://article.gmane.org/gmane.comp.gnome.bindings.java/1796 #gtk|1276885917|0||0|0 260|GTK+ and friends|GTKtoolkit|RT @cwiiis: MxIconTheme and MxIcon respect system's icon theme (and changes) now in #mx master :) Made possible by @thosw's XSettings work|1276883019|0||0|0 261|GTK+ and friends|GTKtoolkit|#javascript mailing list just created. Discuss its usage in GObject libraries: GTK+, Glib ... http://ur1.ca/08lwz by @jwendell #gtk|1276842639|0||0|0 262|GTK+ and friends|GTKtoolkit|Note fot Win32 users: XP theming is back in 2.90.3 . Please test. #gtk|1276829697|0||0|0 263|GTK+ and friends|GTKtoolkit|GTK+ 2.90.3 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00137.html #gtk|1276829633|0||0|0 264|GTK+ and friends|GTKtoolkit|GLib 2.25.9 (unstable) released: http://ur1.ca/08hrl WARNING: API changes in GDBus, GSettings and GApplication #gtk|1276829581|0||0|0 265|scaroo|scaroo|RT @scaroo: #SeedKit does RGBA window with css shadows and stuff : http://dl.dropbox.com/u/5746554/seedkit-does-rgba.png|1276734086|0|GTKtoolkit|0|1 266|scaroo|scaroo|RT @scaroo: Great #SeedKit showcase from @cldx3000 : http://bit.ly/cRDosJ :D|1276734071|0|GTKtoolkit|0|1 267|Lluis Sanchez Gual|slluis|RT @slluis: MonoDevelop 2.4 released! http://monodevelop.com/Download/MonoDevelop_2.4_Released|1276699438|0|GTKtoolkit|0|35 268|GTK+ and friends|GTKtoolkit|RT @bertogg: GNOME Developer Training at GUADEC, with Claudio Saavedra, Fernando Herrera, Dave Neary and me: http://is.gd/cPkpJ|1276687240|0||0|0 269|SparkleShare|SparkleShare|RT @sparkleshare: Let's start sparkling!|1276619215|0|GTKtoolkit|0|7 270|Haakon Sporsheim|haaspors|RT @haakonsporsheim: I built my first app for #android today using jni and #glib :P Sweet :)|1276472258|0|GTKtoolkit|0|4 271|GTK+ and friends|GTKtoolkit|Converting libraries and plugins to use GTK+3: http://mail.gnome.org/archives/desktop-devel-list/2010-June/msg00142.html #gtk|1276390360|0||1|0 272|GTK+ and friends|GTKtoolkit|Call to GNOME maintainers: #GNOME 2.31.4 to ship GTK+ 2.90: http://bit.ly/bnuk3e #gtk|1276390311|0||0|0 273|GTK+ and friends|GTKtoolkit|API changes in GLib master: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00079.html #gtk|1276390197|0||1|0 274|GTK+ and friends|GTKtoolkit|GLib 2.25.8 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00036.html #gtk|1276390151|0||0|0 275|Johan Dahlin|johandahlin|RT @johandahlin: is adding introspection support for GstMiniObject and other weird instantitiable GTypes. Still left: gjs/pygi support.|1276384704|0|GTKtoolkit|0|3 276|Clutter Toolkit|cluttertoolkit|RT @cluttertoolkit: So, yes: we dropped the copyright waiver on Clutter and Cogl. Contributions welcome!|1276281694|0|GTKtoolkit|0|12 277|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtkmm (C++ GTK+ bindings) 2.90 (unstable) released: http://ur1.ca/06nhn #gtk|1276182909|0||0|0 278|Juanje Ojeda |juanjeojeda|RT @juanjeojeda: Progress on Gtk+ multitouch support: http://bit.ly/amIUiL #gtk #multitouch /via @garnacho|1276158728|0|GTKtoolkit|0|2 279|GTK+ and friends|GTKtoolkit|GTK+ 2.90.2 (unstable) released: http://ur1.ca/06k6o Feedback about GtkApplication apreciated #gtk|1276141907|0||0|0 280|GTK+ and friends|GTKtoolkit|Minutes of the GTK+ team IRC meeting - 2010-06-08: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00044.html #gtk|1276040191|0||0|0 281|GTK+ and friends|GTKtoolkit|RT @bratschegnome: @federicomena http://mzl.la/9PoFhD is nice I used to have CSD whr you can drag gtk+ from anywr in a window|1276038852|0||0|0 282|GTK+ and friends|GTKtoolkit|GTK+ team IRC meeting 2010-06-08.In #gtk-devel on irc.gnome.org at 20:00 UTC.Agenda: http://ur1.ca/q6jh Everyone is invited to attend|1276010278|0||0|0 283|GTK+ and friends|GTKtoolkit|ANNOUNCE: glibmm (C++ Glib bindings) 2.25.1 (unstable) released: http://ur1.ca/067ff #gtk|1276007921|0||0|0 284|GTK+ and friends|GTKtoolkit|GLib 2.25.8 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00036.html #gtk|1276003038|0||0|1 285|GTK+ and friends|GTKtoolkit|New version of #pygi (the new #python bindings based in #GObjectIntrospection) released: http://ur1.ca/0623c|1275945620|0||0|3 286|GTK+ and friends|GTKtoolkit|RT @ebassi: aaaand GBinding (a libexo-like binding between object properties) is mostly done: http://ur1.ca/05fz1 #gtk #glib|1275653238|0||1|0 287|GTK+ and friends|GTKtoolkit|RT @ebassi: plus, I have a GIO branch with GController and friends|1275653044|0||0|0 288|GTK+ and friends|GTKtoolkit|RT @ebassi submitted my patch for creating a GObjectController and get bulk notification #gtk|1275653008|0||0|0 289|GTK+ and friends|GTKtoolkit|GTK+ 2.21.1 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00157.html #gtk|1275271768|0||0|0 290|GTK+ and friends|GTKtoolkit|#dtrace and #systemtap support added to #Glib. Enjoy! https://bugzilla.gnome.org/show_bug.cgi?id=606044 #gtk|1275056183|0||0|2 291|GTK+ and friends|GTKtoolkit|GTK+ 2.90.1 (unstable) released: http://ur1.ca/03hbv . Multiple input device support, flippable widgets and more ...|1274845319|0||1|0 292|GTK+ and friends|GTKtoolkit|Minutes of the GTK+ team IRC meeting - 2010-05-25: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00147.html #gtk #meeting|1274826674|0||0|0 293|GTK+ and friends|GTKtoolkit|[REMINDER] GTK+ team IRC meeting 2010-05-25 at 20:00 UTC. Join us in #gtk-devel on irc.gnome.org. Agenda: http://ur1.ca/q6jh #gtk #meeting|1274801128|0||0|1 294|GTK+ and friends|GTKtoolkit|Gtk2Hs 0.11.0 (Haskell bindings) released: http://haskell.org/gtk2hs/archives/2010/05/25/gtk2hs-0110-released/ #gtk #haskell|1274800929|0||0|0 295|GTK+ and friends|GTKtoolkit|dconf 0.3.1 released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00145.html #gtk|1274800819|0||0|0 296|GTK+ and friends|GTKtoolkit|GLib 2.25.7 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00144.html #gtk|1274800611|0||0|0 297|GTK+ and friends|GTKtoolkit|XI2 @garnacho 's branch ready for review (xi2-for-master): http://mail.gnome.org/archives/gtk-devel-list/2010-May/thread.html #gtk|1274472793|0||0|0 298|GTK+ and friends|GTKtoolkit|ANNOUNCE: gtk-doc 1.15 released: http://mail.gnome.org/archives/gtk-doc-list/2010-May/msg00000.html #gtk|1274446357|0||0|0 299|GTK+ and friends|GTKtoolkit|Ryan Lortie (@desrt) just released #dconf 0.3: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00128.html #gtk|1274311034|0||0|0 300|GTK+ and friends|GTKtoolkit|GLib 2.25.6 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00127.html #gtk|1274310863|0||0|0 301|GTK+ and friends|GTKtoolkit|GLib 2.25.6 (unstable) released:|1274310818|0||0|0 302|GTK+ and friends|GTKtoolkit|GLib 2.25.5 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00078.html #gtk|1273891783|0||0|0 303|GTK+ and friends|GTKtoolkit|Glade 3.7.1 released with lot of improvements: http://ur1.ca/011bc Thanks to #Openismus who helped sponsor this release #gtk|1273885948|0||0|0 304|GTK+ and friends|GTKtoolkit|GDBus merged in Glib master http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00066.html #gtk|1273837079|0||0|1 305|GTK+ and friends|GTKtoolkit|Minutes of the GTK+ team IRC meeting - 2010-05-11 : http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00047.html #gtk|1273636581|0||0|0 306|GTK+ and friends|GTKtoolkit|[REMINDER] GTK+ team IRC meeting - 2010-05-11 at 20:00 UTC. Join us in #gtk-devel on irc.gnome.org. Agenda: http://ur1.ca/q6jh #gtk #meeting|1273606386|0||0|0 307|GTK+ and friends|GTKtoolkit|GTK+ 2.90.0 (unstable) released. This is the first development release leading toward 3.0. http://ur1.ca/006p2 #gtk #gtk3|1273553873|0||0|5 308|GTK+ and friends|GTKtoolkit|Changes in GTK+ master that affect third parties: http://mail.gnome.org/archives/devel-announce-list/2010-May/msg00001.html #gtk #gtk3|1273531549|0||0|0 309|GTK+ and friends|GTKtoolkit|Have dark themes is more easy now thanks to Bastian Nocera work: http://bit.ly/dBJzgn #gtk|1273531264|0||0|2 310|GTK+ and friends|GTKtoolkit|GTK+ 2.21.0 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00026.html #gtk|1273285878|0||0|0 311|GTK+ and friends|GTKtoolkit|Minutes of the GTK+ IRC team meeting - 2010-05-04: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00010.html #gtk|1273024620|0||0|0 312|GTK+ and friends|GTKtoolkit|GTK+ 2.20.1 (stable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00004.html #gtk|1272983158|0||0|0 313|GTK+ and friends|GTKtoolkit|GLib 2.24.1 (stable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-May/msg00005.html #gtk|1272983138|0||0|0 314|GTK+ and friends|GTKtoolkit|Next GTK+ team meeting: 2010-05-04 at 20:00 UTC. More info and agenda: http://ur1.ca/q6jh . As always, everyone is invited to attend. #gtk|1272848781|0||1|0 315|GTK+ and friends|GTKtoolkit|#Perl bindings: Gtk2 1.230 (unstable) available: http://mail.gnome.org/archives/gtk-perl-list/2010-April/msg00120.html #gtk|1272341271|0||0|0 316|Emmanuele Bassi|ebassi|RT @ebassi: for the first time in ages I was able to work a bit on #gtkperl and add missing 2.16 and 2.18 wrappers|1272139155|0|GTKtoolkit|0|1 317|GTK+ and friends|GTKtoolkit|GLib 2.25.3 (unstable) released with more #GSettings fixes: http://mail.gnome.org/archives/gtk-devel-list/2010-April/msg00090.html #gtk|1272118354|0||0|1 318|GTK+ and friends|GTKtoolkit|GLib 2.25.2 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-April/msg00079.html|1272028911|0||0|0 319|GTK+ and friends|GTKtoolkit|GTK+ Learns height-for-width geometry. Thanks Tristan Van Berkom and #Openismus for sponsoring him! http://ur1.ca/wiz3 #gtk|1271969484|0||1|2 320|GTK+ and friends|GTKtoolkit|#GSettings porting guide available: http://ur1.ca/w2xl . Feedback welcomed!: http://ur1.ca/w2xn #gtk|1271777672|0||4|4 321|GTK+ and friends|GTKtoolkit|Major change in Glib 2.25.0: #GSettings framework has been merged. This provides the API to replace #GConf.|1271715090|0||0|0 322|GTK+ and friends|GTKtoolkit|GLib 2.25.0 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-April/msg00066.html #gtk|1271714608|0||0|1 323|GTK+ and friends|GTKtoolkit|GSettings status update by Matthias Clasen: http://blogs.fedoraproject.org/wp/mclasen/2010/04/17/gsettings/ #gtk #gsettingshackfest|1271519572|0||0|0 324|GTK+ and friends|GTKtoolkit|GNOME Python Hackfest: Day 1 (by John (J5) Palmieri): http://www.j5live.com/2010/04/14/gnome-python-hackfest-day-1/ #python #pythonhackfest|1271291950|0||0|1 325|GTK+ and friends|GTKtoolkit|Colin Walters: PyGTK, PyGI and PyGTK-on-PyGI #python #pythonhackfest http://ur1.ca/v5kw|1271291792|0||0|0 326|GTK+ and friends|GTKtoolkit|Python Hackfest started.Ttwo concrete goals: porting PyGObject to #Python 3.x and giving a push to PyGI. http://ur1.ca/v5jc|1271291075|0||0|0 327|GTK+ and friends|GTKtoolkit|GSettings Hackfest: Day 1 (by Vincent UNTZ) http://www.vuntz.net/journal/post/2010/04/13/GSettings-Hackfest:-Day-1 #gtk|1271290824|0||0|0 328|GTK+ and friends|GTKtoolkit|GSettings Hackfest started. Thanks to #Novell for sponsoring.Also to #RedHat, #Codethink and #Lanedo for sending people! http://ur1.ca/v5i4|1271290481|0||1|0 329|GTK+ and friends|GTKtoolkit|Xan Lopez from #Igalia attends the WebKit Contribution Meeting at the Apple HQ in Cupertino http://bit.ly/bHCqcC|1271247431|0||0|2 330|GTK+ and friends|GTKtoolkit|Kristian Rietveld advances the #GTK+ Quartz/Mac OS X backend http://bit.ly/cJzV2o|1271247006|0||2|0 331|GTK+ and friends|GTKtoolkit|#Openismus sponsors Tristan Van Berkom to complete the work on #GTK+ Natural Layout http://bit.ly/9FD3JC|1271246851|0||0|1 332|GTK+ and friends|GTKtoolkit|RT @bilboed Having trouble reading GObject or GStreamer code ? Here's a small step-by-step rundown : http://is.gd/bk7mD|1270738689|0||0|1 333|GTK+ and friends|GTKtoolkit|Colin Walters shares his thoughts about the new #GTK+ application class and its relationship with #GNOME 3 http://bit.ly/cvcHIG|1270482931|0||0|0 334|Lucas Rocha|lucasratmundo|RT @lucasratmundo: GNOME Shell has been officially proposed as a GNOME module: http://bit.ly/d1yKE2|1269993362|0|GTKtoolkit|0|3 335|Johan Dahlin|johandahlin|RT @johandahlin: New blog post http://blogs.gnome.org/johan/2010/03/30/bridging-the-development-gap-between-desktop-and-web/|1269993352|0|GTKtoolkit|0|1 336|GTK+ and friends|GTKtoolkit|New Glib STABLE release: 2.24 http://mail.gnome.org/archives/gtk-devel-list/2010-March/msg00149.html #gtk|1269892314|0||0|0 337|GTK+ and friends|GTKtoolkit|Help the GNOME Foundation to hire a sysadmin for GNOME! http://www.gnome.org/friends|1269658993|0||0|1 338|GTK+ and friends|GTKtoolkit|Our friends from #Openismus sponsor #Glade 3 improvements http://bit.ly/9GqLDl|1269656334|0||0|0 339|GTK+ and friends|GTKtoolkit|♺ @johandahlin: just commited the last remaining piece for cairo support in #gjs. World domination here we come|1269646821|0||0|0 340|FedericoMenaQuintero|federicomena|RT @federicomena: Yay, the patch for glade is done - https://bugzilla.gnome.org/show_bug.cgi?id=594231|1269616128|0|GTKtoolkit|0|1 341|Jorge Castro|castrojo|RT @castrojo: Become a Friend of GNOME: http://wp.me/poAPi-da|1269616083|0|GTKtoolkit|0|2 342|Johan Dahlin|johandahlin|RT @johandahlin: just commited the last remaining piece for cairo support in #gjs. World domination here we come|1269616001|0|GTKtoolkit|0|2 343|Jono Bacon|jonobacon|RT @jonobacon: New Acire and Python Snippets website! http://is.gd/aZGnF - still a work in progress, working on it as we speak! #pythons ...|1269615964|0|GTKtoolkit|0|5 344|GTK+ and friends|GTKtoolkit|Python Snippets: project to gather an archive of simple Python (with GTK+) examples http://ur1.ca/rru1 !gtk @jonobacon|1269555086|0||0|2 345|GTK+ and friends|GTKtoolkit|#yorbafoundation is hiring #Vala/#Gtk+ developers and summer interns in California to create multimedia apps http://yorba.org/jobs|1269479714|0||0|1 346|GTK+ and friends|GTKtoolkit|♺ @ploum: now that I have to use Qt and Qt documentation, I've only one word : #gtk rocks ! ( yeah for #gnome people)|1269441827|0||0|2 347|GTK+ and friends|GTKtoolkit|Minutes of the GTK+ Team Meeting: http://mail.gnome.org/archives/gtk-devel-list/2010-March/msg00134.html #gtk|1269391167|0||0|0 348|GTK+ and friends|GTKtoolkit|New GTK+ STABLE release: 2.20 http://mail.gnome.org/archives/gtk-devel-list/2010-March/msg00132.html #gtk|1269374138|0||1|1 349|GTK+ and friends|GTKtoolkit|Reminder: GTK+ meeting today at 20:00 UTC. Where: #gtk-devel on irc.gnome.orgAgenda: http://live.gnome.org/GTK+/Meetings|1269358583|0||0|0 350|GTK+ and friends|GTKtoolkit|GLib 2.23.6 (development branch) released: http://mail.gnome.org/archives/gtk-devel-list/2010-March/msg00131.html #gtk|1269264623|0||0|0 351|GNOME|gnome|RT @gnome: RT @rubenv GNOME was accepted for Google Summer of Code 2010! Looking for an IT student job that earns a lot? http://bit.ly/c ...|1269106193|0|GTKtoolkit|0|5 352|FedericoMenaQuintero|federicomena|RT @federicomena: Untested code is broken code, even if it compiles. #yay #me|1269106077|0|GTKtoolkit|0|1 353|Summer of Code|gsoc|RT @gsoc: Mentor organizations for #GSoC have been announced! http://bit.ly/bVMPWe|1268956782|0|GTKtoolkit|0|31 354|Clutter Toolkit|cluttertoolkit|RT @cluttertoolkit: just released clutter-gtk 0.10.4 - depending on clutter 1.2 and gtk+ 2.19|1268956726|0|GTKtoolkit|0|1 355|GTK+ and friends|GTKtoolkit|Support for Class private data will be available in Glib 2.24: https://bugzilla.gnome.org/show_bug.cgi?id=521707|1268848373|0||0|2 356|GTK+ and friends|GTKtoolkit|GTK+ team IRC meeting: March 23, at 20:00. http://ur1.ca/q6jg . Agenda: http://ur1.ca/q6jh #gtk|1268845861|0||0|1 357|GTK+ and friends|GTKtoolkit|GTK+ 2.18.9 (stable branch) released: http://mail.gnome.org/archives/gtk-devel-list/2010-March/msg00115.html #gtk|1268844918|0||0|0 358|GTK+ and friends|GTKtoolkit|GLib 2.22.5 released: http://mail.gnome.org/archives/gtk-devel-list/2010-March/thread.html #gtk|1268748183|0||0|0 359|GTK+ and friends|GTKtoolkit|GTK+ 2.18.8 released: http://mail.gnome.org/archives/gtk-devel-list/2010-March/msg00078.html #gtk|1268700945|0||0|0 360|GTK+ and friends|GTKtoolkit|@chrisblizzard There's a .zip bundle indeed http://bit.ly/9ZkQCM|1268698714|0||0|0 361|Alberto Ruiz|acruiz|RT @acruiz: libmodel and GTK+ from Codethink Labs! http://aruiz.synaptia.net/siliconisland/2010/03/libmodel-and-gtk-from-codethink-labs.html|1268698629|0|GTKtoolkit|0|3 362|GTK+ and friends|GTKtoolkit|New version of the User Interface Designer #Glade released: 3.7.0 http://ur1.ca/phww #gtk|1268458482|0||0|0 363|GTK+ and friends|GTKtoolkit|GTK+ 2.19.7 released: http://mail.gnome.org/archives/gtk-devel-list/2010-March/msg00044.html #gtk|1268174602|0||0|0 364|GTK+ and friends|GTKtoolkit|#GTK + future idea: automatic composite widgets using #GtkBuilder under the hood http://ur1.ca/oxly|1268157762|0||0|0 365|GTK+ and friends|GTKtoolkit|GLib 2.23.5 is released, congrats to @desrt for his first release http://bit.ly/a3th6S|1268070995|0||0|1 366|GTK+ and friends|GTKtoolkit|The first #PyGTK hackfest ever has been announced, 3.0 and Introspection are the major themes http://bit.ly/9Bd31g|1267875279|0||1|1 367|GTK+ and friends|GTKtoolkit|Kristian Rietveld gives an update of the GTK+/Quartz MacOSX native port http://bit.ly/cZ84VN|1267832356|0||2|0 368|Jono Bacon|jonobacon|RT @jonobacon: Merged in more python-snippets: desktop widget, drag and open in PyGTK, GStreamer video playback, and a bunch of fixes! h ...|1267831925|0|GTKtoolkit|0|3 369|GTK+ and friends|GTKtoolkit|#Openismus is looking for C/C++ GTK+/Qt trainees http://bit.ly/c16WEp|1267831840|0||0|0 370|Clutter Toolkit|cluttertoolkit|RT @cluttertoolkit: clutter 1.2.0 - first stable release, with lots of new API - http://bit.ly/ckdS6R|1267561885|0|GTKtoolkit|0|9 371|GTK+ and friends|GTKtoolkit|#Lanedo is hiring GTK+/GNOME hackers! http://bit.ly/d6fTWQ|1267560392|0||0|1 372|GTK+ and friends|GTKtoolkit|You can help to make a difference too, help the #GTK+ maintainers to improve the documetnation infrastructure! http://bit.ly/dmJifE|1267538283|0||0|1 373|GTK+ and friends|GTKtoolkit|Designers bring back excitement around the #GNOME project http://bit.ly/9Zcx8c|1267202696|0||0|1 374|GTK+ and friends|GTKtoolkit|#webkit #gtk gets ARGB support, allowing it to set a transparent background! http://bit.ly/cBeouj|1267146282|0||0|2 375|GTK+ and friends|GTKtoolkit|Follow GNOME TV on Vimeo http://is.gd/96PlT|1267050829|0||0|1 376|GTK+ and friends|GTKtoolkit|Extensive article on the state of #WebKitGtk http://is.gd/95En2|1267031517|0||0|0 377|GTK+ and friends|GTKtoolkit|@ploum Are you hitting !PyGTK or !GTK+ bugs? Are they already reported upstream?|1267029810|0||0|0 378|GTK+ and friends|GTKtoolkit|#GNUStep gets #GTK+ theming http://is.gd/95vHl more at http://is.gd/95wt8|1267029498|0||0|1 379|GTK+ and friends|GTKtoolkit|GTK+ 2.19.6 released: http://mail.gnome.org/archives/gtk-devel-list/2010-February/msg00050.html #gtk|1266966985|0||0|0 380|GTK+ and friends|GTKtoolkit|Did you know that #GTK+ is the official toolkit for the #LiMo software stack? http://bit.ly/cuEdHx|1266925406|0||0|0 381|GTK+ and friends|GTKtoolkit|@lmedinas publishes a #javascript #example on how to put an status icon with #Gtk+ http://bit.ly/9py1uC Thanks a lot Luis!|1266886644|0||1|1 382|GTK+ and friends|GTKtoolkit|♺ @ebassi: I should really finish up the GDom API as well|1266880653|0||0|0 383|GTK+ and friends|GTKtoolkit|♺ @ebassi: I hope to work on this for the next GIO release, and the GTK+ side for 3.0|1266880641|0||0|0 384|GTK+ and friends|GTKtoolkit|♺ @ebassi: just updated the ApplicationClass design wiki page with the stuff @Cwiiis did for Mx - http://bit.ly/cfAOJk|1266880559|0||0|0 385|GTK+ and friends|GTKtoolkit|#GTK+ Kick Start tutorial for #Vala http://www.vimeo.com/9617309 OGG: http://bit.ly/czegmp|1266874471|0||0|1 386|GTK+ and friends|GTKtoolkit|@migheldeicaza shows off #monodevelop on #macosx deploying and debugging #gtk sharp apps on a #MeeGo device http://bit.ly/9XR0Pg|1266874171|0||1|1 387|GTK+ and friends|GTKtoolkit|#GTK+ is the first toolkit to expose the #Xorg multitouch stack through #XI2 http://bit.ly/9tniKu - Nice work @garnacho!|1266863259|0||0|1 388|GTK+ and friends|GTKtoolkit|This is the official GTK+ first micropost!|1266856657|0||0|1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/modelbutton.rb000066400000000000000000000025721511343406000247430ustar00rootroot00000000000000# Copyright (c) 2008-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Model Button GtkModelButton is a button widget that is designed to be used with a GAction as model. The button will adjust its appearance according to the kind of action it is connected to. It is also possible to use GtkModelButton without a GAction. In this case, you should set the "role" attribute yourself, and connect to the "clicked" signal as you would for any other button. A common use of GtkModelButton is to implement menu-like content in popovers. =end class ModelbuttonDemo def initialize(main_window) builder = Gtk::Builder.new(:resource => "/modelbutton/modelbutton.ui") builder.connect_signals do |name| if name == "tool_clicked" proc do |button| button.active = !button.active? end end end @window = builder["window1"] @window.screen = main_window.screen actions = Gio::SimpleActionGroup.new actions.add_actions([ { :name => "color", :parameter_type => "s", :state => "'red'" }, { :name => "chocolate", :state => "true" }, { :name => "vanilla", :state => "false" }, { :name => "sprinkles" } ]) @window.insert_action_group("win", actions) end def run if !@window.visible? @window.show_all else @window.destroy end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/modelbutton.ui000066400000000000000000000134761511343406000247620ustar00rootroot00000000000000 1 1 Model Button 1 vertical 80 1 thing_a 1 Color 1 1 thing_b 1 Flavors 1 1 thing_c 1 Tools 1 1 10 vertical 1 win.color 'red' Red 1 1 win.color 'green' Green 1 1 win.color 'blue' Blue 1 1 10 vertical 10 1 win.chocolate Chocolate 1 win.vanilla Vanilla 1 1 win.sprinkles Add Sprinkles 1 10 vertical 10 1 Hammer check 1 Screwdriver check 1 Drill check ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/move_cursor.png000066400000000000000000000031011511343406000251200ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±IDATX…½—ßOSgÇ¿‡‚,Î9d@+­!%q”µ¸ÒbŒéŒwûqµ ,ãb¡I U²e›É43lÙ…3‹fJˆ^°?ÀT#¨±ŽÚ@-==ÐÓJ»¶†Zh»e[<ﳋrRؠžä¹yßsòý<Ïû¼ßÓÅ`S,³òz½žž={&ù|¾R©ì°À+¥óü‹Å‚‹åøÐÐÐ¥›7o6:t¨dñŠ¢¸&P'ïµ´´àÖ­[,†-Ë׉DâWÓþ”Ÿá3¥­555oûýþG™LFjmm}i0 ”J¥¤ñññ`uuu€&[(p² @& <FÇN'39Â"|À`0àöíÛlzz:d±X¾š¯< €aG\è„J¥jåy~,NKgÍ3011A™LF*++?ð&€WåÊ .¡°Y£Ñ4:ÎKZ­vO___Þ½þ7Ðëõèîî†×ë 8pàËd2éðûJ•¯Ô‰×59x3™Œd4WuÕR©”ôøñc±ªªêäμ òÕD„ Þ¹¹9iïÞ½+Š755Q2™”|>_hÑÀ%^¡T*Í~¿,N/ ±{÷nJ$R ˆ¨ÕêOè°hÚ‹/€P©T&¿ß?>77'µ´´,ˆïÚµ‹âñ¸$BD­Vм^âjµº-xggg%ƒÁ@ ‹Å$A¢;vì8à-äþ)­›xDCCþ`0ÈÏÌÌHñx\šœœü­¾¾þøFŠ/…¨lllÜ/Šb G´ZmÑ•C)ûĽ^¯---Ýær¹B"È9œ„UÜó—X QÜÏ«¿û°¬ÊdÖ`ñ»^\Ç5Ç?:!Ão ²!IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/n_resize_cursor.png000066400000000000000000000024071511343406000260000ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±äIDATX…í–ÏKcWÇ?ï%ql“!:µÂôÇ,ZœI¬¶CVí.‹¨ˆˆ Eºªeš2.[EܸDãBÄ®êFæOèÂÚ]Ë(†i©P£â¯M4?ô%¾{»xï™LLR –éb¾pÉ#÷žs¾çÜsÎ=ð¯Ê¿ì)€zƒödÁ*Žh4ú~:^ByCÐ4-±¹¹ù=àì¦sØ‹yît:Ÿœœ4>zôH‘²4Ñë ¸úúúž?Û@²TÔX,öãòòr†Ë!«xõööJixÓ|h9_ì~Õl6«Øl¶ð;‡êêjt]À»ÀÛ–íbWÀÖÖÖsŸÏ÷$‹rJ…êìì,Ô××KEQJÞ—ÓéTVVVÂ$~±*°wFGG¿¬««ó§R©ÛB›”òâl[[Ûƒ¦¦¦{ ÒÜÜÌ‚p¹\úÌÌÌo§§§š¢(Â"¤(ŠŒF£éééé•d2ùxìÙb3Dïu@•ù¿255õyÿ7“““ÊÀÀÀ…×ëeqqQÄb±}¿ßÿÓÞÞÞ #tàÀ‰¹W”€ pwM Àý¥¥¥t]×C¡PÑDóz½r_‡Ã{<žNà3à)ÿ1ðà&¯ KÁj@vÀÜ:::úN!ÆÇÇËf»×ë•‘Hä|ggçÏ–––‡¦Á[¦»©·¬ñKdR©Ô·B166v¥’óx<2‰œïîîþÑÙÙù ¹¬¿–ኌ#ÑÕÕÕ˜GâZƃB122RQó)Bâ­«’PÎÎΞH)…BŸÇãq=ÍÍͽb¬§§GÆb1QxNÓ4!¥”‘Hä÷ÖÖVPMÞUmDkkk·“ɤmuuõi8¾{xxX§iZµ”R•R*ÝÝÝŸº\®ú|EUUU¸ÝnB¡Ð/ªªêªª EQ„ÃáÈÔÔÔÄü~ÿóóó‡À9FYÊ¢ÒÀ3àž¹Ü¥©j ¸ÔÊI)úØäê\RÍÇaêÒKFÀ<5âçìµµµ_­¯¯—åxaÊfɽx:pfÓ/”•P"ÍÃS!äÂmw:§¥¬iŒl°òEä}—%`¾´§ªj¹!A`ÜqÖt ì@q“ãVExCàµ(•„e‘Édö|>Ÿƒ6khmooçàà E.Ëÿ3؇‡‡nll¼H&“g‰D"“H$2ÛÛÛÇÁ`ðð5ÆÛïà ¯ßµŸGŒks÷FàÓ˜5ñü¼¬–[Þ› HŒfÆè–V›³~Ä$¢—•DÀ’³cÌŠUQ±fþ–¨ÿ7øD;[tƒ&áSIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/ne_resize_cursor.png000066400000000000000000000026171511343406000261500ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±lIDATX…í—OL“gÇ?ï ¬UV– Ú¸ÌŹÍuîàS‰ÚZºaC$8CÂN‹zXb˜ˆ‰1v”ƒ s‰—æ2 ë=4-)Yì4‹2à˜Úl4ŒÊÞÒ·ÿžgÞ²®X-¶‹¿ä—÷ßïy¾Ÿç÷kŸ?ðÜþgSмSµÈ÷g5 ã*‹(‹‹‹íŠ¢tªªºa½”S©ÔüÈÈÈɃú- &“ÉØ•+W,7oÞ\/}Ž;&·lÙòÃŽ;Ža`# å±eªªš‡††¸|ùòº8p@±X,ÕÀk@ Ð1² Ä>¯›¥Óé   x¼Ìf€………ñK—.½ÛÝݽ&Áëׯ«mmmËÏRJ(£`…¢££ã“ºººã𦽒Éd*Œ†«²Ã‡¿g±X¶ò˜yal!@vÿþý‰òòòûñxüw]×MBˆU•åÂ… c‡ãe`k)ñ…rbb"ÒÙÙy¤²²²a5Â9óûýUUUiáp¸¤ø£;þ|Ân·Ÿ‡Ã!]×¥ÇãaÓ¦MOõææf4M«É æY$½sçΣÚÚÚSÓÓÓw¯^½*l6óóóOtMÓÐu½&“É”•4üÇe€¥é2>333U__ÿÙÌÌÌ=ŸÏ'GI !Vü³V ð(‰Œ»\®“ÓÓÓ?– ±V€Bˆmmm§EYìéé‘&“é?X†8sæL2t !ÌGU’Éäº<±^@À´wïÞ~)¥£¡¡¡, ÐÒÒ‚¯×»f€¢æÚÚÚ凜.·Û½,ît:éíí•}}}²©©éß0IJÙlƒÛí.Ë-Í{öìÁëõÊP(4 G¯]»&:´&€%0Ä¿ÜgY|çÎ Š©©©ˆÇãéK$Ñ`0Øêõz÷µ´´(‰Dâ™þ‘œ¸â—ËU ؾ};CCC"FNgO<ÿUñSccãÙ±±±ûûû¥Óé\;ÀîÝ»]&“éÃ7n¨¹š[­V|>ŸH&“1·ÛýíÜÜÜà>0®iÚ¨Ýn?599yûܹs¥è=uzÞèóùN¥ÓéLoo¯Ø¼y³ÉF"‘›ÍÖ œö5@…áÕÕÕÕûFGGoK)å®]»Îúýþ¯Òé´ˆÅbÙX,–M¥Rb```8¼J^é ×g`íêêú¸½½ýól6[¡ëzÂãñ|sëÖ­»À=`˜gi¢‚¥MÆKV«õ­ááá/Z[[¿~øðáxWWW¢(o뺾!&.^¼ŠÅbw_€9ò6¦ù¦•À›§gggkllüø°V ¶TÆ}P½mÛ¶÷kjj€ x¨š ¯Þ6æ·ÜnG6V³Ùüº®ëUÀ,0ü¤XYËÜvëE#‹:K‹šÙ–F»Å¼oEr&ÀbÀÄ?‹ˆç÷¥ž;€ä9ð÷Á$wÿD€üQ)FÃ\§O3¥Ä¸çÀ_âhû7^¼;tIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/nesw_resize_cursor.png000066400000000000000000000023401511343406000265130ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±½IDATX…í–OLcUÆ¿×'¶Ê[%6TESi4Xþ$,(H}iÌvç†Hâ’].XUM: ÇцÀ¢Œ‘ ,° CŒ$h$lHM±¾öÑ6%mi)´}÷^¯˜™é0q×ÜÕ»÷}¿{ι÷\àV·úŸÅ52Ùétª?!„¼C)UQJëZ/I’×d2=Àžüö\þœÓé亻»}¤V«ïlll€RZuÑää$‹D"'~ 7àY"€»n·ûÃ|>/»\.eGG(’×ÖÖ¾ð.õMÌ%eM:<Ï¥”ÍÏÏ×X]]ý@÷p¡ð–ÏçóʲLÇÇÇ«¬¬¬|_ @Uè\‘19N3B8®¡Z® Àe³Y›Ûí~ _BU pëõú)«ÕÊmmm] œ¸t:íN¥R¿ŒŒŒ¼àù'!Aà3™Ì×…BLMM•„\­V7”‚rRE£Ñ‡Œ1&Šâ¯&“é+Aøt:ýe¡P ÓÓÓ%æƒùýþ§jâ:¼$I"‘Éd2$ü¬×ë_ëèèx!N!Ë2™-1ooog~¿Ÿ\^^ÎÏÏi__ßõÂáðW{{{…ááavqqAŽŽŽ~…B˲,«ÕZb®ÕjÙáá!‘$)ÕÓÓóààààÏx è ·X,±X,Îc^D%å†F£a>Ÿ¤R©ËÑÑÑlÞð"”Ûò‡ÃñÁÙÙYÚëõ~ à^9€FšÑ¿jjjÂúú:ëïï'v»}u{{{ÀB.ŠÓËËË?êtº{{{Íòõþ¿f\.cŒ±………u(¦O_Z”ã«okk»àU(‘¹9€Á``Á`ƒÁˆÙl~€nÕ¢i3”ð—Ì©Ö *JE ª8Ž{yssóÓ‰‰‰«Ý={m3(ý? %%‡r]„‡Ã“ɤÃn·óÕ@ºººàñxX<?š›››ÙÙÙù«hĪ­«%^’¤G¬Aœœü600ð&êÌó•ʶ´´ô™(Š¿'“I=¥´æIáy>ßÒÒËårZQ(a¯+ åRÀA9Ëíî@©“Z ŸB }¢8êNC¥« ¼ªÖÀ3bEºw«[À?loW>¤ÚÀ—IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/no_drop_cursor.png000066400000000000000000000025351511343406000256240ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±:IDATX…í–KhTWÆwž1™¼&m'ŽPHéÂfÀ1T 5X$”"¥ +Tº‰(TkV–‚BÍ®‰H*ˆ‹.­/ºˆ¨˜C Y¸’P0dÒLJc`23wîÜ;óu1æâ;w~pàÞ{þçü¾óúßoõV¯ã8Ÿ[–õ§mÛYÛ¶—mÛ^.‹s¦iÎäóù¡d2Yëa¼´±¤÷%ý•J¥¼SSSFkk+ñxœ;wî Ù·o_ùáÇç;;;& õyÞT.—¬T*•x<®X,¦;wêþýûêêêÒÖ­[5<<¬ÅÅÅå½{÷öšÁK¥RÜqS’ÇѦM›Ü288¨h4ª7ª¿¿_’T*•œt:=øYçr`YÖ剉 çСCrGÁ`PÁ`P@@Û¶m“ßï—ßï—ÏçS[[›Ž=ªJ¥RýX÷žÀ²¬¥Ã‡kÿþýrGT×ö•ell¬<666|øÖÂ{.Øï÷7g2Òé4.\ ‰ÐÒÒ¦iF1 ƒùùy…BÁ¨«««>æçµ †aHb||œññq¼^/‘H„ŽŽêë뙥³³¯×K.—# ÉêYã¬:]årÓ4I¥RŸ×‰'äõz+@ÿ›0ðm(Òää¤^¥‘‘y<ž2ði-á!`ñôéÓOb±˜´k×.år9·®¯¯OÀd- |ÕÔÔ¤b±(Iºzõªûºté’$©P(H’¢¦((ךƔ•Ðøˆ6)QL5öSµVMLŒrƒkMM› QZ. Sf¨ÀÌ0gïÕÌPT@’~i“îdåLö9{­ßúŸ½æ¬ üü Ág"€œ““£õÿöÍûŸ™´ÃInkk›¼^–嵂 Ä«TªQEÇÓ§(Ê;EQîôöö^·Z­Opä³ÿ@hii™ñ[­VûËÁÁAþàÁéåË—Bww7<Ìf3¬V+V®\é5™LýýýnkkûMBBÂ_(AL l6Û7F£ñŠÝn8qâ„\UUEQ@ô±OA .\ˆ¼¼<6þ|±«««8**ê0O‘ID‡Ãñëååå(**Ün7ˆè#ó÷_EQ„ Ø´iöîÝK‡£bΜ9[º»»Ç‚@looÿÆb±\;yò¤xæÌpÎÁ9óa?£Uð+à‡EK—.Źs稣£ãä´iÓ ¸>…ÆÊþöíÛSçÍ›wÿúõëÅÅÅc £ÍjµbÆ ÈÌÌĪU«›Í‡Ãñ‘:­­­èééÖ­[—˜˜˜ØPRRòwlœ¤G p8»»»½³fÍ¢©S§’Åb¡ÈÈHŠ¥ÒÒRÎ#§ÓézöìYk}}ý÷>|ðeeeQDD™ÍfŠŠŠ¢˜˜²Z­ôèÑ#f·Û›t: Ãå:îÞKJJbcJAAÁHp³ÙLV«•Xoo¯«°°ðº,Ë{äîܹóCCCììÙ³LF£‘ÂÃÃÉd2Qdd$EGGÓêÕ«‰sN•••¿ ›@~óæMžÛífñññd±XÈd2QXX•••q§ÓéJNNþÀ?-((Øâv»]Ü`0^¯§Ù³gSyy9…††RDDEFFRLL ½xñBill¼ §˜òkº»»ïݽ{—ù3 £ÄÄDâœÓ¾}û¾ðs?éÞ½{=ãU ÀÔÒÒò¨ººšF ¢ÀÀ@š;w.1Æ8cŒgddø¿p”Mœs:uêÔ-,ؾ}û¡¡!ÏŽ;H£ÑÁ` àà`:zô(9Ž^‹„bŒ?A€±ªªêðàà ·X,d0(00¨´´”¶mÛ6<--Eáeeeµ²üD«ÕZìvûÝ÷ïß+z½ž4 éõz ¢çÏŸ³‡>°À”1Ô‡@Ÿžž¾Ôëõ*¹¹¹¤×ëG¦L™2|Ñ¢E488Èïß¿ß ŠâvI¹¹¹óNç¯×ËRRRH’$Òh4¤ÓéhÉ’%Ä9§üüüßH ë5®ÏéOž<¹m³Ù˜Éd"­VK*•ŠA 4cÆ ²ÛíÜëõ*UUU5?¾l³Ùþ444ä²ÙlÞÅ‹’e™Ôj5éõzª­­eÍÍÍm~à+Œª‚±öAxJJJF¿ëêÕ«\§Ó‘J¥"I’©T*ÊÈÈ ²²2þêÕ+ossóPuuµ²k×.Òét€A Y–I£ÑP^^)ŠÂ³³³¿ð5€±ä­B €ø¢¢¢ÃŠ¢ðââbÒh4$Ëòˆ _2I’H¥RÑúõëÉëõòK—.Uû² /{?€Œá]šxáÂ…KŠ¢ð+W®ð   ’$é‹¢(’J¥¢üü|R…×ÔÔüÛôG‚'Ê~4„ @€¥{öìù}¿§½½eee‘V«%Q? ì—}ÅŠTWWÇEáçÏŸ¯°@†?BŸ½û‰Z25€0± ,øñ±cÇ~±dÉ’tçΡ¾¾^èìì„Ûí†ÅbÁÌ™3±fÍ-644¼=pàÀ­›7o>Ð à{NCø¤A¨)}JˆðURRRÂÆ“’’ÌfsXHHˆF’$¡§§Çãp8þYWW÷·k×®=¯¬¬| à€·¾kßXÁ¿à¿/c¸‰00ùÌè›S©ÕjÑãñ0^ýl>sb¸·5ŸÔ¹ÿÞZz_ð@ßœˆáFÓã Öï3—jÂÃɤP£@¤OÌÀ0œ)Ã$OEÿã_ƒ_ þ›N2IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/ns_resize_cursor.png000066400000000000000000000026031511343406000261610ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsnnÌÄ^tEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±`IDATX…Í–]H[gÇÿçÍ9‰mÜâY0ócV¢"¢!*plÝŠ¤ë•FpÖK/:§v°Å«y»~ÜÍÝìÆ›€°´(”¶¡W ­^ -¦‹‰æ“!±ÉòqÞgù¨I«VÛ=ðòrržçü~É›ó¼/p¼°s$,ûÙk €¸»»ûC*•ŠÎÏÏ_P@|1Ï9§••Çã7nÜðÎiKÄiÎ9“,Ë´°°“¸|š9¸sNÔÐÐ@­­­TSSC‹‹‹<ǯ_¿>r9øwœsšœœ¤úúzª««#½^O×®]ûâ$%rðo‰ˆìv; ªªª"Q‰1F†ª««©¶¶–îß¿Ïc±Ø‰IT@àkÎ9ÙívÒétTQQAŒ1¢(Ree% r¹\ÊÞÞÞ³™™ë«HT¡PÈ–ƒ«ÕjR©T$B<7c$Š"étºb ù ‰rf,˲üS0Ä­[· nÎÎÎâáÇùë±±1tuu寵Z-†‡‡‹ÅžÝ¼ysÔn·»D(‡p»Ýïëõú#‘ˆ.V&“I51"zzzÚ†††àp8òù‡.\Ø[[[ó3Ƹ Äã’$%øFFF¾Y]]ýÀ¿Å,±”@SSÓ6 Ȭ£™v«!¢_KÕ¬¯¯o›Íæ_ìHàRþÉΪRu%²ᬱˆç½þ­2ùE1 À`À.žÿ?Òb’GHØËæ‚ЕgÁAd¾õþõæY™C äìy‘@ºœÀ>P™_¿$7ÿÐ7o\ ÜE3‘}™°P&Šæƒü~£¢(µ‘HDJ$ E<Oe9²V«=;55eêîî>c4£*•Š@£Ñðüe³Ù"(шJÆòòrs2™tS™°Z­mØáp”K¥­­­ßdY>àÌ¡àÙ8{õêUs$Ùöù|ŠÉd"Y–óC­VhµÚ‚û£££¤( _ZZú]£Ñ\Ð @{ €Áb±X€ßãñ(F£±ä&T<, % îr¹I’tÀj²Ï~ñâEJ$üÞ½{%Ið1€÷Tà˜[²@M__ßg^¯wÓçó)---%á”J¥øÝ»w3Æl¯ /–x×l6êõz=Á`Pioo/€R*•âwîÜyÄû Àù“€¿ ÑÛÛÛ¿¹¹ù4 )&“‰Õj¥t:Íoß¾½¼^ÌžèÁT ÀÐÙÙù‰ÇãÙ…BÊôô4¥Óir:øÀGêN¾_B`èèè8ïv»Ÿ9Î?\9mø mmmÎÍÍý à22¯Ú±àÇ1iáoÐ#Ó÷#Èœ’(³ïŸ¤@®N…ç§Ýtv þ¿ˆÿŒ£KCRÓôáIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/nw_resize_cursor.png000066400000000000000000000030111511343406000261570ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsBB"ì >tEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±æIDATX…í—H[WÇ?/IƆVݨ…)Ú•V,M¡YamW[ØZÔšj…1WViÙZ¡ÈØØl–F-ý§«e(4²¿:ÔZ+6P*Æ…æsƒ ‡b4ÚX›§&yw¼Xg¢Vaûc_¸äåÞw>çœ{Ï=þ׿,)Ƴȱ^R1$Y–?B”ƒÁ Bˆ5C!þljjº|þüùa †@9±»»;Y§Ó}ït:7z<žµÚ}¥£GZ<8 T^`žp$¢4MŠN§ÛX]]Í£GÖ àñãÇèõúí@àG‚ÐDNôz½Úu³-I–åD`3 '"õQ˜ŸŸÊ·Ñhäúõëk¶¾cÇzzzfÃö41+!!³gÏ222òÂï÷$IñæÇ’Ûힺzõª˜‚Dœ„¸ ªªªêlllü5Êró—Pð„ÇìªôzýK›Í¶¹´´ô#!„´š£©Ñh¯×ûÌb±|ãóùÆ^ @§ÓÍgffn0YšåW@FFLLLŒž9s¦ÁçóÉÀZ5€$IB!ùý~åܹsˤ¥¥ÑÕÕ¥ŒO?~ü–Ëå  æ>*ÿ+µ"®$ô&“‰‡*©©©rQQ‘Ýår¢æ~ µEiUËÍIIIÁáp(Û¶m›+**jêëë~Ü€µD`9%''ÓÑÑ!²³³V«õ‡ÞÞÞ_€_!•ßH­hC­D¹¹¹˜Íf†††Fz{{‡Â†‡€‰XÆ× ¿¿Ÿââbi÷îÝ™N§Óš˜˜8¼ ¢î¯;€Á` ­­½{÷ÐÙÙÉ©S§$³Ù¼ïÉ“'_)Àâô¯  ×ëinnNïTTT|*ËòlKKKH«Õ.ô~âÒ¥KBQáp8®ooOÄhmm½%„Š¢(W®\i¾ œpˆ3kjj¾ ÁÚÚÚWéééÂãñ(ÓÓÓÏÍfó{€)fäOž<¹I–eߨØXÐív‡‡‡ƒ¡PHÙ¿ÿ·÷îÝ«B(õõõ?†=/¶I¨Ídß¹s皢(JUU•غu« y<ž™#GŽÔoQ‡"áæÍ›ïïܹ³|fffK(Òttt<»}ûv·ÃáÈÕjµ›òóó»P+Û 0‚Ú#ˆð» @F{{ûWÇŽûØãñ!ÄLaa¡Ýår ?¿ωÑWèÂyz(Ê€RàpYYÙ`px0.J êÙÏíëëkÏËË»|FmJ£zÂ| îÔ”ˆÐ†Â^Î ao_ò^Ha£Á`ÈÊÉÉÉ“¨=ˆ\°X /Yh#¿f´a£¡%ŒG®×ɨ›S‡zûXâNˆwÅFþ'–øO N,¹%›‘ÿ„þ‚2 ¿ÕRIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/nwse_resize_cursor.png000066400000000000000000000023071511343406000265160ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±¤IDATX…í–MH#gÇÿ3ÑF³]i4"ˆ5-ÔJI‚Ñø…{©#=µ¡­A ñ¢ˆ·@ÙS.{PØË²ìÖž´· HÁॗÖPªUcëÇÌêFbkâÌtÔ´óÎÓÃH»Ý|˜d=Ô?¼‡áyßßó1Ïó·ºÕ,®Ð†,Ë=V«õž®ëÃ0 ¾÷¢ˆè7¿ßŒF£çºé›ªBªª¾UWW÷ÑÒÒcE6›ÍÌÌ|F.\–]P;;;ŸÙl6‚iIÞÈ0 šýÀ'ÚXQÄ»%ikkkô&AH×uc~~þ[Sú¼€¥ËKp»Ý¤(б¶¶–ày>à} k>ULj±X ë:9ŽÚ¦¦¦‡d˜É—OÊ K)!ðz½”ÉdØáááO.5ù. ‡ÃÕ———ŸÃÌ KÅV«5¢««‹ÎÏÏ™$I?ôöö¾‹—pddÄrqqñTUÕUo°UàñxHEòù|9>ŸdYf’$Ž^iÚ""I’Öô°— ÐÚÚJÉd’]]]ýyvvÆÜnwDOOɲÌDQŒ»\®wÔ(Šò€1fìïïÓööö6€! e´´´P"‘`’$¥].×£ÝÝÝg©Tеµµå@ôõõ‘¢(LÅï÷öö†aŒQ$¡ÍÍÍŸ — ÇÙéééïøÛÛÛGŽŽŽ¤ããcæt:s úûûIUUfMLLŠD"´±±ñKEªª^ =ð)€÷4~prròüàà€577ç@ ÐôôôßÏ躞` € ÀÕ†‡‡?L¥R§‰D‚566-×Å "Žãô………ûsss1?x³Áèä•••ï@Àn·gb±˜Q___’a%ËãñØ´Ãl.u/Ár0KnãÔÔ”Ÿ1Æ–——+ò@1UÃty ò{Š›œœ|=NÇEaÝÝÝkúõò áp¸Êï÷?åy~P~}}½TÃþ¥b§™P(T5::úUmmíÇÁ`š¦Áçó<¨¡¡d¯ß¬P(Äg³Ù/©L]"e„ ¯œNçk‹‹‹WWW¿I&“og³Ù»DT´­sGš¦ý @Á?a5÷Ê€™w`Zrf{½éðÇ«p×”7ÐÌa¥¤iùVÿýúbb›œCvIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/000077500000000000000000000000001511343406000240215ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-arc-negative.rb000066400000000000000000000021541511343406000300100ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-arc-negative.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Arc Negative This demo shows how to use GDK and cairo to draw arc in negative. From http://cairographics.org/samples/arc_negative.html. =end require 'common' module Demo class CairoArcNegative < CairoWindow CENTER_X = 0.5 CENTER_Y = 0.5 RADIUS = 0.4 ANGLE1 = 45.0 * (Math::PI / 180.0) # angles are specified ANGLE2 = 180.0 * (Math::PI / 180.0) # in radians def initialize super('cairo arc_negative') end def draw(cr) cr.arc_negative(CENTER_X, CENTER_Y, RADIUS, ANGLE1, ANGLE2) cr.stroke # draw helping lines cr.set_source_rgba(1, 0.2, 0.2, 0.6) cr.arc(CENTER_X, CENTER_Y, 0.05, 0, 2 * Math::PI) cr.fill cr.set_line_width(0.03) cr.arc(CENTER_X, CENTER_Y, RADIUS, ANGLE1, ANGLE1) cr.line_to(CENTER_X, CENTER_Y) cr.arc(CENTER_X, CENTER_Y, RADIUS, ANGLE2, ANGLE2) cr.line_to(CENTER_X, CENTER_Y) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-arc.rb000066400000000000000000000020531511343406000262060ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-arc.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Arc This demo shows how to use GDK and cairo to draw arc. From http://cairographics.org/samples/arc.html. =end require 'common' module Demo class CairoArc < CairoWindow CENTER_X = 0.5 CENTER_Y = 0.5 RADIUS = 0.4 ANGLE1 = 45.0 * (Math::PI / 180.0) # angles are specified ANGLE2 = 180.0 * (Math::PI / 180.0) # in radians def initialize super('cairo arc') end def draw(cr) cr.arc(CENTER_X, CENTER_Y, RADIUS, ANGLE1, ANGLE2) cr.stroke # draw helping lines cr.set_source_rgba(1, 0.2, 0.2, 0.6) cr.arc(CENTER_X, CENTER_Y, 0.05, 0, 2 * Math::PI) cr.fill cr.set_line_width(0.03) cr.arc(CENTER_X, CENTER_Y, RADIUS, ANGLE1, ANGLE1) cr.line_to(CENTER_X, CENTER_Y) cr.arc(CENTER_X, CENTER_Y, RADIUS, ANGLE2, ANGLE2) cr.line_to(CENTER_X, CENTER_Y) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-clip-image.rb000066400000000000000000000022351511343406000274520ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-clip-image.rb,v 1.2 2005/10/16 12:07:32 mutoh Exp $ =begin = cairo/Clip Image This demo shows how to use GDK and cairo to use clip for image. From http://cairographics.org/samples/clip_image.html. =end require 'common' module Demo class CairoClipImage < CairoWindow def initialize super('cairo clip image') end def draw(cr) cr.save do cr.arc(0.5, 0.5, 0.4, 0, 2 * Math::PI) cr.clip cr.new_path loader = Gdk::PixbufLoader.new File.open("background.jpg", "rb") do |f| loader.last_write(f.read) end pixbuf = loader.pixbuf cr.scale(1.0 / pixbuf.width, 1.0 / pixbuf.height) cr.set_source_pixbuf(pixbuf, 0, 0) cr.paint end cr.save do cr.arc(0.5, 0.5, 0.3, 0, 2 * Math::PI) cr.clip cr.new_path image = Cairo::ImageSurface.from_png("ruby-gnome2-logo.png") cr.scale(1.0 / image.width, 1.0 / image.height) cr.set_source(image, 0, 0) cr.paint end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-clip-rectangle.rb000066400000000000000000000014071511343406000303340ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-clip-rectangle.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Clip Rectangle This demo shows how to use GDK and cairo to clip as rectangle. From http://cairographics.org/samples/xxx_clip_rectangle.html. =end require 'common' module Demo class CairoClipRectangle < CairoWindow def initialize super('cairo clip rectangle') end def draw(cr) cr.new_path cr.move_to(0.25, 0.25) cr.line_to(0.25, 0.75) cr.line_to(0.75, 0.75) cr.line_to(0.75, 0.25) cr.line_to(0.25, 0.25) cr.close_path cr.clip cr.move_to(0, 0) cr.line_to(1, 1) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-clip.rb000066400000000000000000000013161511343406000263710ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-clip.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Clip This demo shows how to use GDK and cairo to use clip. From http://cairographics.org/samples/clip.html. =end require 'common' module Demo class CairoClip < CairoWindow def initialize super('cairo clip') end def draw(cr) cr.arc(0.5, 0.5, 0.3, 0, 2 * Math::PI) cr.clip cr.new_path cr.rectangle(0, 0, 1, 1) cr.fill cr.set_source_rgba(0, 1, 0) cr.move_to(0, 0) cr.line_to(1, 1) cr.move_to(1, 0) cr.line_to(0, 1) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-curve-rectangle.rb000066400000000000000000000046301511343406000305320ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-curve-rectangle.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Curve Rectangle This demo shows how to use GDK and cairo to draw curve rectangle. From http://cairographics.org/samples/curve_rectangle.html. =end require 'common' module Demo class CairoCurveRectangle < CairoWindow # a custom shape, that could be wrapped in a function X0 = 0.1 #< parameters like Cairo::Context#rectangle Y0 = 0.1 RECT_WIDTH = 0.8 RECT_HEIGHT = 0.8 RADIUS = 0.4 #< and an approximate curvature radius X1 = X0 + RECT_WIDTH Y1 = Y0 + RECT_HEIGHT def initialize super('cairo curve rectangle') end def draw(cr) return if (RECT_WIDTH <= 0 || RECT_HEIGHT <= 0) if (RECT_WIDTH / 2 < RADIUS) if (RECT_HEIGHT / 2 < RADIUS) cr.move_to(X0, (Y0 + Y1) / 2) cr.curve_to(X0 ,Y0, X0, Y0, (X0 + X1) / 2, Y0) cr.curve_to(X1, Y0, X1, Y0, X1, (Y0 + Y1) / 2) cr.curve_to(X1, Y1, X1, Y1, (X1 + X0) / 2, Y1) cr.curve_to(X0, Y1, X0, Y1, X0, (Y0 + Y1) / 2) else cr.move_to(X0, Y0 + RADIUS) cr.curve_to(X0 ,Y0, X0, Y0, (X0 + X1) / 2, Y0) cr.curve_to(X1, Y0, X1, Y0, X1, Y0 + RADIUS) cr.line_to(X1 , Y1 - RADIUS) cr.curve_to(X1, Y1, X1, Y1, (X1 + X0) / 2, Y1) cr.curve_to(X0, Y1, X0, Y1, X0, Y1- RADIUS) end else if (RECT_HEIGHT / 2 < RADIUS) cr.move_to(X0, (Y0 + Y1) / 2) cr.curve_to(X0, Y0, X0 , Y0, X0 + RADIUS, Y0) cr.line_to(X1 - RADIUS, Y0) cr.curve_to(X1, Y0, X1, Y0, X1, (Y0 + Y1) / 2) cr.curve_to(X1, Y1, X1, Y1, X1 - RADIUS, Y1) cr.line_to(X0 + RADIUS, Y1) cr.curve_to(X0, Y1, X0, Y1, X0, (Y0 + Y1) / 2) else cr.move_to(X0, Y0 + RADIUS) cr.curve_to(X0 , Y0, X0 , Y0, X0 + RADIUS, Y0) cr.line_to(X1 - RADIUS, Y0) cr.curve_to(X1, Y0, X1, Y0, X1, Y0 + RADIUS) cr.line_to(X1 , Y1 - RADIUS) cr.curve_to(X1, Y1, X1, Y1, X1 - RADIUS, Y1) cr.line_to(X0 + RADIUS, Y1) cr.curve_to(X0, Y1, X0, Y1, X0, Y1- RADIUS) end end cr.close_path cr.set_source_rgba(0.5,0.5,1) cr.fill_preserve cr.set_source_rgba(0.5, 0, 0, 0.5) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-curve-to.rb000066400000000000000000000015161511343406000272100ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-curve-to.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Curve To This demo shows how to use GDK and cairo to draw curve. From http://cairographics.org/samples/curve_to.html. =end require 'common' module Demo class CairoCurveTo < CairoWindow X = 0.1 Y = 0.5 X1 = 0.4 Y1 = 0.9 X2 = 0.6 Y2 = 0.1 X3 = 0.9 Y3 = 0.5 def initialize super('cairo curve to') end def draw(cr) cr.move_to(X, Y) cr.curve_to(X1, Y1, X2, Y2, X3, Y3) cr.stroke cr.set_source_rgba(1, 0.2, 0.2, 0.6) cr.set_line_width(0.03) cr.move_to(X, Y) cr.line_to(X1, Y1) cr.move_to(X2, Y2) cr.line_to(X3, Y3) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-dash.rb000066400000000000000000000014071511343406000263620ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-dash.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Dash This demo shows how to use GDK and cairo to show dash. From http://cairographics.org/samples/xxx_dash.html. =end require 'common' module Demo class CairoDash < CairoWindow def initialize super('cairo dash') end def draw(cr) dashes = [ 0.20, # in 0.05, # skip 0.05, # ink 0.05, # skip ] offset = -0.2 cr.set_dash(dashes, offset) cr.move_to(0.5, 0.1) cr.line_to(0.9, 0.9) cr.rel_line_to(-0.4, 0.0) cr.curve_to(0.2, 0.9, 0.2, 0.5, 0.5, 0.5) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-fill-and-stroke.rb000066400000000000000000000014061511343406000304350ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-fill-and-stroke.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Fill And Stroke This demo shows how to use GDK and cairo to fill and stroke. From http://cairographics.org/samples/fill_and_stroke.html. =end require 'common' module Demo class CairoFillAndStroke < CairoWindow def initialize super('cairo fill and stroke') end def draw(cr) cr.move_to(0.5, 0.1) cr.line_to(0.9, 0.9) cr.rel_line_to(-0.4, 0.0) cr.curve_to(0.2, 0.9, 0.2, 0.5, 0.5, 0.5) cr.close_path cr.set_source_rgba(0, 0, 1) cr.fill_preserve cr.set_source_rgba(0, 0, 0) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-fill-and-stroke2.rb000066400000000000000000000016341511343406000305220ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-fill-and-stroke2.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Fill And Stroke2 This demo shows how to use GDK and cairo to fill and stroke. From http://cairographics.org/samples/fill_and_stroke2.html. =end require 'common' module Demo class CairoFillAndStroke2 < CairoWindow def initialize super('cairo fill and stroke2') end def draw(cr) cr.move_to(0.5, 0.1) cr.line_to(0.9, 0.9) cr.rel_line_to(-0.4, 0.0) cr.curve_to(0.2, 0.9, 0.2, 0.5, 0.5, 0.5) cr.close_path cr.move_to(0.25, 0.1) cr.rel_line_to(0.2, 0.2) cr.rel_line_to(-0.2, 0.2) cr.rel_line_to(-0.2, -0.2) cr.close_path cr.set_source_rgba(0, 0, 1) cr.fill_preserve cr.set_source_rgba(0, 0, 0) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-gradient.rb000066400000000000000000000016341511343406000272420ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-gradient.rb,v 1.2 2005/10/12 15:23:49 ktou Exp $ =begin = cairo/Gradient This demo shows how to use GDK and cairo to gradient. From http://cairographics.org/samples/gradient.html. =end require 'common' module Demo class CairoGradient < CairoWindow def initialize super('cairo gradient') end def draw(cr) pat = Cairo::LinearPattern.new(0.0, 0.0, 0.0, 1.0) pat.add_color_stop_rgb(1, 0, 0, 0) pat.add_color_stop_rgb(0, 1, 0, 0) cr.rectangle(0, 0, 1, 1) cr.set_source(pat) cr.fill pat = Cairo::RadialPattern.new(0.45, 0.4, 0.1, 0.4, 0.4, 0.5) pat.add_color_stop_rgba(0, 1, 1, 1, 0.8) pat.add_color_stop_rgba(1, 0, 0, 0) cr.set_source(pat) cr.arc(0.5, 0.5, 0.3, 0, 2 * Math::PI) cr.fill end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-image-pattern.rb000066400000000000000000000017421511343406000302020ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-image-pattern.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Image Pattern This demo shows how to use GDK and cairo to use image pattern. From http://cairographics.org/samples/imagepattern.html. =end require 'common' module Demo class CairoImagePattern < CairoWindow def initialize super('cairo image pattern') end def draw(cr) image = Cairo::ImageSurface.from_png("ruby-gnome2-logo.png") pattern = Cairo::SurfacePattern.new(image) pattern.set_extend(Cairo::EXTEND_REPEAT) cr.translate(0.5, 0.5) cr.rotate(Math::PI / 4) cr.scale(1 / Math.sqrt(2), 1 / Math.sqrt(2)) cr.translate(-0.5, -0.5) matrix = Cairo::Matrix.scale(image.width * 5, image.height * 5) pattern.set_matrix(matrix) cr.set_source(pattern) cr.rectangle(0, 0, 1.0, 1.0) cr.fill end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-image.rb000066400000000000000000000023421511343406000265240ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-image.rb,v 1.2 2005/10/16 12:07:32 mutoh Exp $ =begin = cairo/Image This demo shows how to use GDK and cairo to show image. From http://cairographics.org/samples/image.html. =end require 'common' module Demo class CairoImage < CairoWindow def initialize super('cairo gradient') end def draw(cr) cr.save do loader = Gdk::PixbufLoader.new File.open("background.jpg", "rb") do |f| loader.last_write(f.read) end pixbuf = loader.pixbuf cr.translate(0.5, 0.5) cr.rotate(45 * Math::PI / 180) cr.scale(1.0 / pixbuf.width, 1.0 / pixbuf.height) cr.translate(-0.5 * pixbuf.width, -0.5 * pixbuf.height) cr.set_source_pixbuf(pixbuf, 0, 0) cr.paint end cr.save do image = Cairo::ImageSurface.from_png("ruby-gnome2-logo.png") cr.translate(0.5, 0.5) cr.rotate(60 * Math::PI / 180) cr.scale(0.8 / image.width, 0.8 / image.height) cr.translate(-0.5 * image.width, -0.5 * image.height) cr.set_source(image, 0, 0) cr.paint end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-line-cap.rb000066400000000000000000000022011511343406000271240ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-line-cap.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Line Cap This demo shows how to use GDK and cairo to set line cap. From http://cairographics.org/samples/set_line_cap.html. =end require 'common' module Demo class CairoLineCap < CairoWindow def initialize super('cairo line cap') end def draw(cr) cr.set_line_width(0.12) cr.set_line_cap(Cairo::LINE_CAP_BUTT) # default cr.move_to(0.25, 0.2) cr.line_to(0.25, 0.8) cr.stroke cr.set_line_cap(Cairo::LINE_CAP_ROUND) cr.move_to(0.5, 0.2) cr.line_to(0.5, 0.8) cr.stroke cr.set_line_cap(Cairo::LINE_CAP_SQUARE) cr.move_to(0.75, 0.2) cr.line_to(0.75, 0.8) cr.stroke # draw helping lines cr.set_source_rgba(1, 0.2, 0.2) cr.set_line_width(0.01) cr.move_to(0.25, 0.2) cr.line_to(0.25, 0.8) cr.move_to(0.5, 0.2) cr.line_to(0.5, 0.8) cr.move_to(0.75, 0.2) cr.line_to(0.75, 0.8) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-line-join.rb000066400000000000000000000017361511343406000273340ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-line-join.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Line Join This demo shows how to use GDK and cairo to set line join. From http://cairographics.org/samples/set_line_join.html. =end require 'common' module Demo class CairoLineJoin < CairoWindow def initialize super('cairo line join') end def draw(cr) cr.set_line_width(0.16) cr.move_to(0.3, 0.33) cr.rel_line_to(0.2, -0.2) cr.rel_line_to(0.2, 0.2) cr.set_line_join(Cairo::LINE_JOIN_MITER) # default cr.stroke cr.move_to(0.3, 0.63) cr.rel_line_to(0.2, -0.2) cr.rel_line_to(0.2, 0.2) cr.set_line_join(Cairo::LINE_JOIN_BEVEL) cr.stroke cr.move_to(0.3, 0.93) cr.rel_line_to(0.2, -0.2) cr.rel_line_to(0.2, 0.2) cr.set_line_join(Cairo::LINE_JOIN_ROUND) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-long-lines.rb000066400000000000000000000016131511343406000275110ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-long-lines.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Long Lines This demo shows how to use GDK and cairo to show long lines. From http://cairographics.org/samples/xxx_long_liens.html. =end require 'common' module Demo class CairoLongLines < CairoWindow def initialize super('cairo long lines') end def draw(cr) cr.move_to(0.1, -50) cr.line_to(0.1, 50) cr.set_source_rgba(1, 0, 0) cr.stroke cr.move_to(0.2, -60) cr.line_to(0.2, 60) cr.set_source_rgba(1, 1, 0) cr.stroke cr.move_to(0.3, -70) cr.line_to(0.3, 70) cr.set_source_rgba(0, 1, 0) cr.stroke cr.move_to(0.4, -80) cr.line_to(0.4, 80) cr.set_source_rgba(0, 0, 1) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-operator.rb000066400000000000000000000050621511343406000272770ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-operator.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Operator This demo shows how to use GDK and cairo to use Cairo::OPERATOR_* From http://cairographics.org/samples/operator_add.html, http://cairographics.org/samples/operator_atop.html, http://cairographics.org/samples/operator_atop_reverse.html, http://cairographics.org/samples/operator_in.html, http://cairographics.org/samples/operator_in_reverse.html, http://cairographics.org/samples/operator_out.html, http://cairographics.org/samples/operator_out_reverse.html, http://cairographics.org/samples/operator_over.html, http://cairographics.org/samples/operator_over_reverse.html, http://cairographics.org/samples/operator_saturate.html and http://cairographics.org/samples/operator_xor.html =end require "common" module Demo class CairoOperator < CairoWindow def initialize super("cairo operator") @operator = Cairo::OPERATOR_ADD set_default_size(400, 400) @drawing_area = child remove(@drawing_area) vbox = Gtk::Box.new(:vertical) vbox.pack_start(@drawing_area, :expand => true, :fill => true) vbox.pack_start(operator_selector, :expand => false, :fill => false) add(vbox) end def draw(cr) cr.save do image = Cairo::ImageSurface.from_png("ruby-gnome2-logo.png") cr.translate(0.5, 0.5) cr.rotate(-45 * Math::PI / 180) cr.scale(0.8 / image.width, 0.8 / image.height) cr.translate(-0.5 * image.width, -0.5 * image.height) cr.set_source(image, 0.0, 0.0) cr.paint end cr.set_operator(@operator) cr.set_source_rgba(1, 0, 0, 0.5) cr.rectangle(0.2, 0.2, 0.5, 0.5) cr.fill cr.set_source_rgba(0, 1, 0) cr.rectangle(0.4, 0.4, 0.4, 0.4) cr.fill cr.set_source_rgba(0, 0, 1) cr.rectangle(0.6, 0.6, 0.3, 0.3) cr.fill end def operator_selector combo = Gtk::ComboBoxText.new operators = [] Cairo.constants.each do |name| operators << name if /^OPERATOR_/ =~ name end operators.sort.each_with_index do |name, i| combo.append_text(name.to_s) combo.set_active(i) if Cairo.const_get(name) == @operator end combo.signal_connect("changed") do |widget| text = widget.active_text @operator = Cairo.const_get(text) if text @drawing_area.queue_draw end combo end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-path.rb000066400000000000000000000011341511343406000263740ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-path.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Path This demo shows how to use GDK and cairo to draw path. From http://cairographics.org/samples/path.html. =end require 'common' module Demo class CairoPath < CairoWindow def initialize super('cairo path') end def draw(cr) cr.move_to(0.5, 0.1) cr.line_to(0.9, 0.9) cr.rel_line_to(-0.4, 0.0) cr.curve_to(0.2, 0.9, 0.2, 0.5, 0.5, 0.5) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-pattern-fill.rb000066400000000000000000000035611511343406000300470ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-pattern-fill.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Pattern Fill This demo shows how to use GDK and cairo to fill by pattern. From http://cairographics.org/samples/pattern_fill.html. =end require 'common' module Demo class CairoPatternFill < CairoWindow X_FUZZ = 0.08 Y_FUZZ = 0.08 X_INNER_RADIUS = 0.3 Y_INNER_RADIUS = 0.2 X_OUTER_RADIUS = 0.45 Y_OUTER_RADIUS = 0.35 SPIKES = 10 TEXT = "Ruby!" def initialize super('cairo pattern fill') end def draw(cr) srand(45) cr.set_line_width(0.01) x = y = nil 0.step(SPIKES * 2 - 1, 2) do |i| x = x_position(i, X_INNER_RADIUS) y = y_position(i, Y_INNER_RADIUS) if (i == 0) cr.move_to(x, y) else cr.line_to(x, y) end i += 1 x = x_position(i, X_OUTER_RADIUS) y = y_position(i, Y_OUTER_RADIUS) cr.line_to(x, y) end cr.close_path cr.stroke cr.select_font_face("Sans", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD) cr.move_to(x - 0.5, y) cr.set_font_size(0.1) cr.text_path(TEXT) cr.set_source_rgba(1, 0, 0.5) cr.fill cr.set_font_size(0.2) extents = cr.text_extents(TEXT) x = 0.5 - (extents.width / 2 + extents.x_bearing) y = 0.5 - (extents.height / 2 + extents.y_bearing) cr.move_to(x, y) cr.text_path(TEXT) cr.set_source_rgba(1, 0, 0) cr.stroke end def x_position(i, radius) 0.5 + Math.cos(Math::PI * i / SPIKES) * radius + rand * X_FUZZ end def y_position(i, radius) 0.5 + Math.sin(Math::PI * i / SPIKES) * radius + rand * Y_FUZZ end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-self-intersect.rb000066400000000000000000000013631511343406000303730ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-self-intersect.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Self Intersect This demo shows how to use GDK and cairo to show cross. From http://cairographics.org/samples/xxx_self_intersect.html. =end require 'common' module Demo class CairoSelfIntersect < CairoWindow def initialize super('cairo self intersect') end def draw(cr) cr.move_to(0.3, 0.3) cr.line_to(0.7, 0.3) cr.line_to(0.5, 0.3) cr.line_to(0.5, 0.7) cr.set_line_width(0.22) cr.set_line_cap(Cairo::LINE_CAP_ROUND) cr.set_line_join(Cairo::LINE_JOIN_ROUND) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-text-align-center.rb000066400000000000000000000022101511343406000307660ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-text-align-center.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Text Align Center This demo shows how to use GDK and cairo to show text in center. From http://cairographics.org/samples/text_align_center.html. =end require 'common' module Demo class CairoTextAlignCenter < CairoWindow TEXT = "Ruby" def initialize super('cairo text align center') end def draw(cr) cr.select_font_face("Sans", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL) cr.set_font_size(0.2) extents = cr.text_extents(TEXT) x = 0.5 - (extents.width / 2 + extents.x_bearing) y = 0.5 - (extents.height / 2 + extents.y_bearing) cr.move_to(x, y) cr.show_text(TEXT) # draw helping lines cr.set_source_rgba(1, 0.2, 0.2, 0.6) cr.arc(x, y, 0.05, 0, 2 * Math::PI) cr.fill cr.move_to(0.5, 0) cr.rel_line_to(0, 1) cr.move_to(0, 0.5) cr.rel_line_to(1, 0) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-text-extents.rb000066400000000000000000000021151511343406000301140ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-text-extents.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Text Extents This demo shows how to use GDK and cairo to show text extents. From http://cairographics.org/samples/text.html. =end require 'common' module Demo class CairoTextExtents < CairoWindow TEXT = "Ruby" def initialize super('cairo text') end def draw(cr) cr.select_font_face("Sans", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL) cr.set_font_size(0.3) extents = cr.text_extents(TEXT) x = 0.1 y = 0.6 cr.move_to(x, y) cr.show_text(TEXT) # draw helping lines cr.set_source_rgba(1, 0.2, 0.2, 0.6) cr.arc(x, y, 0.05, 0, 2 * Math::PI) cr.fill cr.move_to(x, y) cr.rel_line_to(0, -extents.height) cr.rel_line_to(extents.width, 0) cr.rel_line_to(extents.x_bearing, -extents.y_bearing) cr.stroke end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/cairo-text.rb000066400000000000000000000020361511343406000264260ustar00rootroot00000000000000# Copyright (c) 2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: cairo-text.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $ =begin = cairo/Text This demo shows how to use GDK and cairo to show text. From http://cairographics.org/samples/text.html. =end require 'common' module Demo class CairoText < CairoWindow def initialize super('cairo text') end def draw(cr) cr.select_font_face("Sans", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD) cr.set_font_size(0.35) cr.move_to(0.04, 0.53) cr.show_text("Hello") cr.move_to(0.27, 0.65) cr.text_path("void") cr.set_source_rgba(0.5, 0.5, 1) cr.fill_preserve cr.set_source_rgba(0, 0, 0) cr.set_line_width(0.01) cr.stroke # draw helping lines cr.set_source_rgba(1,0.2,0.2, 0.6) cr.arc(0.04, 0.53, 0.02, 0, 2 * Math::PI) cr.arc(0.27, 0.65, 0.02, 0, 2 * Math::PI) cr.fill end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/changedisplay.rb000066400000000000000000000271741511343406000271740ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (c) 2003-2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: changedisplay.rb,v 1.6 2005/07/30 11:22:15 mutoh Exp $ =begin = Change Display Demonstrates migrating a window between different displays and screens. A display is a mouse and keyboard with some number of associated monitors. A screen is a set of monitors grouped into a single physical work area. The neat thing about having multiple displays is that they can be on a completely separate computers, as long as there is a network connection to the computer where the application is running. Only some of the windowing systems where GTK+ runs have the concept of multiple displays and screens. (The X Window System is the main example.) Other windowing systems can only handle one keyboard and mouse, and combine all monitors into a single screen. This is a moderately complex example, and demonstrates: - Tracking the currently open displays and screens - Changing the screen for a window - Letting the user choose a window by clicking on it - Using Gtk::ListStore and Gtk::TreeView - Using Gtk::Dialog =end require 'common' module Demo class ChangeDisplay < Gtk::Dialog # These enumerations provide symbolic names for the columns # in the two GtkListStore models. DISPLAY_COLUMN_NAME, DISPLAY_COLUMN_DISPLAY = 0, 1 SCREEN_COLUMN_NUMBER, SCREEN_COLUMN_SCREEN = 0, 1 # Main entry point. If the dialog for this demo doesn't yet exist, creates # it. Otherwise, destroys it. def initialize @size_group = nil @display_model = nil @screen_model = nil @screen_selection = nil @current_display = nil @current_screen = nil super( :title => 'Change Screen or display', :buttons => [ [:close, :close], ['Change', :ok] ] ) set_default_size(300, 400) signal_connect('response') do |dialog, response_id| if response_id == Gtk::ResponseType::OK query_change_display else destroy end end vbox = Gtk::Box.new(:vertical, 5) vbox.set_border_width(8) self.child.pack_start(vbox, :expand => true, :fill => true) @size_group = Gtk::SizeGroup.new(:horizontal) frame = create_display_frame vbox.pack_start(frame, :expand => true, :fill => true) frame = create_screen_frame vbox.pack_start(frame, :expand => true, :fill => true) initialize_displays end # Adds all currently open displays to our list of displays, # and set up a signal connection so that we'll be notified # when displays are opened in the future as well. def initialize_displays manager = Gdk::DisplayManager.get manager.displays.each do |display| add_display(display) end handler_id = manager.signal_connect('display_opened') do |display| add_display(display) end signal_connect('destroy') do manager.signal_handler_disconnect(handler_id) end end # Fills in the screen list based on the current display def fill_screens @screen_model.clear if @current_display n_screens = @current_display.n_screens n_screens.times do |i| iter = @screen_model.append iter.set_value(SCREEN_COLUMN_NUMBER, i) iter.set_value(SCREEN_COLUMN_SCREEN, @current_display.get_screen(i)) if i == 0 @screen_selection.select_iter(iter) end end end end # Creates the 'Display' frame in the main window. def create_display_frame frame, tree_view, button_vbox = create_frame('Display') button = left_align_button_new('_Open…') button.signal_connect('clicked') do open_display_cb end button_vbox.pack_start(button, :expand => false, :fill => false, :padding => 0) button = left_align_button_new('_Close') button.signal_connect('clicked') do if @current_display @current_display.close end end button_vbox.pack_start(button, :expand => false, :fill => false, :padding => 0) @display_model = Gtk::ListStore.new(String, Gdk::Display) tree_view.model = @display_model column = Gtk::TreeViewColumn.new('Name', Gtk::CellRendererText.new, {'text' => DISPLAY_COLUMN_NAME}) tree_view.append_column(column) selection = tree_view.selection selection.signal_connect('changed') do display_changed_cb(selection) end return frame end # Creates the 'Screen' frame in the main window. def create_screen_frame frame, tree_view, button_vbox = create_frame('Screen') @screen_model = Gtk::ListStore.new(Integer, Gdk::Screen) tree_view.model = @screen_model column = Gtk::TreeViewColumn.new('Number', Gtk::CellRendererText.new, {'text' => SCREEN_COLUMN_NUMBER}) tree_view.append_column(column) @screen_selection = tree_view.selection @screen_selection.signal_connect('changed') do |selection| @current_screen = if iter = selection.selected iter.get_value(SCREEN_COLUMN_SCREEN) else nil end end return frame end # This function is used both for creating the 'Display' and # 'Screen' frames, since they have a similar structure. The # caller hooks up the right context for the value returned # in tree_view, and packs any relevant buttons into button_vbox. def create_frame(title) frame = Gtk::Frame.new(title) hbox = Gtk::Box.new(:horizontal, 8) hbox.set_border_width(8) frame.add(hbox) scrollwin = Gtk::ScrolledWindow.new scrollwin.set_policy(:never, :automatic) scrollwin.shadow_type = :in hbox.pack_start(scrollwin, :expand => true, :fill => true) tree_view = Gtk::TreeView.new tree_view.headers_visible = false scrollwin.add(tree_view) selection = tree_view.selection selection.mode = :browse button_vbox = Gtk::Box.new(:vertical, 5) hbox.pack_start(button_vbox, :expand => false, :fill => false) @size_group.add_widget(button_vbox) return frame, tree_view, button_vbox end # If we have a stack of buttons, it often looks better if their contents # are left-aligned, rather than centered. This function creates a button # and left-aligns it contents. def left_align_button_new(label) button = Gtk::Button.new(:mnemonic => label) button.child.set_alignment(0.0, 0.5) return button end # Prompts the user for a toplevel window to move, and then moves # that window to the currently selected display def query_change_display screen = self.screen toplevel = query_for_toplevel(screen, "Please select the toplevel\n"+ "to move to the new screen") if toplevel toplevel.screen = @current_screen else screen.display.beep end end # Asks the user to click on a window, then waits for them click # the mouse. When the mouse is released, returns the toplevel # window under the pointer, or nil, if there is none. def query_for_toplevel(screen, prompt) toplevel = nil display = screen.display popup = Gtk::Window.new(:popup) popup.screen = screen popup.modal = true popup.window_position = :center frame = Gtk::Frame.new frame.set_shadow_type(:out) popup.add(frame) label = Gtk::Label.new(prompt) label.set_padding(10, 10) frame.add(label) popup.show_all # TODO: Gdk::Cursor.new(screen.display, Gdk::Cursor::CROSSHAIR) cursor = Gdk::Cursor.new(:crosshair) if Gdk::pointer_grab( popup.window, false, :button_release_mask, nil, cursor, Gdk::Event::CURRENT_TIME ) == Gdk::GRAB_SUCCESS clicked = false popup.signal_connect('button-release-event') do clicked = true end # Process events until clicked is set by button_release_event_cb. # We pass in may_block = true since we want to wait if there # are no events currently. until clicked Gtk.main_iteration # TODO: GLib::main_context_iteration(nil, true) toplevel = find_toplevel_at_pointer(screen.display) if toplevel == popup toplevel = nil end end popup.destroy Gdk.flush # Really release the grab return toplevel end end # Finds the toplevel window under the mouse pointer, if any. def find_toplevel_at_pointer(display) pointer_window, x, y = display.window_at_pointer # The user data field of a GdkWindow is used to store a pointer # to the widget that created it. if pointer_window widget = pointer_window.user_data end return (if widget widget.toplevel else nil end) end # Called when the user clicks on 'Open...' in the display # frame. Prompts for a new display, and then opens a connection # to that display. def open_display_cb dialog = Gtk::Dialog.new( :title => 'Open Display', :parent => self, :flags => :modal, :buttons => [ [:cancel, :cancel], [:ok, :ok] ] ) dialog.default_response = Gtk::ResponseType::OK display_entry = Gtk::Entry.new display_entry.activates_default = true dialog_label = Gtk::Label.new("Please enter the name of\nthe new display\n") dialog.child.add(dialog_label) dialog.child.add(display_entry) display_entry.grab_focus dialog.child.show_all result = nil until result response_id = dialog.run break if response_id != Gtk::ResponseType::OK new_screen_name = display_entry.text unless new_screen_name.empty? begin result = Gdk::Dispaly.open(new_screen_name) rescue dialog_label.text = "Can't open display :\n\t%s\nplease try another one\n" % [new_screen_name] end end end dialog.destroy end # Called when the selected row in the display list changes. # Updates info.current_display, then refills the list of # screens. def display_changed_cb(selection) @current_display = if iter = selection.selected iter.get_value(DISPLAY_COLUMN_DISPLAY) else nil end fill_screens end # Adds a new display to our list of displays, and connects # to the 'closed' signal so that we can remove it from the # list of displays again. def add_display(display) iter = @display_model.append iter.set_value(DISPLAY_COLUMN_NAME, display.name) iter.set_value(DISPLAY_COLUMN_DISPLAY, display) handler_id = display.signal_connect('closed') do display_closed_cb(display) end signal_connect('destroy') do display.signal_handler_disconnect(handler_id) end end # Called when one of the currently open displays is closed. # Remove it from our list of displays. def display_closed_cb(display) @display_model.each do |model, path, iter| tmp_display = iter.get_value( DISPLAY_COLUMN_DISPLAY) if tmp_display == display @display_model.remove(iter) break end end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/common.rb000066400000000000000000000036021511343406000256370ustar00rootroot00000000000000=begin common.rb - Common class for gtk-demo. Copyright (c) 2003-2005 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. $Id: common.rb,v 1.9 2005/10/15 03:41:36 mutoh Exp $ =end require 'gtk3' module Demo def self.find_file(basename) %w(. /usr/share/gtk-3.0/demo /usr/local/share/gtk-3.0/demo/).each do |dirname| path = File.join(dirname, basename) if File.exist?(path) return path end end raise "#{basename}: No such file or directory" end class BasicWindow < Gtk::Window def initialize(title = nil) super(:toplevel) if title set_title("#{title} in Ruby/GTK") end signal_connect("key_press_event") do |widget, event| if event.state.control_mask? and event.keyval == Gdk::Keyval::KEY_q destroy true else false end end signal_connect("delete_event") do |widget, event| quit end end def quit destroy true end end class CairoWindow < BasicWindow def initialize(title=nil) super unless Gdk.cairo_available? add_cairo_require_label return end drawing_area = Gtk::DrawingArea.new add(drawing_area) drawing_area.signal_connect("draw") do |widget, event| cr = widget.window.create_cairo_context cr.scale(widget.window.width, widget.window.height) cr.set_line_width(0.04) cr.save do cr.set_source_color(Gdk::Color.new(65535, 65535, 65535)) cr.gdk_rectangle(Gdk::Rectangle.new(0, 0, 1, 1)) cr.fill end draw(cr) end end def add_cairo_require_label message = "This sample requires GTK+ 2.8.0 or later and cairo support" add(Gtk::Label.new(message)) end def draw(cr) raise "not implemented" end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/item_factory.rb000066400000000000000000000061211511343406000270330ustar00rootroot00000000000000# Copyright (c) 2003-2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: item_factory.rb,v 1.4 2005/02/12 23:02:43 kzys Exp $ =begin = Item Factory The Gtk::ItemFactory object allows the easy creation of menus from an array of descriptions of menu items. =end require 'common' module Demo class ItemFactory < BasicWindow def initialize super('Item Factory') accel_group = Gtk::AccelGroup.new item_factory = Gtk::ItemFactory.new(Gtk::ItemFactory::TYPE_MENU_BAR, '
', accel_group) add_accel_group(accel_group) set_border_width(0) ifactory_cb = proc do |data, widget| puts "ItemFactory: activated \"#{Gtk::ItemFactory.path_from_widget(widget)}\"" end menu_items = [ ['/_File'], ['/File/tearoff1', '', nil, nil, ifactory_cb], ['/File/_New', '', 'N', nil, ifactory_cb], ['/File/_Open', '', 'O', nil, ifactory_cb], ['/File/_Save', '', 'S', nil, ifactory_cb], ['/File/Save _As...', '', nil, nil, ifactory_cb], ['/File/sep1', ''], ['/File/_Quit', '', 'Q', nil, ifactory_cb], ['/_Preferences'], ['/_Preferences/_Color'], [ '/_Preferences/Color/_Red', '', nil, nil, ifactory_cb], ['/_Preferences/Color/_Green', '/Preferences/Color/Red', nil, nil, ifactory_cb], ['/_Preferences/Color/_Blue', '/Preferences/Color/Red', nil, nil, ifactory_cb], ['/_Preferences/_Shape'], ['/_Preferences/Shape/_Square', '', nil, nil, ifactory_cb], [ '/_Preferences/Shape/_Rectangle', '/Preferences/Shape/Square', nil, nil, ifactory_cb], [ '/_Preferences/Shape/_Oval', '/Preferences/Shape/Rectangle', nil, nil, ifactory_cb], [ '/_Help', ''], [ '/Help/_About', '', nil, nil, ifactory_cb], ] item_factory.create_items(menu_items) item_factory.get_item('/Preferences/Shape/Oval').set_active(true) box1 = Gtk::VBox.new(false, 0) add(box1) box1.pack_start(item_factory.get_widget('
'), :expand => false, :fill => false, :padding => 0) label = Gtk::Label.new("Type\n\nto start") label.set_size_request(200, 200) label.set_alignment(0.5, 0.5) box1.pack_start(label, :expand => true, :fill => true, :padding => 0) separator = Gtk::HSeparator.new box1.pack_start(separator) box2 = Gtk::VBox.new(false, 10) box2.set_border_width(10) box1.pack_start(box2, :expand => false, :fill => true, :padding => 0) button = Gtk::Button.new('close') # TODO: Need signal_connect_swapped? button.signal_connect('clicked') do quit end box2.pack_start(button, :expand => true, :fill => true, :padding => 0) button.set_flags(Gtk::Widget::CAN_DEFAULT) button.grab_default end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/stock_browser.rb000066400000000000000000000153021511343406000272350ustar00rootroot00000000000000# Copyright (c) 2003-2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: stock_browser.rb,v 1.5 2005/02/12 23:02:43 kzys Exp $ =begin = Stock Item and Icon Browser This source code for this demo doesn't demonstrate anything particularly useful in applications. The purpose of the 'demo' is just to provide a handy place to browse the available stock icons and stock items. =end require 'common' module Demo class StockBrowser < BasicWindow Item = Struct.new('Item', :stock_id, :label, :modifier, :keyval, :translation_domain) ItemInfo = Struct.new('ItemInfo', :id, :item, :small_icon, :const, :accel_str) ItemDisplay = Struct.new('ItemDisplay', :type_label, :const_label, :id_label, :label_accel_label, :icon_image) def initialize super('Stock Icons and Items') set_default_size(-1, 500) self.border_width = 8 hbox = Gtk::Box.new(:horizontal, 8) add(hbox) sw = Gtk::ScrolledWindow.new sw.set_policy(:never, :automatic) hbox.pack_start(sw, :expand => false, :fill => false, :padding => 0) model = create_model treeview = Gtk::TreeView.new(model) sw.add(treeview) column = Gtk::TreeViewColumn.new column.title = 'Const' cell_renderer = Gtk::CellRendererPixbuf.new column.pack_start(cell_renderer, :expand => false) column.set_attributes(cell_renderer, "stock_id" => 1) cell_renderer = Gtk::CellRendererText.new column.pack_start(cell_renderer, :expand => true) column.set_cell_data_func(cell_renderer) do |column, cell, model, iter| cell.text = iter[0].const end treeview.append_column(column) cell_renderer = Gtk::CellRendererText.new treeview.insert_column(-1, 'Label', cell_renderer) do |col, cell, model, iter| info = iter[0] cell.text = info.item.label if info end cell_renderer = Gtk::CellRendererText.new treeview.insert_column(-1, 'Accel', cell_renderer) do |col, cell, model, iter| info = iter[0] cell.text = info.accel_str if info end cell_renderer = Gtk::CellRendererText.new treeview.insert_column(-1, 'ID', cell_renderer) do |col, cell, model, iter| info = iter[0] cell.text = info.id if info end align = Gtk::Alignment.new(0.5, 0.0, 0.0, 0.0) hbox.pack_end(align, :expand => false, :fill => false, :padding => 0) frame = Gtk::Frame.new('Selected Item') align.add(frame) vbox = Gtk::Box.new(:vertical, 8) vbox.border_width = 4 frame.add(vbox) display = ItemDisplay.new class << treeview @display = nil attr_accessor :display end treeview.display = display display.type_label = Gtk::Label.new display.const_label = Gtk::Label.new display.id_label = Gtk::Label.new display.label_accel_label = Gtk::Label.new display.icon_image = Gtk::Image.new # empty image vbox.pack_start(display.type_label, :expand => false, :fill => false, :padding => 0) vbox.pack_start(display.icon_image, :expand => false, :fill => false, :padding => 0) vbox.pack_start(display.label_accel_label, :expand => false, :fill => false, :padding => 0) vbox.pack_start(display.const_label, :expand => false, :fill => false, :padding => 0) vbox.pack_start(display.id_label, :expand => false, :fill => false, :padding => 0) selection = treeview.selection selection.mode = :single selection.signal_connect('changed') do |s| selection_changed(s) end end def create_model store = Gtk::ListStore.new(ItemInfo, String, String, String) list_ids = Gtk::Stock.ids list_ids.sort! do |a, b| a.to_s <=> b.to_s end list_ids.each do |stock_id| info = ItemInfo.new info.id = stock_id begin info.item = Item.new(*Gtk::Stock.lookup(stock_id)) rescue ArgumentError info.item = Item.new end # only show icons for stock IDs that have default icons icon_set = Gtk::IconFactory.lookup_default(info.id.to_s) if icon_set # See what sizes this stock icon really exists at sizes = icon_set.sizes # Use menu size if it exists, otherwise first size found size = sizes.find do |s| s == :menu end || sizes.first info.small_icon = render_icon_pixbuf(info.id, size) unless size == :menu # 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) info.small_icon = scaled end else info.small_icon = nil end if info.item.keyval info.accel_str = Gtk::Accelerator.to_name(info.item.keyval, info.item.modifier) else info.accel_str = '' end info.const = id_to_const(info.id) iter = store.append iter[0] = info iter[1] = info.id end return store end def selection_changed(selection) treeview = selection.tree_view display = treeview.display iter = selection.selected info = iter[0] display.type_label.label = if info.small_icon and info.item.label 'Icon and Item' elsif info.small_icon 'Icon Only' elsif info.item.label 'Item Only' else '???????' end display.const_label.label = info.const display.id_label.label = info.id if info.item.label str = "%s %s" % [info.item.label, info.accel_str] display.label_accel_label.set_text(str, true) else display.label_accel_label.set_text('') end if info.small_icon display.icon_image.set_from_stock(info.id, get_largest_size(info.id)) else display.icon_image.pixbuf = nil end end def get_largest_size(symbol) set = Gtk::IconFactory.lookup_default(symbol.id2name) best_size = :invalid best_pixels = 0 sizes = set.sizes sizes.collect! do |i| width, height = Gtk::IconSize.lookup(i) [i, width * height] end return (sizes.max do |a, b| a[1] <=> b[1] end)[0] end def id_to_const(id) const = '' s = id.id2name if s =~ /^gtk-/ const += 'Gtk::Stock::' s[0,4] = '' end const += s.upcase.gsub(/-/, '_') const end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/textview.rb000066400000000000000000000376631511343406000262440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (c) 2003-2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: textview.rb,v 1.8 2005/02/06 18:25:13 kzys Exp $ =begin = Text Widget/Multiple Views The Gtk::TextView widget displays a Gtk::TextBuffer. One Gtk::TextBuffer can be displayed by multiple Gtk::TextViews. This demo has two views displaying a single buffer, and shows off the widget's text formatting features. =end require 'common' module Demo class TextView < BasicWindow GRAY50_WIDTH = 2 GRAY50_HEIGHT = 2 GRAY50_BITS = [0x02, 0x01].pack("c") @@nest_window = nil def initialize super("TextView Window") set_default_size(450, 450) set_title("TextView") set_border_width(0) vpaned = Gtk::VPaned.new vpaned.set_border_width(5) add(vpaned) ## # For convenience, we just use the autocreated buffer from # the first text view; you could also create the buffer # by itself with Gtk::TextBuffer.new, then later create # a view widget. # view1 = Gtk::TextView.new buffer = view1.buffer view2 = Gtk::TextView.new(buffer) sw = Gtk::ScrolledWindow.new(nil, nil) sw.set_policy(:automatic, :automatic) vpaned.add1(sw) sw.add(view1) sw = Gtk::ScrolledWindow.new(nil, nil) sw.set_policy(:automatic, :automatic) vpaned.add2(sw) sw.add(view2) create_tags(buffer) insert_text(buffer) attach_widgets(view1) attach_widgets(view2) vpaned.show_all self.show end def create_tags(buffer) ## # Create a bunch of tags. Note that it's also possible to # create tags with Gtk::TextTag.new then add them to the # tag table for the buffer, Gtk::TextBuffer#create_tag is # just a convenience function. Also note that you don't have # to give tags a name; pass NULL for the name to create an # anonymous tag. # # In any real app, another useful optimization would be to create # a Gtk::TextTagTable in advance, and reuse the same tag table for # all the buffers with the same tag set, instead of creating # new copies of the same tags for every buffer. # # Tags are assigned default priorities in order of addition to the # tag table. That is, tags created later that affect the same text # property affected by an earlier tag will override the earlier # tag. You can modify tag priorities with # Gtk::TextTag#set_priority. # buffer.create_tag('heading', 'weight' => Pango::FontDescription::WEIGHT_BOLD, 'size' => 15 * Pango::SCALE) buffer.create_tag("italic", "style" => Pango::FontDescription::STYLE_ITALIC) buffer.create_tag("bold", "weight" => Pango::FontDescription::WEIGHT_BOLD) buffer.create_tag("big", # points times the PANGO_SCALE factor "size" => 20 * Pango::SCALE) buffer.create_tag("xx-small", "scale" => Pango::AttrScale::XX_SMALL) buffer.create_tag("x-large", "scale" => Pango::AttrScale::X_LARGE) buffer.create_tag("monospace", "family" => "monospace") buffer.create_tag("blue_foreground", "foreground" => "blue") buffer.create_tag("red_background", "background" => "red") stipple = Gdk::Pixmap.create_from_data(nil, GRAY50_BITS, GRAY50_WIDTH, GRAY50_HEIGHT) buffer.create_tag("background_stipple", "background_stipple" => stipple) buffer.create_tag("foreground_stipple", "foreground_stipple" => stipple) buffer.create_tag("big_gap_before_line", "pixels_above_lines" => 30) buffer.create_tag("big_gap_after_line", "pixels_below_lines" => 30) buffer.create_tag("double_spaced_line", "pixels_inside_wrap" => 10) buffer.create_tag("not_editable", "editable" => false) buffer.create_tag("word_wrap", "wrap_mode" => :word) buffer.create_tag("char_wrap", "wrap_mode" => Gtk::TextTag::WRAP_CHAR) buffer.create_tag("no_wrap", "wrap_mode" => :none) buffer.create_tag("center", "justification" => Gtk::JUSTIFY_CENTER) buffer.create_tag("right_justify", "justification" => Gtk::JUSTIFY_RIGHT) buffer.create_tag("wide_margins", "left_margin" => 50, "right_margin" => 50) buffer.create_tag("strikethrough", "strikethrough" => true) buffer.create_tag("underline", "underline" => Pango::AttrUnderline::SINGLE) buffer.create_tag("double_underline", "underline" => Pango::AttrUnderline::DOUBLE) buffer.create_tag("superscript", "rise" => 10 * Pango::SCALE, # 10 pixels "size" => 8 * Pango::SCALE) # 8 points buffer.create_tag("subscript", "rise" => -10 * Pango::SCALE, # 10 pixels "size" => 8 * Pango::SCALE) # 8 points buffer.create_tag("rtl_quote", "wrap_mode" => :word, "direction" => Gtk::Widget::TEXT_DIR_RTL, "indent" => 30, "left_margin" => 20, "right_margin" => 20) end def insert_text(buffer) ## # 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("gtk-logo-rgb.gif") pixbuf = Gdk::Pixbuf.new(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) pixbuf = scaled ## # get start of buffer; each insertion will revalidate the # iterator to point to just after the inserted text. # iter = buffer.get_iter_at(:offset => 0) buffer.insert(iter, "The text widget can display text with all kinds of nifty attributes. It also supports multiple views of the same buffer; this demo is showing the same buffer in two places.\n\n") buffer.insert(iter, "Font styles. ", 'heading') buffer.insert(iter, "For example, you can have ") buffer.insert(iter, "italic", "italic") buffer.insert(iter, ", ") buffer.insert(iter, "bold", "bold") buffer.insert(iter, ", or ") buffer.insert(iter, "monospace(typewriter)", "monospace") buffer.insert(iter, ", or ") buffer.insert(iter, "big", "big") buffer.insert(iter, " text. ") buffer.insert(iter, "It's best not to hardcode specific text sizes; you can use relative sizes as with CSS, such as ") buffer.insert(iter, "xx-small", "xx-small") buffer.insert(iter, " or ") buffer.insert(iter, "x-large", "x-large") buffer.insert(iter, " to ensure that your program properly adapts if the user changes the default font size.\n\n") buffer.insert(iter, "Colors. ", "heading") buffer.insert(iter, "Colors such as ") buffer.insert(iter, "a blue foreground", "blue_foreground") buffer.insert(iter, " or ") buffer.insert(iter, "a red background", "red_background") buffer.insert(iter, " or even ") buffer.insert(iter, "a stippled red background", "red_background", "background_stipple") buffer.insert(iter, " or ") buffer.insert(iter, "a stippled blue foreground on solid red background", "blue_foreground", "red_background", "foreground_stipple") buffer.insert(iter, "(select that to read it) can be used.\n\n") buffer.insert(iter, "Underline, strikethrough, and rise. ", "heading") buffer.insert(iter, "Strikethrough", "strikethrough") buffer.insert(iter, ", ") buffer.insert(iter, "underline", "underline") buffer.insert(iter, ", ") buffer.insert(iter, "double underline", "double_underline") buffer.insert(iter, ", ") buffer.insert(iter, "superscript", "superscript") buffer.insert(iter, ", and ") buffer.insert(iter, "subscript", "subscript") buffer.insert(iter, " are all supported.\n\n") buffer.insert(iter, "Images. ", "heading") buffer.insert(iter, "The buffer can have images in it: ") buffer.insert(iter, pixbuf) buffer.insert(iter, pixbuf) buffer.insert(iter, pixbuf) buffer.insert(iter, " for example.\n\n") buffer.insert(iter, "Spacing. ", "heading") buffer.insert(iter, "You can adjust the amount of space before each line.\n") buffer.insert(iter, "This line has a whole lot of space before it.\n", "big_gap_before_line", "wide_margins") buffer.insert(iter, "You can also adjust the amount of space after each line; this line has a whole lot of space after it.\n", "big_gap_after_line", "wide_margins") buffer.insert(iter, "You can also adjust the amount of space between wrapped lines; this line has extra space between each wrapped line in the same paragraph. To show off wrapping, some filler text: the quick brown fox jumped over the lazy dog. Blah blah blah blah blah blah blah blah blah.\n", "double_spaced_line", "wide_margins") buffer.insert(iter, "Also note that those lines have extra-wide margins.\n\n") buffer.insert(iter, "Editability. ", "heading") buffer.insert(iter, "This line is 'locked down' and can't be edited by the user - just try it! You can't delete this line.\n\n", "not_editable") buffer.insert(iter, "Wrapping. ", "heading") buffer.insert(iter, "This line(and most of the others in this buffer) is word-wrapped, using the proper Unicode algorithm. Word wrap should work in all scripts and languages that GTK+ supports. Let's make this a long paragraph to demonstrate: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah\n\n") buffer.insert(iter, "This line has character-based wrapping, and can wrap between any two character glyphs. Let's make this a long paragraph to demonstrate: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah\n\n", "char_wrap") buffer.insert(iter, "This line has all wrapping turned off, so it makes the horizontal scrollbar appear.\n\n\n", "no_wrap") buffer.insert(iter, "Justification. ", "heading") buffer.insert(iter, "\nThis line has center justification.\n", "center") buffer.insert(iter, "This line has right justification.\n", "right_justify") buffer.insert(iter, "\nThis line has big wide margins. Text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text.\n", "wide_margins") buffer.insert(iter, "Internationalization. ", "heading") buffer.insert(iter, "You can put all sorts of Unicode text in the buffer.\n\nGerman(Deutsch Süd) Grüß Gott\nGreek(Ελληνικά) Γειά σας\nHebrew שלו×\nJapanese(日本語)\n\nThe widget properly handles bidirectional text, word wrapping, DOS/UNIX/Unicode paragraph separators, grapheme boundaries, and so on using the Pango internationalization framework.\n") buffer.insert(iter, "Here's a word-wrapped quote in a right-to-left language:\n") buffer.insert(iter, "??? ??? ???? ?? ???? ???????? ????? ?? ???? ?????? ??????? ??????? ?? ???? ?????? ?? ????? ?? ??????? ????? ??????? ??? ?????? ????? ?????? ????? ???? ?? ?????? ?????? ?? ???????? ?????? ????? ?? ???? ???? ????????? ???????. ???? ???? ??? ???????? ????? ?? »????????« ?? ???????.\n\n", "rtl_quote") buffer.insert(iter, "You can put widgets in the buffer: Here's a button: ") anchor = buffer.create_child_anchor(iter) buffer.insert(iter, " and a menu: ") anchor = buffer.create_child_anchor(iter) buffer.insert(iter, " and a scale: ") anchor = buffer.create_child_anchor(iter) buffer.insert(iter, " and an animation: ") anchor = buffer.create_child_anchor(iter) buffer.insert(iter, " finally a text entry: ") anchor = buffer.create_child_anchor(iter) buffer.insert(iter, ".\n") buffer.insert(iter, "\n\nThis demo doesn't demonstrate all the Gtk::TextBuffer features; it leaves out, for example: invisible/hidden text(doesn't work in GTK 2, but planned), tab stops, application-drawn areas on the sides of the widget for displaying breakpoints and such...") # Apply word_wrap tag to whole buffer buf_start, buf_end = buffer.bounds buffer.apply_tag("word_wrap", buf_start, buf_end) end def find_anchor(iter) while iter.forward_char do return true if iter.child_anchor end return false end def attach_widgets(text_view) buffer = text_view.buffer; iter = buffer.start_iter i = 0; while find_anchor(iter) do anchor = iter.child_anchor if i == 0 widget = Gtk::Button.new("Click Me") widget.signal_connect('clicked') { |button| if @@nest_window and ! @@nest_window.destroyed? @@nest_window.present break end buffer = Gtk::TextBuffer.new iter = buffer.start_iter buffer.insert(iter, "This buffer is shared by a set of nested text views.\n Nested view:\n") anchor = buffer.create_child_anchor(iter) buffer.insert(iter, "\nDon't do this in real applications, please.\n") view = Gtk::TextView.new(buffer) recursive_attach_view(0, view, anchor) @@nest_window = Gtk::Window.new(Gtk::Window::TOPLEVEL) sw = Gtk::ScrolledWindow.new(nil, nil) sw.set_policy(:automatic, :automatic) @@nest_window.add(sw) sw.add(view) @@nest_window.set_default_size(300, 400) @@nest_window.show_all } elsif i == 1 menu = Gtk::Menu.new widget = Gtk::OptionMenu.new menu_item = Gtk::MenuItem.new("Option 1") menu.append(menu_item) menu_item = Gtk::MenuItem.new("Option 2") menu.append(menu_item) menu_item = Gtk::MenuItem.new("Option 3") menu.append(menu_item) widget.menu = menu elsif i == 2 widget = Gtk::HScale.new widget.set_range(0, 100) widget.set_size_request(70, -1) elsif i == 3 filename = Demo.find_file("floppybuddy.gif") widget = Gtk::Image.new(filename) elsif i == 4 widget = Gtk::Entry.new else #widget = nil; avoids a compiler warning #g_assert_not_reached ; end text_view.add_child_at_anchor(widget, anchor) widget.show_all i += 1 end end def recursive_attach_view(depth, view, anchor) return if depth > 4 child_view = Gtk::TextView.new(view.buffer) # Event box is to add a black border around each child view event_box = Gtk::EventBox.new color = Gdk::Color.parse("black") event_box.modify_bg(Gtk::STATE_NORMAL, color) align = Gtk::Alignment.new(0.5, 0.5, 1.0, 1.0) align.set_border_width(1) event_box.add(align) align.add(child_view) view.add_child_at_anchor(event_box, anchor) recursive_attach_view(depth + 1, child_view, anchor) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/old_demos/tree_store.rb000066400000000000000000000205771511343406000265340ustar00rootroot00000000000000# Copyright (c) 2003-2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: tree_store.rb,v 1.7 2005/02/06 18:25:13 kzys Exp $ =begin = Tree View/Tree Store The Gtk::TreeStore is used to store data in tree form, to be used later on by a Gtk::TreeView to display it. This demo builds a simple Gtk::TreeStore and displays it. If you're new to the GtkTreeView widgets and associates, look into the Gtk::ListStore example first. =end require 'common' module Demo class TreeStore < BasicWindow # TreeItem structure TreeItem = Struct.new('TreeItem', :label, :alex, :havoc, :tim, :owen, :dave, :world_holiday) # shared by the European hackers # columns ( HOLIDAY_NAME_COLUMN, ALEX_COLUMN, HAVOC_COLUMN, TIM_COLUMN, OWEN_COLUMN, DAVE_COLUMN, VISIBLE_COLUMN, WORLD_COLUMN, NUM_COLUMNS, ) = *(0..9).to_a # tree data TOPLEVEL = [ ['January', [ ["New Years Day", true, true, true, true, false, true], ["Presidential Inauguration", false, true, false, true, false, false], ["Martin Luther King Jr. day", false, true, false, true, false, false], ] ], ['February', [ ["Presidents' Day", false, true, false, true, false, false], ["Groundhog Day", false, false, false, false, false, false], ["Valentine's Day", false, false, false, false, true, true], ] ], ['March', [ ["National Tree Planting Day", false, false, false, false, false, false], [ "St Patrick's Day", false, false, false, false, false, true], ] ], ['April', [ [ "April Fools' Day", false, false, false, false, false, true ], [ "Army Day", false, false, false, false, false, false ], [ "Earth Day", false, false, false, false, false, true ], [ "Administrative Professionals' Day", false, false, false, false, false, false ], ]], ['May', [ [ "Nurses' Day", false, false, false, false, false, false ], [ "National Day of Prayer", false, false, false, false, false, false ], [ "Mothers' Day", false, false, false, false, false, true ], [ "Armed Forces Day", false, false, false, false, false, false ], [ "Memorial Day", true, true, true, true, false, true ], ] ], ['June', [ [ "June Fathers' Day", false, false, false, false, false, true ], [ "Juneteenth (Liberation of Slaves)", false, false, false, false, false, false ], [ "Flag Day", false, true, false, true, false, false ], ] ], ['July', [ [ "Parents' Day", false, false, false, false, false, true ], [ "Independence Day", false, true, false, true, false, false ], ] ], ['August', [ [ "Air Force Day", false, false, false, false, false, false ], [ "Coast Guard Day", false, false, false, false, false, false ], [ "Friendship Day", false, false, false, false, false, false ], ] ], ['September', [ [ "Grandparents' Day", false, false, false, false, false, true ], [ "Citizenship Day or Constitution Day", false, false, false, false, false, false ], [ "Labor Day", true, true, true, true, false, true ], ] ], ['October', [ [ "National Children's Day", false, false, false, false, false, false ], [ "Bosses' Day", false, false, false, false, false, false ], [ "Sweetest Day", false, false, false, false, false, false ], [ "Mother-in-Law's Day", false, false, false, false, false, false ], [ "Navy Day", false, false, false, false, false, false ], [ "Columbus Day", false, true, false, true, false, false ], [ "Halloween", false, false, false, false, false, true ], ] ], ['November', [ [ "Marine Corps Day", false, false, false, false, false, false ], [ "Veterans' Day", true, true, true, true, false, true ], [ "Thanksgiving", false, true, false, true, false, false ], ] ], ['December', [ [ 'Pearl Harbor Remembrance Day', false, false, false, false, false, false ], [ 'Christmas', true, true, true, true, false, true ], [ 'Kwanzaa', false, false, false, false, false, false ], ] ], ].collect do |month_name, holidays| [ month_name, holidays.collect do |args| TreeItem.new(args) end, ] end def initialize # create window, etc super('Card planning sheet') vbox = Gtk::VBox.new(false, 8) vbox.border_width = 8 add(vbox) vbox.pack_start(Gtk::Label.new("Jonathan's Holiday Card Planning Sheet"), :expand => false, :fill => false, :padding => 0) sw = Gtk::ScrolledWindow.new(nil, nil) sw.shadow_type = Gtk::SHADOW_ETCHED_IN sw.set_policy(:automatic, :automatic) vbox.pack_start(sw, :expand => true, :fill => true, :padding => 0) # create model model = create_model # create tree view treeview = Gtk::TreeView.new(model) treeview.rules_hint = true treeview.selection.mode = Gtk::SELECTION_MULTIPLE add_columns(treeview) sw.add(treeview) # expand all rows after the treeview widget has been realized treeview.signal_connect('realize') do treeview.expand_all end set_default_size(650, 400) end def create_model # create tree store model = Gtk::TreeStore.new(String, TrueClass, TrueClass, TrueClass, TrueClass, TrueClass, TrueClass, TrueClass) # add data to the tree store TOPLEVEL.each do |month_name, holidays| iter = model.append(nil) iter[HOLIDAY_NAME_COLUMN] = month_name (ALEX_COLUMN..DAVE_COLUMN).each do |index| iter[index] = false end # add children holidays.each do |holiday| child_iter = model.append(iter) child_iter[HOLIDAY_NAME_COLUMN] = holiday.label[0] %w(alex havoc tim owen dave).each_with_index do |person, i| child_iter[ALEX_COLUMN + i] = holiday[person] end child_iter[VISIBLE_COLUMN] = true child_iter[WORLD_COLUMN] = holiday.world_holiday end end return model end def add_columns(treeview) model = treeview.model # column for holiday names renderer = Gtk::CellRendererText.new renderer.xalign = 0.0 col_offset = treeview.insert_column(-1, 'Holiday', renderer, 'text' => HOLIDAY_NAME_COLUMN) column = treeview.get_column(col_offset - 1) column.clickable = true [ ['Alex', true ], ['Havoc', false], ['Tim', true ], ['Owen', false], ['Dave', false], ].each_with_index do |args, i| person, european = *args renderer = Gtk::CellRendererToggle.new renderer.xalign = 0.0 eval(%Q[def renderer.column; #{ALEX_COLUMN + i}; end]) renderer.signal_connect('toggled') do |cell, path| item_toggled(cell, path, model) end attributes = { 'active' => (ALEX_COLUMN + i), 'visible' => VISIBLE_COLUMN, } if european attributes['activatable'] = WORLD_COLUMN end col_offset = treeview.insert_column(-1, person, renderer, attributes) column = treeview.get_column(col_offset - 1) column.sizing = Gtk::TreeViewColumn::FIXED column.fixed_width = 50 column.clickable = true end end def item_toggled (cell, path_str, model) path = Gtk::TreePath.new(path_str) column = cell.column # get toggled iter iter = model.get_iter(path) toggle_item = iter[column] # do something with the value toggle_item ^= 1 # set new value iter[column] = toggle_item end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml000066400000000000000000000011521511343406000264410ustar00rootroot00000000000000 'red' (-1, -1) false false ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/overlay.rb000066400000000000000000000033131511343406000240620ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Overlay/Interactive Overlay Shows widgets in static positions over a main widget. The overlayed widgets can be interactive controls such as the entry in this example, or just decorative, like the big blue label. =end class OverlayDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.set_default_size(500, 510) @window.title = "Interactive Overlay" @window.screen = main_window.screen overlay = Gtk::Overlay.new initialize_grid overlay.add(@grid) @entry = Gtk::Entry.new @entry.placeholder_text = "Your Lucky Number" vbox = Gtk::Box.new(:vertical, 10) overlay.add_overlay(vbox) overlay.set_overlay_pass_through(vbox, true) vbox.halign = :center vbox.valign = :center label = Gtk::Label.new("Numbers") label.use_markup = true vbox.pack_start(label, :expand => false, :fill => false, :padding => 8) vbox.pack_start(@entry, :expand => false, :fill => false, :padding => 8) @window.add(overlay) overlay.show_all end def run if !@window.visible? @window.show_all else @window.destroy end end private def initialize_grid @grid = Gtk::Grid.new (0..4).each do |i| (0..4).each do |j| text = (5 * j + i).to_s button = Gtk::Button.new(:label => text) button.hexpand = true button.vexpand = true button.signal_connect "clicked" do |widget| @entry.text = widget.label end @grid.attach(button, i, j, 1, 1) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/overlay2.rb000066400000000000000000000041731511343406000241510ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Overlay/Decorative Overlay Another example of an overlay with some decorative and some interactive controls. =end class Overlay2Demo def initialize(_main_window) @window = Gtk::Window.new(:toplevel) @window.set_default_size(500, 510) @window.title = "Decorative Overlay" @overlay = Gtk::Overlay.new sw = Gtk::ScrolledWindow.new sw.set_policy(:automatic, :automatic) initialize_textview @window.add(@overlay) @overlay.add(sw) sw.add(@text) generate_image_in_overlay("/overlay2/decor1.png", :start) generate_image_in_overlay("/overlay2/decor2.png", :end) generate_adjustment generate_scale_in_overlay @overlay.show_all end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def generate_image_in_overlay(resource, position) image = Gtk::Image.new(:resource => resource) @overlay.add_overlay(image) @overlay.set_overlay_pass_through(image, true) image.halign = position image.valign = position end def generate_adjustment @adjustment = Gtk::Adjustment.new(0, 0, 100, 1, 1, 0) @adjustment.signal_connect "value-changed" do |widget| value = widget.value @text.set_left_margin(value) @tag.set_property("pixels-above-lines", value) end @adjustment.value = 100 end def generate_scale_in_overlay scale = Gtk::Scale.new(:horizontal, @adjustment) scale.draw_value = false scale.set_size_request(120, -1) scale.margin_start = 20 scale.margin_end = 20 scale.margin_bottom = 20 @overlay.add_overlay(scale) scale.halign = :start scale.valign = :end scale.tooltip_text = "Margin" end def initialize_textview @text = Gtk::TextView.new buffer = @text.buffer buffer.text = "Dear Diary..." @tag = buffer.create_tag("top-margin", "pixels-above-lines" => 0) word_end = buffer.start_iter word_end.forward_word_end buffer.apply_tag(@tag, buffer.start_iter, word_end) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/panes.rb000066400000000000000000000066161511343406000235200ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Paned Widgets The GtkPaned Widget divides its content area into two panes with a divider in between that the user can adjust. A separate child is placed into each pane. GtkPaned widgets can be split horizontally or vertically. There are a number of options that can be set for each pane. This test contains both a horizontal and a vertical GtkPaned widget, and allows you to adjust the options for each side of each widget. =end class PanesDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Paned Widgets" vbox = Gtk::Box.new(:vertical, 0) @window.add(vbox) vpaned = Gtk::Paned.new(:vertical) vbox.pack_start(vpaned, :expand => true, :fill => true, :padding => 0) vpaned.margin = 5 @hpaned = Gtk::Paned.new(:horizontal) vpaned.add1(@hpaned) frame = Gtk::Frame.new frame.shadow_type = :in frame.set_size_request(60, 60) @hpaned.add1(frame) button = Gtk::Button.new(:label => "_Hi there", :use_underline => true) frame.add(button) frame = Gtk::Frame.new frame.shadow_type = :in frame.set_size_request(80, 60) @hpaned.add2(frame) frame = Gtk::Frame.new frame.shadow_type = :in frame.set_size_request(60, 80) vpaned.add2(frame) # Now create toggle buttons to control sizing buttons = create_pane_options("Horizontal", "Left", "Right") vbox.pack_start(buttons, :expand => false, :fill => false, :padding => 0) buttons = create_pane_options("Vertical", "Top", "Bottom") vbox.pack_start(buttons, :expand => false, :fill => false, :padding => 0) vbox.show_all end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_pane_options(frame_label, label1, label2) child1 = @hpaned.child1 child2 = @hpaned.child2 frame = Gtk::Frame.new(frame_label) frame.margin = 4 @table = Gtk::Grid.new frame.add(@table) label = Gtk::Label.new(label1) @table.attach(label, 0, 0, 1, 1) check_button(:resize, false, child1, 0, 1) check_button(:shrink, true, child1, 0, 2) label = Gtk::Label.new(label2) @table.attach(label, 1, 0, 1, 1) check_button(:resize, true, child2, 1, 1) check_button(:shrink, true, child2, 1, 2) frame end def check_button(type, active, child, xposition, yposition) is_resize = (type == :resize) label = is_resize ? "_Resize" : "_Shrink" check_button = Gtk::CheckButton.new(label) check_button.use_underline = true check_button.active = active @table.attach(check_button, xposition, yposition, 1, 1) check_button.signal_connect "toggled" do is_child1 = (@hpaned.child1 == child) resize = @hpaned.child_get_property(child, "resize") shrink = @hpaned.child_get_property(child, "shrink") if is_resize resize = !resize else shrink = !shrink end @hpaned.remove(child) if is_child1 @hpaned.pack1(child, :resize => resize, :shrink => shrink) else @hpaned.pack2(child, :resize => resize, :shrink => shrink) end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/pickers.rb000066400000000000000000000034231511343406000240430ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Pickers These widgets are mainly intended for use in preference dialogs. They allow to select colors, fonts, files, directories and applications. =end class PickersDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Pickers" initialize_grid label = generate_label("Color:") picker = Gtk::ColorButton.new @table.attach(label, 0, 0, 1, 1) @table.attach(picker, 1, 0, 1, 1) label = generate_label("Font:") picker = Gtk::FontButton.new @table.attach(label, 0, 1, 1, 1) @table.attach(picker, 1, 1, 1, 1) label = generate_label("File:") picker = Gtk::FileChooserButton.new("Pick a file", :open) picker.local_only = true @table.attach(label, 0, 2, 1, 1) @table.attach(picker, 1, 2, 1, 1) label = generate_label("Folder:") picker = Gtk::FileChooserButton.new("Pick a folder", :select_folder) @table.attach(label, 0, 3, 1, 1) @table.attach(picker, 1, 3, 1, 1) label = generate_label("Mail:") picker = Gtk::AppChooserButton.new("x-scheme-handler/mailto") picker.show_dialog_item = true @table.attach(label, 0, 4, 1, 1) @table.attach(picker, 1, 4, 1, 1) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_grid @table = Gtk::Grid.new @table.row_spacing = 3 @table.column_spacing = 10 @table.margin = 20 @window.add(@table) end def generate_label(label) label = Gtk::Label.new(label) label.halign = :start label.valign = :center label.hexpand = :true label end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/pixbufs.rb000066400000000000000000000104231511343406000240610ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Pixbufs 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 GtkDrawingArea to do a simple animation. Look at the Image demo for additional pixbuf usage examples. =end class 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 initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.resizable = false background_pixbuf = load_pixbuf(BACKGROUND_NAME) other_pixbufs = [] IMAGES_NAMES.each do |img| other_pixbufs << load_pixbuf(img) end width = background_pixbuf.width height = background_pixbuf.height @window.set_size_request(width, height) frame = GdkPixbuf::Pixbuf.new(:colorspace => :rgb, :has_alpha => false, :bits_per_sample => 8, :width => width, :height => height) 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) dest = r1.intersect(r2) next unless dest frame.composite!(other_pixbufs[i], :dest_x => dest.x, :dest_y => dest.y, :dest_width => dest.width, :dest_height => dest.height, :offset_x => xpos, :offset_y => ypos, :scale_x => k, :scale_y => k, :interpolation_type => :nearest, :overall_alpha => 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 da.queue_draw GLib::Source::CONTINUE end end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def show_message_dialog_on(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 def load_pixbuf(image_name) begin GdkPixbuf::Pixbuf.new(:resource => image_name) rescue StandardError => e show_message_dialog_on(e) @window.destroy end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/pointer_cursor.png000066400000000000000000000026101511343406000256360ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±eIDATX…í–OLWÇ?o–EÆaåOBa7Öp[)é©Äƒ)ô‚MäÔÄÄÄ&ž<Ôôn¤áÒCOz—(!у¦Òx‰kÜĖбîf¶Z˜]`wvßëaÝ¥ ¬›4õ{™÷Þ¼7¿Ïü~¿÷{Þë?"ˆH$bܸqÃ<ù±Åøýû÷ƒÉdò7¥”’RÊW¯^ýÚ××÷!à}×ð¾|ùrpqqÑéëëSýýýjii)s÷îÝs@=P¶Z sÊ¥”ŸŒ—E"Âá0±X ÇqZ€ZÖÃñNà•Rz …`mmÍ ø^¼µJñ€¦”*øC!Ùl6¿^c Y J)²Ù,étšt: @{{ûÁ¹¹¹Ÿâñø¹áááOÉ%äÔà8¶mcÛ6J)MÑ`šæÉdò›®®®‘³gÏ~fšfÏ‹/¾êíí­b—¹±°&N ©P(¤B¡šœœT* ©ÎÎN%¥”jƒ‰Äׯ_ÿòæÍ›Í§Nª`Ý3o$An‹ÕF£Ñ©‹/ª@  €º|ù²Û*ªÕÖÖ¦>¬,ËÊæaVWWÿœ››ûЋye«=,Úý~ÿ·étºÑçóíO§Óض À½{÷Ü6@8fppùùy®]»¦Y–ÅØØÝÝÝ5gΜùÁ4ÍÖ–––ï€e ³€Ê÷íÛ÷óÓ§Oƒ333ÚÑ£GU>ÆÇÇ t]/òéªh¼^oÍF—Æãq±²²@0t“­©©‰ŠŠ fgg¨¯¯§®®ŽG!„@×u‰ÄxÊËËk,Ër½sìØ1÷eSSÉdÇCCC†a`Yº®S]]Mss3ÏŸ?wç½ €&„¨X]]-Z8"‘Ç'“ÉpõêU„œ8qÛ¶Æ4MNž<É£££Ûß @H)¥¦m]¥¯\¹â¶•R ¹ýL&ÃÀÀÀކó*j%“ɤ+++UÉ_ÙA{÷î%•J­• µ,ëIGGÁ`pׯ[[[ééé‘“““³€ ~¬Xœ÷twwºtéÒ/µµµ ±XLnÞ††aˆíB´Qº®kÏž=‹9räÇX,6Ìnfðþ:}úô×iš¶gã„D"‘ʾ¾‘ì¤ÅÅÅ¥óçÏÿ¾¼¼ü˜b€³@¾bé@PÃúÕKs¡ÜðÜI`qà/rg†­Îèü­¦Œ\íÞ|ýVlŠåÊÏsÈ@Ù×½×ÿH([[xIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/popover-3.18.ui000066400000000000000000000062051511343406000244770ustar00rootroot00000000000000 Item 1 Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Item 8 Item 9 Item 10 1 vertical 6 1 1 edit-find edit-clear 1 1 in 1 1 1 liststore1 0 0 2 0 1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/popover.rb000066400000000000000000000062241511343406000240770ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Popovers A bubble-like window containing contextual information or options. GtkPopovers can be attached to any widget, and will be displayed within the same window, but on top of all its content. =end class PopoverDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen box = Gtk::Box.new(:vertical, 24) box.margin = 24 @window.add(box) widget = add_toggle_button_with_popover box.add(widget) widget = add_custom_entry_with_complex_popover box.add(widget) widget = add_calendar_with_popover box.add(widget) end def run if !@window.visible? @window.show_all else @window.destroy end @window end def create_popover(parent, child, pos) popover = Gtk::Popover.new(parent) popover.position = pos popover.add(child) child.margin = 6 child.show popover end def create_complex_popover(parent, pos) if Gtk::Version.or_later?(3, 20) builder = Gtk::Builder.new(:resource => "/popover/popover.ui") else builder = Gtk::Builder.new(:resource => "/popover/popover-3.18.ui") end window = builder["window"] content = window.child content.parent.remove(content) window.destroy popover = create_popover(parent, content, pos) popover end def add_toggle_button_with_popover widget = Gtk::ToggleButton.new(:label => "Button") label = Gtk::Label.new("This popover does not grab input") toggle_popover = create_popover(widget, label, :top) toggle_popover.modal = false widget.signal_connect "toggled" do |button| toggle_popover.visible = button.active? end widget end def add_custom_entry_with_complex_popover widget = CustomEntry.new entry_popover = create_complex_popover(widget, :top) widget.set_icon_from_icon_name(:primary, "edit-find") widget.set_icon_from_icon_name(:secondary, "edit-clear") widget.signal_connect "icon-press" do |entry, icon_pos, _event| rect = entry.get_icon_area(icon_pos) entry_popover.pointing_to = rect entry_popover.show entry.popover_icon_pos = icon_pos end widget.signal_connect "size-allocate" do |entry, _allocation| if entry_popover.visible? popover_pos = entry.popover_icon_pos rect = entry.get_icon_area(popover_pos) entry_popover.pointing_to = rect end end widget end def add_calendar_with_popover widget = Gtk::Calendar.new widget.signal_connect "day-selected" do |calendar| event = Gtk.current_event if event.type == :button_press x, y = event.window.coords_to_parent(event.x, event.y) allocation = calendar.allocation rect = Gdk::Rectangle.new(x - allocation.x, y - allocation.y, 1, 1) cal_popover = create_popover(calendar, CustomEntry.new, :bottom) cal_popover.pointing_to = rect cal_popover.show end end widget end end class CustomEntry < Gtk::Entry attr_accessor :popover_icon_pos def initialize super end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/popover.ui000066400000000000000000000063041511343406000241100ustar00rootroot00000000000000 Item 1 Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Item 8 Item 9 Item 10 1 vertical 6 1 1 edit-find edit-clear 1 1 in 100 1 1 1 liststore1 0 0 2 0 1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/printing.rb000066400000000000000000000074571511343406000242500ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Printing/Printing GtkPrintOperation offers a simple API to support printing in a cross-platform way. =end class PrintingDemo HEADER_HEIGHT = 10 * 72 / 25.4 HEADER_GAP = 3 * 72 / 25.4 def initialize(main_window) @print_operation = Gtk::PrintOperation.new @main_window = main_window @resource_name = File.expand_path(__FILE__) @font_size = 12.0 @num_pages = 0 @lines_per_page = 0 @lines = [] @print_operation.signal_connect "begin-print" do |operation, context| configure_pagination(operation, context) end @print_operation.signal_connect "draw-page" do |_oper, context, page_nr| cr = initialize_cairo_context(context) layout = initialize_pango_layout_title(context) cr.move_to((@width - @text_width) / 2, (HEADER_HEIGHT - @text_height) / 2) cr.show_pango_layout(layout) initialize_pango_layout_page_nb(layout, page_nr) cr.move_to(@width - @text_width - 4, (HEADER_HEIGHT - @text_height) / 2) cr.show_pango_layout(layout) initialize_pango_layout_page_content(context, cr, page_nr) end @print_operation.signal_connect "end-print" do puts "End of print" end @print_operation.use_full_page = false @print_operation.unit = :points @print_operation.embed_page_setup = true settings = Gtk::PrintSettings.new settings.set(:ouput_basename, "gtk-demo") @print_operation.print_settings = settings end def run begin @print_operation.run(:print_dialog, @main_window) rescue => error dialog = Gtk::MessageDialog.new(:parent => main_window, :flags => :destroy_with_parent, :type => :error, :buttons => :close, :message => error.message) dialog.signal_connect "response" do dialog.destroy end dialog.show end nil end private def configure_pagination(operation, context) height = context.height - HEADER_HEIGHT - HEADER_GAP @lines_per_page = (height / @font_size).floor File.open(@resource_name, "r") do |file| file.each_line do |line| @lines << line end end @num_pages = @lines.size / (@lines_per_page + 1) operation.n_pages = @num_pages end def initialize_cairo_context(context) cr = context.cairo_context @width = context.width cr.rectangle(0, 0, @width, HEADER_HEIGHT) cr.set_source_rgb(0.8, 0.8, 0.8) cr.fill_preserve cr.set_source_rgb(0, 0, 0) cr.line_width = 1 cr.stroke cr end def initialize_pango_layout_title(context) layout = context.create_pango_layout desc = Pango::FontDescription.new("sans 14") layout.font_description = desc layout.text = @resource_name @text_width, @text_height = layout.pixel_size if @text_width > @width layout.width = @width layout.ellipsize = :start @text_width, @text_height = layout.pixel_size end layout end def initialize_pango_layout_page_nb(layout, page_nr) layout.text = "#{page_nr + 1}/#{@num_pages}" layout.width = -1 @text_width, @text_height = layout.pixel_size end def initialize_pango_layout_page_content(context, cr, page_nr) layout = context.create_pango_layout desc = Pango::FontDescription.new("monospace") desc.size = @font_size * Pango::SCALE layout.font_description = desc cr.move_to(0, HEADER_HEIGHT + HEADER_GAP) start_line = page_nr * @lines_per_page @lines[start_line, @lines_per_page].each do |line| layout.text = line cr.show_pango_layout(layout) cr.rel_move_to(0, @font_size) end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/progress_cursor.png000066400000000000000000000035271511343406000260320ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±4IDATX…í–oHTkÇ?sfægÆqªM³¹™xË1–„MÚ dÛþPZv‘ºÁ ,—¬íQ°AûFŠu_¬A½ j©µ´½)4R*§6WŒnïD--õ:Î0þkÎ9Ïo_Ì8v[½Ú›Øû…sfÎyæùü¾çùýžþ¯™åއ׀ö¥\]]]û‰Ä`CCÃïÿ—†p?þü˜ˆH<ÿñôéÓë¿4„ÑÒÒrRD¤««ËŽÅbƒÇ_ø¾D ¼¼\zzz¬h4úîðáÿùRi€’’Ù¶m›ô÷÷[ÃÃý{öìùõGŽŸ‰yiÎL&&&èíí¥¶¶Öišfðüù󯨨øð.À ©ïžÔµ;uo rV¹æǶmº»»9pà€³±±± ±±ñû]»v}WZZ*ÕÕÕ[-Z´J×õìÉÉÉøØØX_[[ÛÃÚÚÚ£À$`2×\+ý /^,Á`P ¤¨¨H*++%‰Øñx<&"j||Ünoo·šššÔ³gÏìwïÞY""Ñh´çÆÇ€¯ï|ܘÀçóÉÂ… eÉ’%’——'+W®”ªª*yõꕜàîÝ»ÄãqíòåËëoß¾}¬ªªêo€ | µ&昒iš8N ÃÀ4Meee¬Y³·ÛMFFÙÙÙäææ²ÿ~êêêxûö->¤±±ÑQ]]ý‡’’’{q’‹Ò‚Ïl(YYYضiš”––’““COOO:†††ˆF£ƒA®]»†®ë˜¦É… 0MÓ8uêÔ·À¢TâŽÏrÀáp`–e‘••…a¼ÿž>ÐÙÙÉðð0Á`C‡‘——DzeË8wî'Nœ ‰ÐÚÚêX»vío_@y; ë:J),ËÂçó‰D¢¥¥…®®.b±¯_¿æìÙ³x<Ün76lÀ²,lÛ¦½½Ý‘““óà£-~Þhš–^ˆ‘H„‰‰ FFF~òÜÐбX ¿ßŸ388ˆ×ëõ’lã:Ÿû ”RéˆÅb¸\.‰Dìceff¤ËT)…ßï'‘H$˜nÑÉÄæ `Y"‚ˆ0::Jee%?æÌ™3hÚôßìØ±ƒÂÂB^¼x‘³bÅ FFF¢$W¿=ó,ÓJwB’õ*555²eË ’‘‘!Ož<‘)µµµI}}½Ü¼ySLÓ¥””••Iff¦dggKww·}ëÖ­f Èe÷pðàAQJɽ{÷$ˆÇã‘M›6I$‘ÙTWW'†aˆßï—#GŽˆRJUTTüX,˜Ëý4ÀÑ£GE)%=úAD¤¦¦F|>Ÿèº.¡PHîܹ#ãããé‰[[[eûöíâr¹ÄãñȪU«¤¯¯Ïnnnþ7P ‘¬‚ŸÝ˜ÒJ)¹råÊàO÷ïß:::ªvîÜ)G\.—âóù$??_€ât:Å0 …BÒÑÑa D–/_þg`==—ýi¥”\½zõÀ`cffæ·ápø¹eYª¡¡ArssE×uq¹\ât:ÅétŠÛí¯×+µµµÒßßo DÖ­[÷WààëO³ŸÍ=ŒD"¿*//ÿ'Ð üHòd\xéÒ¥}{÷î­4MSojjr„ÃaÇÀÀ ,  ±uëV•ŸŸïhnn~¹oß¾ïûúú^¯™a7œM®Í›7_+Hîån’M¤ø}AAÁÑ‹/Þ~ùòeW4³mÛ›ìíí¼~ýúã7žþlB|æyÀA²[é$köCŠzê÷,M}ú™în&O9öždß!y4›*ë9¦î9fäHeb™©ð¤"0IÒê9Ï„ó>£Í2NKÁhL×µú$þ+ëÿ)ý9cSÄwÀ²KIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/reset.css000066400000000000000000000005601511343406000237110ustar00rootroot00000000000000/* @import this colorsheet to get the default values for every property. * This is useful when writing special CSS tests that should not be * inluenced by themes - not even the default ones. * Keep in mind that the output will be very ugly and not look like * anything GTK. * Also, when adding new style properties, please add them here. */ * { all: unset; } ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/revealer.rb000066400000000000000000000024041511343406000242060ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Revealer GtkRevealer is a container that animates showing and hiding of its sole child with nice transitions. =end class RevealerDemo def initialize(main_window) @builder = Gtk::Builder.new(:resource => "/revealer/revealer.ui") @builder.connect_signals {} @timeout = nil @count = 0 @window = @builder["window"] @window.screen = main_window.screen @window.signal_connect "destroy" do if @timeout GLib::Source.remove(@timeout) @timeout = nil end end end def run if !@window.visible? add_timeout @window.show_all else @window.destroy end @window end private def add_timeout @timeout = GLib::Timeout.add(690) do name = "revealer#{@count}" revealer = @builder[name] revealer.reveal_child = true revealer.signal_connect "notify::child-revealed" do |widget| if widget.mapped? revealed = widget.child_revealed? widget.reveal_child = !revealed end end @count += 1 if @count >= 9 @timeout = nil false else true end end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/revealer.ui000066400000000000000000000153761511343406000242340ustar00rootroot00000000000000 300 300 Revealer 1 center center 1 2000 crossfade 1 face-cool-symbolic 6 2 2 1 2000 slide-up 1 face-cool-symbolic 6 2 1 1 2000 slide-right 1 face-cool-symbolic 6 3 2 1 2000 1 face-cool-symbolic 6 2 3 1 2000 slide-left 1 face-cool-symbolic 6 1 2 1 2000 slide-up 1 face-cool-symbolic 6 2 0 1 2000 slide-right 1 face-cool-symbolic 6 4 2 1 2000 1 face-cool-symbolic 6 2 4 1 2000 slide-left 1 face-cool-symbolic 6 0 2 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/rotated_text.rb000066400000000000000000000106371511343406000251160ustar00rootroot00000000000000# Copyright (c) 2016-2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Pango/Rotated 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 class RotatedTextDemo HEART = "♥" RADIUS = 150 N_WORDS = 5 FONT = "Serif 18" TEXT = "I ♥ GTK+" def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Rotated Text" @window.set_default_size(4 * RADIUS, 2 * RADIUS) box = Gtk::Box.new(:horizontal, 0) box.homogeneous = true @window.add(box) # Add adrawing area drawing_area = Gtk::DrawingArea.new box.add(drawing_area) drawing_area.style_context.add_class("view") drawing_area.signal_connect "draw" do |widget, cr| translate_and_scale(widget, cr) add_gradient(cr) layout = initialize_da_pango_layout(widget) draw_the_rotated_texts(cr, layout) 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 label.attributes = create_fancy_attr_list_for_layout(layout) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def fancy_shape_renderer(cr, attr, do_path) x, y = cr.current_point cr.translate(x, y) rect = attr.ink_rect cr.scale(rect.width / Pango::SCALE, 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 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 = Pango::Rectangle.new(0, -ascent, ascent, ascent) 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 def translate_and_scale(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) end def add_gradient(cr) # 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) end def initialize_da_pango_layout(widget) # 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 # 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 attrs = create_fancy_attr_list_for_layout(layout) layout.attributes = attrs layout end def draw_the_rotated_texts(cr, layout) # 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 end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/row_resize_cursor.png000066400000000000000000000026031511343406000263500ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsnnÌÄ^tEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±`IDATX…Í–]H[gÇÿçÍ9‰mÜâY0ócV¢"¢!*plÝŠ¤ë•FpÖK/:§v°Å«y»~ÜÍÝìÆ›€°´(”¶¡W ­^ -¦‹‰æ“!±ÉòqÞgù¨I«VÛ=ðòrržçü~É›ó¼/p¼°s$,ûÙk €¸»»ûC*•ŠÎÏÏ_P@|1Ï9§••Çã7nÜðÎiKÄiÎ9“,Ë´°°“¸|š9¸sNÔÐÐ@­­­TSSC‹‹‹<ǯ_¿>r9øwœsšœœ¤úúzª««#½^O×®]ûâ$%rðo‰ˆìv; ªªª"Q‰1F†ª««©¶¶–îß¿Ïc±Ø‰IT@àkÎ9ÙívÒétTQQAŒ1¢(Ree% r¹\ÊÞÞÞ³™™ë«HT¡PÈ–ƒ«ÕjR©T$B<7c$Š"étºb ù ‰rf,˲üS0Ä­[· nÎÎÎâáÇùë±±1tuu寵Z-†‡‡‹ÅžÝ¼ysÔn·»D(‡p»Ýïëõú#‘ˆ.V&“I51"zzzÚ†††àp8òù‡.\Ø[[[ó3Ƹ Äã’$%øFFF¾Y]]ýÀ¿Å,±”@SSÓ6 Ȭ£™v«!¢_KÕ¬¯¯o›Íæ_ìHàRþÉΪRu%²ᬱˆç½þ­2ùE1 À`À.žÿ?Òb’GHØËæ‚ЕgÁAd¾õþõæY™C äìy‘@ºœÀ>P™_¿$7ÿÐ7o\ ÜE3‘}™°P&Šæƒü~£¢(µ‘HDJ$ E<Oe9²V«=;55eêîî>c4£*•Š@£Ñðüe³Ù"(шJÆòòrs2™tS™°Z­mØáp”K¥­­­ßdY>àÌ¡àÙ8{õêUs$Ùöù|ŠÉd"Y–óC­VhµÚ‚û£££¤( _ZZú]£Ñ\Ð @{ €Áb±X€ßãñ(F£±ä&T<, % îr¹I’tÀj²Ï~ñâEJ$üÞ½{%Ið1€÷Tà˜[²@M__ßg^¯wÓçó)---%á”J¥øÝ»w3Æl¯ /–x×l6êõz=Á`Pioo/€R*•âwîÜyÄû Àù“€¿ ÑÛÛÛ¿¹¹ù4 )&“‰Õj¥t:Íoß¾½¼^ÌžèÁT ÀÐÙÙù‰ÇãÙ…BÊôô4¥Óir:øÀGêN¾_B`èèè8ïv»Ÿ9Î?\9mø mmmÎÍÍý à22¯Ú±àÇ1iáoÐ#Ó÷#Èœ’(³ïŸ¤@®N…ç§Ýtv þ¿ˆÿŒ£KCRÓôáIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/ruby-gnome2-logo.png000066400000000000000000000160401511343406000256670ustar00rootroot00000000000000‰PNG  IHDRPPŽò­bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÓ (1ˆ‰Ù­IDATxœíœwXT×¾÷¿{Ïf 0ÃÒ)6@ÔXcIbìõäÄTSŽÇ£Ñ“¨)7on<&1õĘfÔô¨IŒI°`b‰%ìXPÚБ†iLßSöº ÚPLÎû¾÷û<ë™™½WýÌo•½ÊþWÿ«?SÔŸ?ZÙ/mà×\¸, 9| YÓ«))‹vÙX¿Ð]@dD®ªàFQÆ#ËÌñK–rÞÄ÷ÿ ÀÂ/wù^øüãéÆººeúªêIv“I "™ ¬ÑÎáøÊƒÊdƒm}äØÏ›)‰ÌÕ]¼ÿÏTçåòü}ÕlMIÉ“6}cš|Èqìí·cðôé&%‹Á9]pè´(ÉÌÄÕ;¡*/w'ysèÂ…'¾ô2ÛUüÿ‘˲2y7öfJŠúÙ—bxa` ?e’éŽM¯4R™Wq£??ý¬¼â×ìuÚÒÒ•"¿ŒGÅЄ$2Eƒ¸}¢ùƒÍ™Zµ µJ¥.jì¨iÿõrWé0}+jÿе¸¾çûð¬5ëþîr8îdÆd»Ù,a ]ÑOG®Yõ†5Ĩ½ê Äïx8¦îúõ÷´%esâ320yýz§§œ*U«DI›ïqq˜°bv¯]+åûúMð@b0+kÆ ’H~øaÐV+\Vk§àÚý¶Z¬Éäß]¾ÿc6®sš-‰3×­GxL  8–È%HƒƒQýÆ4õµü-Ìžq4æŸ÷ùféãOhJJg'Ð4RGe±Àe±t¯–ÊJ€00@ß]¾ÿ#f¿ôâˆã/½:cȈó÷›› Žeᬨ€åôi8ÊËábY„BXüÀúò"tpߪ§g¨‹Šž 0R&ƒ@*W[ë¾éQU9κ:pZ-àt‚–ËÁ<`¨¯_ø…„”w—÷[°<ëKúÜ_ªÍË‹€ðÔÔÒô¬Œ_¼¤Í_NŒZl;!ƒ¢(ITHìyy V+ l—/ƒX­ ðÐN'(aÐX]#ôL¯ôÇÝ¢ÌO­¦¬6q‘P°,\õõnÎl†«¾Îòr¸T*³ÄåêQ<œÉɤ¥¡Z¡Íã9mºÆ Ý•ó–Ìya£Ï¯¯m¿§>?ƒ­±q Pa¶ú† xôæ©cç"'OoØ PÐ6}ã`ÀGX[ ‡V W]\ÕÕ Nwáp„€pÄ* ·z¦™·wºÍÐ82€ ÌfpÕÕŸN«…«¦.• œÑØg›1œËN¡€E,†òæMˆåò‘LúçXàõ?¬l(.z9<5Í7eî\ØT*œÛ±#ùúžïvhŠ‹çhɘQ©¤þ§Tùùpr`·ƒ×*> €€ €ÃbÑ„¦õL³æÒå;aµ @€NöÈ€+Ð&Þv²ÙP¯P Þj…4"¹:áÂŽOVËcb}|ø!Dp ð À¡W^I¡™ àƒ–.!„P6xh?º§°,BBªdуížéR4}»/!TZAj²`oåp]§-XÒxGHRF·rtRðBe'N-†‹‹Ê¸÷^ðÌfØòóa½xaþþŒŒ¤ŠŠçXå-é†D q™ÔJÜ,™N\ÜÏ á#Gäx¤ÍÏûè**Sýø5ª3ÇëÄÑpW‹z€“ÅÅ}=î™м)o¿[ !Ü4™Œ{AL‡ÃxàÀq@ߨר¬Ѐ$-™|”X­54:,N§§Rpƒ­À÷óÓÛOx¦©Õ4F:,?Y ¤p #•ÆLš° ù^…ëw 4ÕªB!h¥¦;aÍÌÏjeá£RfßÊó´“þЃ٠éÆrtl}*¾rù¯ƒgÜ©òL³>ÿjнõuæX§8Å"mTƨu3ß|½ÌÛòö;@»ÙÀÕÖÂüé§°ÿöxv{ ?·º¸¨M>w‰B2 ôš €í«—€‰¦]ÂÀ€£‰‹în×›Õj¡çðì.¨§i—|Èà-±Ó&÷v¸¢£ò­ ØÚZ0Ng <|„žU¯´#Nìò þÁJQDßÛ*îÞ÷F,RbÕéà´vpüà®êÞ¶y<¸ÛÔ³ išóŠØ—p÷Ô·Æ=ý|—ÓWžêw€4÷«€nhÍŽ Bxl£ï.iÖÝ{EÁòœ³pwÍàÏP3ŒcÀ°aï }ôñvÕüCÃt`C{hYžÀ/ y<—$:r×ÒŸx`ʦw,=.oOžqÇŒÐäd„  §²\£NÁ øÇ«½|å¾¢ý²à~\Å›^Vé+*7”hu#X­òñp÷¦VŠ")É'B¦Œk÷(ÖW¥¯~Þv`ÙCŠ~:,ËU7L/wº|hzŠ"œO£Hx-*9ùß³þýúá ´1,¾ÿ¡_Òí ¦ºDÈóñ‰K$àÊÊ`ih€íÂØKJÀž9ƒP vGÚùíŸDÈJ"Cíñã9NûxÕÙsfa (ö“‡~Õ/9ï@s>û¢$ç®{r¶l~Øn1ßEfüYÛ•„™32‡-œ9üö;X¤é×4»hªW1'v¨Õ0~ó Ø¬,ƒ”Ë>€p7õúpŽp#ЦN%ÊSÇößöIž­Q?Ó¬VKcÆÛ;~b923ûµ­•|ÿ}Æúœ3ï>¸¸€ „ÁŽ”s¹ž Ž{¢n%ÆY]vûÍ†Š hÊÊ`±´Ì¥QBЄP Hðuë°áîy¿RïÎ]ÞÞâUÆL¥Õ”®ªH ¼tÑ×T§bL >æúzƬQóÀ ¾ ŠdNL° ‰·…&Å[SÆpp?¡Ýryµ.üã}÷,ººëÛ½CdÀÝ«6tØ€>àÈZeÝ]}ÉLõñÂú¼¼ôÒc'“«ÎœšŠæ‹Åá„@L\.‘Ëés‡Í Mó\ŒP §Fçr:µœÝQš4{vvâ¬YÙƒ-Rö%?ÞÈ+€äòyzó¬y¿Øjk'O  €6V¸ €á]yA×Ú“ªróÔ1~ñCIùûöOàñù³´eå“V«¯oh(¤11ð•Ë!’ÉÀ—Já‘T ša@óx „ã`ih€±¶¶5LU•¨Í˃Y«ÏÇÇ.8ð°xض©ëŸ<9kþ-±H¯w&XöPê3¿õÑ7ž@Žß~ ‘ÇË{¡¨!•Šïz?‰îÚ%êòîoC*Oýz—ºD±Ìa± K˜ÈŒ ÄŽ‡À!C ð÷#‚@3î–†îÅ!BÜ?Û ˆÃ»Á³ªšK‘·gn^½ ‹ÑhðÛ0ó® 3Þÿ¨ÓÁxoå5@bÔbǤé÷7äào³ùO ÷TÓg|cc÷­ÎË]ÐÙz­òäQúÆ÷ûåÊk׫ îg †1ôð%K?>BRR@ûø¸·9Ò§iùÝÞµëvËBuå ÎmÛ†¢cÇ\b¹|ïÄgÖ®ÊX³VÝgj­Ô£½1æ²"Þž–-Q^¾²X,’¸~ ã4eòßî;úËç…»ôæfñµÌï–5>ck4DÅŒ‡Q=†¸©ÓÀøŠ=¬ªiWY3œæ{Ý\C«k¤5H§Ùo½… »ws±±Ûþ‘Ÿÿ^pêT=Þ\tjãžúF~jù©_×rGES”X.ÿ,aúïÞñÞ{mÖj Êë¼CËŸ¯Ì½üœ©¾~JDr² ã±Ç0pÆ üüZYº„€Î z†ë亓eqüÍ7q-3Ó6ûíÍIiO¬ªè®öêõî¬Òûøe'NÆ0|›6¡là_æ·¬à£?=ý\ÀÍsçŸÐ(JV0 žºd Rx¾ááMž:‡×ÆÊ:±¶Žªm‡á›~×âÛ•+ž6rõ²Ó9ïõ¶ÜžêõšÈ 9óìhÙäóV›{Y«Ö†Už?³¹¡ ðžè”Lzê)„ë®RÍ{Tº‚à ¢íîuáO,AŒº«y‰ú›åt`ä@¯v v§~_Túþž…C‹Žüô‘¥A}ÛèY³0fõje2æý)}¬¢†ïÄ_ë?ˆfYN‰$BsñŠl éú `}Îê쎆þ¸o78.qü}÷Ñ©÷ÞëÞÚÊê´·¢.ªr»êÜÚ_gquäÏfÅq FlÑ©û­ÜýÑÙ­ï%ÈÚIllòÔ+x×] hºÅò:µ(k]µ‹ÝZg'×!`aÒëÁR–2¼W³Ï©_îýËÂÅ‘c_:¦¡³Ö¬ÁÀ‰›­uu[å<ýxÒ[à êü|4êtˆÌuU>zL·´ÞªÏÕ—r}¾½é³:}ú˜»ïFì¨Q Íð€îÛ0”gõëJO 7ûuX­¸vú4|D"㈖~‡ ûZìõ `Á®Ï©ƒO®™­Q”,KHà¸ë.›Í}³›F½'PÚ…óróSrö,”••D:xð®ŒÕOU÷¥ÌžêÀüÌýRBñ_±X8völðZµy=ÒƒkÝZaÓ5Žã ®©Aö‰à\8iâ›ÈÏGªO­ãBS½*müôé 17 º©RTÖØÄæfòˆ¯³ðšúz?|.š®š²nÆòGËðѶ¾¹z 0ï‹Oü^÷ì±HD' îî4€­…juô!p8@X„eÝ‚HŠÏoÓŽ¶N£¡¾§³³¡5™Ì'O|~ìÊU'¨Ôѽ'Õ‰z ðÜ{[“6[zbJ <Hë±^=Ç{í¬¨éz;xV+œeepTVÂ¥R, Ph™ ´4ð""ÚÄCA]]Nž9£Ýn4mêÚ¡óç}>xá¢n÷úõF½HÀ¥r,ª ž·Þ6F+ëiåX,°—”À‘Ÿ8nè-‰lv6·ÝZ*uïbu:¡P*‘sù2ÀTÇNšðô°Å‹ö |y¿<¶u¤^¤hÞ(†Ô×ÄbiÏ=ßÞ¶Ýj ò¸ÞÆ N8kká,.§Óâº(»ÅgI ø))h´Zq¥¬ ¥’d²+!ɉk¦nx!'bâÔ[è@›NÅãó!Ü=/ÐκڵƒM~Hþ(œÑgq1\uuÇu¸Õ×SœJ…›¾¾È©ª‚ÞjuDGŒ¿cúS3ÿýzù­Z‰k­^´è´r‘hOëë¤çmÝqxVYb³ÁYUWM ˆËÕí[ó}€<«ÕùùT ¼}ò‹s¿ütw@D¬Ûwô¶h=R¯òxŒƒ8 K ÝͲ´ét‚Óë᪮n‰§3xÍ× ÜÓ(EŠ8…B]PLT–|HÂKÉsç•DÄޒ΢3õ  À_o«QÂe±€ñ€GuÇ6¸º:pz½×ÕÕ î BZšvú…†^ÿêôW6Ž˜0…Åþ¬Þ§×ê5@‘LVe.¯€Ù`@צsðì8ÚTk–§×ƒÓé:ç) n«k€{¸€P*­ŒNJ|kâúµÇ/XlÄ)½-FŸÕûa çºêp¹ ×hàß´¾áÙ ·é,“ ÄdrŸMë"îÖPòà¶<â+VEDî OO}Ú kË’GßÒÖõ U×XHñù–ƒAM5Ù³ä8Àår?=X,€ÓÙm×,îN"€Ž¦í’ˆðœ¤ÄCg/ȱz¥_ÛÛ¬÷«z½¨”ýòƘìÍ[úk4Cgòùàñù è&»j§Óíš«°—‰»\GÓQq??­TÔ«3Þxeë 9 ûe¾?Õk Lž0¾ú܇[s€¡»þöŽ·üyóµöãÂï;ç}rÓ¼9æÊ 9 ÿôêÚ‘úôÒ‰ï.˜›Ÿ¹ï‡tŽã¥µŠÌÛqœ§œ.È£i—xÀ€ŸMŸúļ/wVx›bÔByõ¿ìØ/þe'NIL*cÕé†Ïçb&Œ3 œ2Ù<òñÝ¢î‰úð›ÙwË•¹WN •µÉ3øö1¡ÇH¢"ÄMžôؼ»½žü,ܹ+ìô–Í‹5Š’Ñ‚ÿ8‡Åí²ÛÅ.»]HÑ´SPCóx7E² ½ÿ¹ú«ä‡iw`§7ê@KA ýÅâyëT›nã8Þ/"ìì¾@V&­»zùØÉ^ëv#ÉÓR™¯¬S›—·®¡ p¡e`À°a†…Á7&™ ¬Õ ›Á€ú‹¡8z!ÉI_ùûßžH_ýdc‹ÜN}šP'Åsç·¼ñé‰7=V ×Ž éÀŸ7PkÆ÷¶8PÒí±b,¡·›ôOmyÅZ‘¿xÆC!eÑ"$%Á7(<__P Óf Ï66"û¥—pvëG‹³ßy7@Ÿ7J÷y§úè5O«eqß32Œ½¿oyk}>ƒêÀyÞ¯mHdÙ±Œ>ßq·ÝJ?þ1ASZú¼<<<ü¯Ÿヌ¨É“áì>/l2ÓéÀiµà4pj5|XI“&A ŠÉྖè§eÍÑËÝ}ô…¹¢RMŠ–C…¼¯ÒV„#Ny|’Æ›4Gg¸X»dÂüù W¢ø}ìéùÙê»%7N‹‹µ_ÚÀ~8|éRMÞw™›ËOÊ8ïp&Ã}>®3u5@5Eù^úbûHbÔén*JS\ BxBÀ)mîuuîð<ªùI‰e¡ùòK8—E«ièC‘[Ô/)‰ —=pL6àÇ¢ªê¿FHDûƒÓ])À5‡Ã¯êìù'Nnz=MgN:’¡²z?e”œáÍkl)-œNšp/‚++ŒF€a@I¥ ‡ îÆ 4TV‚'ñÓESC?õ½ðý©ËÛÞx#HVó6@Jb𛜠û² ÛÓÒ6^ÙþQ§£¢ n½30æûw||Hí‚Äöè£Ä’žNÌ1휥əò>@^õó»vã«OCû£ÌýzÜ5uùªy|üJ‹€¯;÷¼]GHk‡¦OÀ8ƒÔ]¹ò\öÛ›?ÈZþHTGé”9iUk§ ‰àwó&¸ŸrsA±l§i@-Ü'5ƒâ;²× [«ßÏ ß½éÕ¬ÐaCßÔ0Œí7¸O zÓ SÄfHà8F_¬¸ïêîo}5mò½ûî_Vuø ©.£¯^¡ÌÍ}Þa4JSXJ©l™Œí, '€\Œ@`Ëeßutp»7º%ï<õܳ’üýû·ÔßÈ_– `ܧսí‘Y¸Ï ŸÀÒçzÍnµ\uZ,¬H&K³¨5#‡¸\Ì,Šj™Ìí(žÖ*p€oLô®q«Vþmôúgúe‡Ö-{ãñõ+„…Y'w¨ ‹îMæ8Þtx±u¦,p[M%ÜoÕàà"Ÿ M'້pWÝïØ• ?ù(#aÑ_ûíÎ-{wÖ”¥Ël•yÓfó)¬¬Zäp¹˜éèøIè¬/€ FÁm•îá‘/:n{:ŠÃà(«P¨šüTÂn!À¦mÚogÏYÈD†â‚Âe,Ç1ÓÑöN—q4}ú¢ó‰Š®â0Â}:]IÓÎàøøç|¼í{$ó¾^¨ËWIõ‡ö›Ÿ_³æˆËÎZªjj&„5Ýﮇz™ªhÚ6røkþ¹æµØ;fü!o‰ ¿ûÊçó‰ã¾)—_} ßä&@qvà\Ý8®gH.@¶ä‘H»=uä“ß}Kt«ÊuË:‘ŽDŒZjÿŠUÉ¥ÇOn074Ìôs8ÄäÃ]EûR\p¯¡ä(¦(Ž (’ø¯ùÛ>Ù+‘Ò³·õ@(ÀfãiúëÅÕåå=cPÖ¦K `@7a=ÅÁÝË^‚{¨ÂòxyBÂçÉ æ¾vû&ï_áÔ[ý)À’¯ Î|úa€ZQ2³*çìßX½~ åpe’àÐäøø½×åà~ÂÑÁ½F\  %DÒÀ‘£3Þ ’˜}ûóÏ8þˆ½1Àfi¯\Gþ¾ï‚GŽÜf7™çª‹“ !a4Ëú‰¡DpøMŸV¸ŸnL™fU@TTŽ8(hëÐùóó2Ö¯7ü‘ùÿÓ¶ÉÓ¢àÚOÁ¶o­V'ø‡…¥²&ã0»Ñ$µLRË }ƒåJ‘TZãr:.ý%§RïàJÚÔ+©a³½Õúcâ¥òzÉÁÚIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/s_resize_cursor.png000066400000000000000000000022701511343406000260030ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±•IDATX…í—AH#WÇ3Ék˜¦ØÚbÑ¢ vŃKíÁ"ˆí¡R -ô`×ŃÐk…–â¡·Rz*öVì¥9-(è¡j$!K#˜R©…`éb'&jgfß{=L"ÑMÜ×Biÿðf&ï}¿yïûÞ÷ ü×¥Õ;.“ɘáp¸Cáôè‘–ËåþèîîþESOó’ó£££;ŽãXªLRJµ¿¿ÿð`PÿË=Qúééé—étÚÅb*ªh4ªæææ”ã8®išE_-“ùëp]÷Ùl6«e2™ó›©T Ã0üÁ`°#ŸÏÇÔ°z!ªŽB„€FjÜ‚z4¥TÕÉ•R¾â¼·ð$]+ønàZúàª4Ô.YI>)åUû¬á%+I•ý–¬2Àááa0‰|.¥|^¡—G½”R3 £¯š÷µµµ‰H$ò¦iš§>ŸO–?;88ø¶««ë{À¦xFThiiù+‘H|Ó××÷CSS“¹¼¼ÌÉÉÉ…ÿ¤R© ×Ùl–x<ðjùýþþ~ÚÛÛÙÝÝ]êííÍ!àOÀ©öàÅFx~~þ­|>¼¹¹)LÓ,_ºšlllLÙ¶-766’†aÜÞ^¢†Z¡ ufff"—Ëå¯ Qr¾ººúÀï÷¼t&5¿<´MOOß³,«°µµUDÉùÊÊÊO~¿ÿcà]àÆ‹»š«sˆ©©©,ËÊ'  …þç׆¸äüཛ8׊Î}ÅÁAà•ÉÉÉ{–eå···/@\rþ)ð>Ї×ŠóîJ) ¥”¦”Ò„úÙÙY@×õhsss4™LÊ‘‘}hhˆx<®¹³³ósccãi8>ƒg@ÀÕ4M !&“ɯ†‡‡ॠ*–U­P(L444|½´´¤»®{å²¥Óib±†a\¹œ===¢µµõa(zø8Ã;Œ“nYÖg{{{65¦\-6::ª”R*‹½ ´R<…+å£nÛ¶ÿª¦£)å•Çq^Ä‹'ªÔ‚\.÷[[[›oaaá|àMÕÙÙ© …‚“Íf%eÁX @·¸¸xwppð5×u¤”7.Û¶m;³³³?º®{Œ„*g4/À xitÓ-xò/À^AÕô"Do¿|O@â•᧘ŠÕ&-5!:×èpk„¸õO·—þáfkôÄaIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/scale.rb000066400000000000000000000011631511343406000234710ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Scale GtkScale is a way to select a value from a range. Scales can have marks to help pick special values, and they can also restrict the values that can be chosen. =end class ScaleDemo def initialize(main_window) builder = Gtk::Builder.new(:resource => "/scale/scale.ui") builder.connect_signals {} @window = builder["window1"] @window.screen = main_window.screen end def run if !@window.visible? @window.show_all else @window.destroy end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/scale.ui000066400000000000000000000112541511343406000235050ustar00rootroot00000000000000 4 2 0.1 1 4 2 0.1 1 4 2 0.1 1 Scales 1 10 10 20 1 Plain 0 0 0 1 1 200 0 adjustment1 1 1 0 1 Marks 0 0 1 1 1 200 0 adjustment2 1 1 1 1 Discrete 0 0 2 1 1 200 0 0 adjustment3 1 1 2 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/se_resize_cursor.png000066400000000000000000000024721511343406000261540ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±IDATX…í—MHcW†ßs«£IZ±U¬Ét*K[ ³KŠ”¸©-•‚´•øÓ"JA7J™J†R†nÐ"HCB t“.-ˆ«D̦PÔVQ'? ÔÄà5Æ$79÷ëÂØ‘NþÔ”.ÚÜË=ç¼Ïùøî9ßþ×]¬È> eÞ)OßkKÈ÷ÑëõV¥R©Ÿý~ÿ‡”žCahæõz+ð<[+(¶¿¿ÿr"‘ø5•JÉ’$I‡Ãà%ey&añx|  uPƒÁFQ»Ãá°! }l·Û딂`~¿ÿµx<¾RMMMät:y<O>þ€ê¿A°ÓÓÓ>Y–9‘ÕjýÆápŒ©T*@DDÔØØø>ufü³9PWWw‰D~Òh4‚^¯$“Itvv ;;;ʉ‰ ëÐÐЪÌx&Šb·J¥úÞl63‡Ãµ¢(>Ÿmççç÷¼ÍûRå^ñx~xxøÄårMpÎÓ³³³2cŒ.ffff³Ù”  ¾¾~ À›—ÙÂ@Îu:Ý—gÙf³‘Á`@¯× ‚ ¼ªÓé¾^XX†‡‡ÑͶ‡²À¿V«}¸¶¶›Íö.±ÅÅEìî½]èïïÇØØØÍ܉p" ÕjºÝîÇv»zzz›››ÅmÌó\…ˆ´µµ}~³Z­hnn¾•i±W!Î|>ß; o™L&lmm• [<£X,ö™B¡øÖh42£ÑX2s pX,T(ßýæ@þ°X,6¤P(榦¦ØôôtÉÍÜ`‰Dâs¥R9ÇcF£DT°É²|1˜1™1VÔï‘5ëëë•‘H$º½½ýÅÞÞÞÝãããZI’.ÏxQÎãT¾²²ò»Á`¸sS622’žŸŸÿƒs^_YY™¬©© ˲\(_.3FƒƒƒU---÷n —Ë5 T*犙à¶Ê¶*ÆÓ-//ËŒ1ܶÅb±k’$µ?”BY8çiFƒ®®®’µ¶¶B–e’$IFʺliié=Q#TB¥ÓiÙétþ`À}w€ì…¡€‹šï>€×¼ˆ"·ìº¬3öl8ÎÀ2tÕjñô>P €$€€0€8€œ ˘–#ÿ=àº2€€tæùßן÷a€,ΑIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/search_entry.rb000066400000000000000000000121601511343406000250670ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Entry/Search Entry GtkEntry allows to display icons and progress information. This demo shows how to use these features in a search entry. =end class SearchEntryDemo def initialize(main_window) @main_window = main_window initialize_window initialize_box initialize_entry initialize_menu @menu.attach_to_widget(@entry) initialize_notebook @window.signal_connect("destroy") { finish_search } end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_window @window = Gtk::Window.new(:toplevel) @window.screen = @main_window.screen @window.title = "Search Entry" end def initialize_box @vbox = Gtk::Box.new(:vertical, 5) @window.add(@vbox) @vbox.margin = 5 label = Gtk::Label.new("") label.markup = "Search entry demo" @vbox.pack_start(label, :expand => false, :fill => false, :padding => 0) @hbox = Gtk::Box.new(:horizontal, 10) @vbox.pack_start(@hbox, :expand => true, :fill => true, :padding => 0) end def initialize_entry # Create our entry @entry = Gtk::SearchEntry.new @hbox.pack_start(@entry, :expand => false, :fill => false, :padding => 0) # add accessible alternatives for icon functionality @entry.set_property("populate-all", true) @entry.signal_connect "populate-popup" do |widget, menu| item = Gtk::SeparatorMenuItem.new item.show menu.append(item) item = Gtk::MenuItem.new(:label => "C_lear", :use_underline => true) item.show item.signal_connect("activate") { widget.text = "" } menu.append(item) item.sensitive = !widget.text.empty? item = Gtk::MenuItem.new(:label => "Search by") item.show initialize_menu item.submenu = @menu menu.append(item) end end def initialize_notebook # Create the find and cancel buttons @notebook = Gtk::Notebook.new @notebook.show_tabs = false @notebook.show_border = false @hbox.pack_start(@notebook, :expand => false, :fill => false, :padding => 0) @search_progress_id = nil @finish_progress_id = nil find_button = Gtk::Button.new(:label => "Find") find_button.signal_connect("clicked") { start_search } @notebook.append_page(find_button) find_button.show cancel_button = Gtk::Button.new(:label => "Cancel") cancel_button.signal_connect "clicked" do if @finish_search_id GLib::Source.remove(@finish_search_id) @finish_search_id = nil end finish_search end @notebook.append_page(cancel_button) cancel_button.show @entry.set_icon_tooltip_text(:primary, <<-TOOLTIP) Search by name Click here to change the search type. TOOLTIP @entry.placeholder_text = "name" @entry.signal_connect "icon-press" do |_widget, position, event| @menu.popup(nil, nil, event.button, event.time) if position == :primary end @entry.signal_connect "activate" do start_search unless @search_progress_id end end def show_find_page @notebook.current_page = 0 end def show_cancel_page @notebook.current_page = 1 end def start_search show_cancel_page @search_progress_id = GLib::Timeout.add_seconds(1) do @search_progress_id = GLib::Timeout.add(100) do @entry.progress_pulse GLib::Source::CONTINUE end GLib::Source::REMOVE end @finish_search_id = GLib::Timeout.add_seconds(15) do finish_search end end def finish_search show_find_page if @search_progress_id GLib::Source.remove(@search_progress_id) @search_progress_id = nil @entry.progress_fraction = 0.0 end GLib::Source::REMOVE end def initialize_menu @menu = Gtk::Menu.new item = Gtk::MenuItem.new(:label => "Search by _name", :use_underline => true) item.signal_connect("activate") do @entry.set_icon_tooltip_text(:primary, <<-TOOLTIP) Search by name Click here to change the search type TOOLTIP @entry.placeholder_text = "name" end @menu.append(item) item = Gtk::MenuItem.new(:label => "Search by _description", :use_underline => true) item.signal_connect("activate") do @entry.set_icon_tooltip_text(:primary, <<-TOOLTIP) Search by description Click here to change the search type TOOLTIP @entry.placeholder_text = "description" end @menu.append(item) @menu.show_all item = Gtk::MenuItem.new(:label => "Search by _file", :use_underline => true) item.signal_connect("activate") do @entry.set_icon_tooltip_text(:primary, <<-TOOLTIP) Search by file Click here to change the search type TOOLTIP @entry.placeholder_text = "file" end @menu.append(item) @menu.show_all end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/search_entry2.rb000066400000000000000000000066761511343406000251700ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Entry/Delayed Search Entry GtkSearchEntry sets up GtkEntries ready for search. Search entries have their "changed" signal delayed and should be used when the searched operation is slow such as loads of entries to search, or online searches. =end class SearchEntry2Demo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.title = "Delayed Search Entry" @window.transient_for = main_window @window.resizable = true @window.set_size_request(200, -1) initialize_vbox @entry = Gtk::SearchEntry.new initialize_search_bar @vbox.pack_start(@searchbar, :expand => false, :fill => false, :padding => 0) # Hook the search bar to key presses @window.signal_connect("key-press-event") do |_widget, event| @searchbar.handle_event(event) end initialize_help_label initialize_toggle_button initialize_result_hbox initialize_signal_hbox end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_search_bar container = Gtk::Box.new(:horizontal, 10) container.halign = :center container.pack_start(@entry, :expand => false, :fill => false, :padding => 0) @searchbar = Gtk::SearchBar.new @searchbar.connect_entry(@entry) @searchbar.show_close_button = false @searchbar.add(container) end def initialize_vbox @vbox = Gtk::Box.new(:vertical, 0) @window.add(@vbox) end def initialize_help_label # Help label = Gtk::Label.new("Start Typing to search") @vbox.pack_start(label, :expand => true, :fill => true, :padding => 0) end def initialize_toggle_button # Toggle button button = Gtk::ToggleButton.new(:label => "Search") button.bind_property("active", @searchbar, "search-mode-enabled", :bidirectional) @vbox.pack_start(button, :expand => true, :fill => true, :padding => 0) end def initialize_result_hbox hbox = Gtk::Box.new(:horizontal, 10) @vbox.pack_start(hbox, :expand => true, :fill => true, :padding => 0) # Result label = Gtk::Label.new("Result:") label.xalign = 0.0 label.margin_start = 6 hbox.pack_start(label, :expand => true, :fill => true, :padding => 0) label = Gtk::Label.new("") hbox.pack_start(label, :expand => true, :fill => true, :padding => 0) @entry.signal_connect("search-changed") do |widget| puts "search changed: #{widget.text || ''}" label.text = widget.text || "" end @entry.signal_connect("changed") { puts "changed: #{label.text || ''}" } end def initialize_signal_hbox hbox = Gtk::Box.new(:horizontal, 10) @vbox.pack_start(hbox, :expand => true, :fill => true, :padding => 0) label = Gtk::Label.new("Signal:") label.xalign = 0.0 label.margin_start = 6 hbox.pack_start(label, :expand => true, :fill => true, :padding => 0) label = Gtk::Label.new("") hbox.pack_start(label, :expand => true, :fill => true, :padding => 0) @entry.signal_connect("search-changed") { label.text = "search-changed" } @entry.signal_connect("next-match") { label.text = "next-match" } @entry.signal_connect("previous-match") { label.text = "previous-match" } @entry.signal_connect("stop-search") { label.text = "stop-search" } end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/shortcuts-boxes.ui000066400000000000000000000145701511343406000255760ustar00rootroot00000000000000 1 1 shortcuts 12 1 Overview overview 1 F1 Help 1 <Ctrl>n Create a new box 1 <Ctrl>f Search 1 <Ctrl>k Keyboard shortcuts 1 <Ctrl>q Close Window/Quit Boxes 1 Box Creation and Properties wizard 1 ltr <Alt>Right Switch to the next page 1 ltr <Alt>Left Switch to the previous page 1 rtl <Alt>Left Switch to the next page 1 rtl <Alt>Right Switch to the previous page 1 Box Display display 1 Control_L+Alt_L Grab/Ungrab keyboard 1 ltr <Alt>Left Back to overview 1 rtl <Alt>Right Back to overview 1 <Ctrl>q Close window/Quit Boxes 1 F11 Fullscreen/Restore from fullscreen ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/shortcuts-builder.ui000066400000000000000000000617501511343406000261060ustar00rootroot00000000000000 1 1 editor Editor Shortcuts 1 General 1 Global Search <ctrl>period 1 Preferences <ctrl>comma 1 Command Bar <ctrl>Return 1 Terminal <ctrl><shift>t 1 Keyboard Shortcuts <ctrl><shift>question 1 Panels 1 Toggle left panel F9 1 Toggle right panel <shift>F9 1 Toggle bottom panel <ctrl>F9 1 Touchpad gestures 1 gesture-two-finger-swipe-right Switch to the next document 1 gesture-two-finger-swipe-left Switch to the previous document 1 Files 1 <ctrl>n Create new document 1 <ctrl>o Open a document 1 <ctrl>s Save the document 1 <ctrl>w Close the document 1 <ctrl><alt>Page_Down Switch to the next document 1 <ctrl><alt>Page_Up Switch to the previous document 1 Find and replace 1 <ctrl>f Find 1 <ctrl>g Find the next match 1 <ctrl><shift>g Find the previous match 1 <ctrl><shift>k Clear highlight 1 Copy and Paste 1 <ctrl>c Copy selected text to clipboard 1 <ctrl>x Cut selected text to clipboard 1 <ctrl>v Paste text from clipboard 1 Undo and Redo 1 <ctrl>z Undo previous command 1 <ctrl><shift>z Redo previous command 1 Editing 1 <ctrl><shift>a Increment number at cursor 1 <ctrl><shift>x Decrement number at cursor 1 <ctrl>j Join selected lines 1 <ctrl>space Show completion window 1 Insert Toggle overwrite 1 <ctrl><alt>i Reindent line 1 Navigation 1 <alt>n Move to next error in file 1 <alt>p Move to previous error in file 1 <shift><alt>Left Move to previous edit location 1 <shift><alt>Right Move to next edit location 1 <alt>period Jump to definition of symbol 1 <alt><shift>Up Move sectionport up within the file 1 <alt><shift>Down Move sectionport down within the file 1 <alt><shift>End Move sectionport to end of file 1 <alt><shift>Home Move sectionport to beginning of file 1 <ctrl>percent Move to matching bracket 1 Selections 1 <ctrl>a Select all 1 <ctrl>backslash Unselect all 1 16 terminal Terminal Shortcuts 1 General 1 Global Search <ctrl>period 1 Preferences <ctrl>comma 1 Command Bar <ctrl>Return 1 Terminal <ctrl><shift>t 1 Keyboard Shortcuts <ctrl><shift>question 1 Copy and Paste 1 <ctrl><shift>c Copy selected text to clipboard 1 <ctrl><shift>v Paste text from clipboard 1 Switching 1 <alt>1...9 Switch to n-th tab 1 'Special' combinations 1 t+t You want tea ? 1 <shift><ctrl> Shift Control 1 <ctrl>&<ctrl> Control Control 1 Control_L&Control_R Left and right control 1 All gestures 1 gesture-pinch A stock pinch gesture 1 gesture-stretch A stock stretch gesture 1 gesture-rotate-clockwise A stock rotation gesture 1 gesture-rotate-counterclockwise A stock rotation gesture 1 gesture-two-finger-swipe-left A stock swipe gesture 1 gesture-two-finger-swipe-right A stock swipe gesture 1 gesture-swipe-left A stock swipe gesture 1 gesture-swipe-right A stock swipe gesture ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/shortcuts-clocks.ui000066400000000000000000000160011511343406000257230ustar00rootroot00000000000000 1 1 shortcuts 10 1 General 1 <ctrl>Page_Down Go to the next section 1 <ctrl>Page_Up Go to the previous section 1 <alt>Q Quit 1 <alt>Right ltr Forward 1 <ctrl>Left ltr Back 1 <alt>Left rtl Forward 1 <ctrl>Right rtl Back 1 world World Clocks 1 <ctrl>N Add a world clock 1 <ctrl>S Select world clocks 1 alarm Alarm 1 <ctrl>N Add an alarm 1 <ctrl>S Select alarms 1 stopwatch Stopwatch 1 Return space Start / Stop / Continue 1 L Lap 1 Delete Reset 1 timer Timer 1 Return space Start / Stop / Pause 1 Delete Reset ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/shortcuts-gedit.ui000066400000000000000000000167001511343406000255470ustar00rootroot00000000000000 1 1 shortcuts 12 1 Touchpad gestures 1 gesture-two-finger-swipe-right Switch to the next document 1 gesture-two-finger-swipe-left Switch to the previous document 1 Documents 1 <ctrl>N Create new document 1 <ctrl>O Open a document 1 <ctrl>S Save the document 1 <ctrl>W Close the document 1 <ctrl><Alt>Page_Down Switch to the next document 1 <ctrl><Alt>Page_Up Switch to the previous document 1 Find and Replace 1 <ctrl>F Find 1 <ctrl>G Find the next match 1 <ctrl><Shift>G Find the previous match 1 <ctrl>H Find and Replace 1 <ctrl><Shift>K Clear highlight 1 <ctrl>I Go to line 1 Tools 1 <shift>F7 Check spelling 1 Miscellaneous 1 F11 Fullscreen on / off 1 <ctrl>P Print the document 1 Insert Toggle insert / overwrite ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/shortcuts.rb000066400000000000000000000044211511343406000244400ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Shortcuts Window GtkShortcutsWindow is a window that provides a help overlay for shortcuts and gestures in an application. =end class ShortcutsDemo def initialize(main_window) @icons_added = false unless @icons_added theme = Gtk::IconTheme.default theme.add_resource_path("/icons") @icons_added = true end ui = "/shortcuts/shortcuts.ui" @builder = Gtk::Builder.new(:resource => ui) builder_add_callback_symbols @builder.connect_signals {} @window = @builder["window1"] @window.screen = main_window.screen end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def builder_add_callback_symbols @builder.connect_signals do |name| case name when "builder_shortcuts" builder_shortcuts when "gedit_shortcuts" gedit_shortcuts when "clocks_shortcuts" clocks_shortcuts when "clocks_shortcuts_stopwatch" clocks_shortcuts_stopwatch when "boxes_shortcuts" boxes_shortcuts when "boxes_shortcuts_wizard" boxes_shortcuts_wizard when "boxes_shortcuts_display" boxes_shortcuts_display end end end def show_shortcuts(id, view) path = "/shortcuts/#{id}.ui" builder = Gtk::Builder.new(:resource => path) overlay = builder[id] overlay.set_transient_for(@window) overlay.view_name = view if view overlay.show end def builder_shortcuts proc do show_shortcuts("shortcuts-builder", nil) end end def gedit_shortcuts proc do show_shortcuts("shortcuts-gedit", nil) end end def clocks_shortcuts proc do show_shortcuts("shortcuts-clocks", nil) end end def clocks_shortcuts_stopwatch proc do show_shortcuts("shortcuts-clocks", "stopwatch") end end def boxes_shortcuts proc do show_shortcuts("shortcuts-boxes", nil) end end def boxes_shortcuts_wizard proc do show_shortcuts("shortcuts-boxes", "wizard") end end def boxes_shortcuts_display proc do show_shortcuts("shortcuts-boxes", "display") end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/shortcuts.ui000066400000000000000000000046001511343406000244510ustar00rootroot00000000000000 Shortcuts 1 vertical 50 10 1 Builder 1 GEdit 1 Clocks - All 1 Clocks - Stopwatch 1 Boxes 1 Boxes - Wizard 1 Boxes - Display ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/sidebar.rb000066400000000000000000000035751511343406000240240ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Stack Sidebar GtkStackSidebar provides an automatic sidebar widget to control navigation of a GtkStack object. This widget automatically updates it content based on what is presently available in the GtkStack object, and using the "title" child property to set the display labels. =end class SidebarDemo def initialize(_main_window) @window = Gtk::Window.new(:toplevel) @window.resizable = true @window.set_size_request(500, 350) header = Gtk::HeaderBar.new header.show_close_button = true @window.titlebar = header @window.title = "Stack Sidebar" box = Gtk::Box.new(:horizontal, 0) sidebar = Gtk::StackSidebar.new box.pack_start(sidebar, :expand => false, :fill => false, :padding => 0) stack = Gtk::Stack.new stack.transition_type = :slide_up_down sidebar.stack = stack widget = Gtk::Separator.new(:vertical) box.pack_start(widget, :expand => false, :fill => false, :padding => 0) box.pack_start(stack, :expand => true, :fill => true, :padding => 0) pages = ["Welcome to GTK+", "GtkStackSidebar Widget", "Automatic navigation", "Consistent appearance", "Scrolling", "Page 6", "Page 7", "Page 8", "Page 9"] pages.each_with_index do |page_string, i| child = nil if i.zero? child = Gtk::Image.new(:icon_name => "help-about", :size => :menu) child.pixel_size = 256 else child = Gtk::Label.new(page_string) end stack.add_named(child, page_string) stack.child_set_property(child, "title", page_string) end @window.add(box) end def run if !@window.visible? @window.show_all else @window.destroy end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/sizegroup.rb000066400000000000000000000062011511343406000244270ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Size Groups GtkSizeGroup provides a mechanism for grouping a number of widgets together so they all request the same amount of space. This is typically useful when you want a column of widgets to have the same size, but you can't use a GtkTable widget. Note that size groups only affect the amount of space requested, not the size that the widgets finally receive. If you want the widgets in a GtkSizeGroup to actually be the same size, you need to pack them in such a way that they get the size they request and not more. For example, if you are packing your widgets into a table, you would not include the GTK_FILL flag. =end class SizegroupDemo def initialize(main_window) color_options = %w(Red Green Blue) dash_options = %w(Solid Dashed Dotted) end_options = %w(Square Round Double Arrow) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Size Groups" @window.resizable = false @vbox = Gtk::Box.new(:vertical, 5) @window.add(@vbox) @vbox.margin = 5 size_group = Gtk::SizeGroup.new(:horizontal) # Create one frame holding color options table = initialize_frame("Color Options") add_row(table, 0, size_group, "_Foreground", color_options) add_row(table, 1, size_group, "_Background", color_options) # And another frame holding line style options table = initialize_frame("Line Options") add_row(table, 0, size_group, "_Dashing", dash_options) add_row(table, 1, size_group, "_Line ends", end_options) # And a check button to turn grouping on and off check_button = Gtk::CheckButton.new("_Enable grouping") check_button.use_underline = true check_button.active = true @vbox.pack_start(check_button, :expand => false, :fill => false, :padding => 0) check_button.signal_connect("toggled") do |widget| if widget.active? size_group.mode = :horizontal else size_group.mode = :none end end end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_frame(title) frame = Gtk::Frame.new(title) @vbox.pack_start(frame, :expand => false, :fill => false, :padding => 0) table = Gtk::Grid.new table.margin = 5 table.row_spacing = 5 table.column_spacing = 10 frame.add(table) table end def add_row(table, row, size_group, label_text, options) label = Gtk::Label.new(label_text, :use_underline => true) label.halign = :start label.valign = :baseline label.hexpand = true table.attach(label, 0, row, 1, 1) combo_box = create_combo_box(options) label.mnemonic_widget = combo_box combo_box.halign = :end combo_box.valign = :baseline size_group.add_widget(combo_box) table.attach(combo_box, 1, row, 1, 1) end def create_combo_box(options) combo_box = Gtk::ComboBoxText.new options.each do |o| combo_box.append_text(o) end combo_box.active = 0 combo_box end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/spinbutton.rb000066400000000000000000000062651511343406000246170ustar00rootroot00000000000000# Copyright (c) 2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Spin Button GtkSpinButton provides convenient ways to input data that can be seen as a value in a range. The examples here show that this does not necessarily mean numeric values, and it can include custom formatting. =end require "date" class SpinbuttonDemo def initialize(main_window) builder = Gtk::Builder.new(:resource => "/spinbutton/spinbutton.ui") builder.connect_signals do |name| case name when "hex_spin_input" proc do |button| hex_spin_input(button) end when "hex_spin_output" proc do |button| hex_spin_output(button) end when "time_spin_input" proc do |button| time_spin_input(button) end when "time_spin_output" proc do |button| time_spin_output(button) end when "month_spin_input" proc do |button| month_spin_input(button) end when "month_spin_output" proc do |button| month_spin_output(button) end else end end @window = builder["window"] @window.screen = main_window.screen @window.title = "Spin Buttons" @window.resizable = false value_to_label = proc do |value| value.to_s end adj = builder["basic_adjustment"] basic_label = builder["basic_label"] adj.bind_property("value", basic_label, "label", :sync_create, :transform_to => value_to_label) hex_adj = builder["hex_adjustment"] hex_label = builder["hex_label"] hex_adj.bind_property("value", hex_label, "label", :sync_create, :transform_to => value_to_label) adj = builder["time_adjustment"] time_label = builder["time_label"] adj.bind_property("value", time_label, "label", :sync_create, :transform_to => value_to_label) adj = builder["month_adjustment"] month_label = builder["month_label"] adj.bind_property("value", month_label, "label", :sync_create, :transform_to => value_to_label) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def hex_spin_input(button) value = button.text.to_i(16) value = 0 if value < 1e-5 value end def hex_spin_output(button) value = button.value button.text = sprintf("0x%.2X", value) button.text = "0x00" if value.abs < 1e-5 true end def time_spin_input(button) str = button.text.split(":") hours = str[0].to_i minutes = str[1].to_i value = 0 if (0..24).include?(hours) && (0..60).include?(minutes) value = hours * 60 + minutes end value end def time_spin_output(button) hours = button.value / 60.0 minutes = (hours - hours.floor) * 60.0 button.text = sprintf("%02.0f:%02.0f", hours.floor, (minutes + 0.5).floor) true end def month_spin_input(button) Date::MONTHNAMES.index(button.text) || 1 end def month_spin_output(button) value = button.adjustment.value || 1 button.text = Date::MONTHNAMES[value] true end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/spinbutton.ui000066400000000000000000000171051511343406000246240ustar00rootroot00000000000000 -10000 10000 0.5 100 255 1 16 1410 30 60 1 12 1 1 5 Spin Button 1 20 10 10 1 _Numeric 1 basic_spin 1 0 0 1 start 5 basic_adjustment 1 2 1 1 0 1 10 1 2 0 1 _Hexadecimal 1 hex_spin 1 0 1 1 start 4 hex_adjustment 1 1 1 1 10 1 2 1 1 _Time 1 time_spin 1 0 2 1 start 5 time_adjustment 1 1 2 1 10 1 2 2 1 _Month 1 month_spin 1 0 3 1 start 9 month_adjustment 1 if-valid 1 3 1 10 1 2 3 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/spinner.rb000066400000000000000000000036131511343406000240620ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Spinner GtkSpinner allows to show that background activity is on-going. =end class SpinnerDemo def initialize(main_window) @window = Gtk::Dialog.new(:title => "Spinner", :parent => main_window, :flags => nil, :buttons => [[:close, :none]]) @window.resizable = false @window.signal_connect("response") { @window.destroy } @window.signal_connect("destroy") { @window.destroy } initialize_vertical_box initialize_sensitive_box initialize_insensitive_box button = Gtk::Button.new(:stock_id => :media_play) button.signal_connect "clicked" do @spinner_sensitive.start @spinner_insensitive.start end @vbox.add(button) button = Gtk::Button.new(:stock_id => :media_stop) button.signal_connect "clicked" do @spinner_sensitive.stop @spinner_insensitive.stop end @vbox.add(button) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def initialize_vertical_box content_area = @window.content_area @vbox = Gtk::Box.new(:vertical, 5) content_area.pack_start(@vbox, :expand => true, :fill => true, :padding => 0) @vbox.margin = 5 end def initialize_sensitive_box # Sensitive hbox = Gtk::Box.new(:horizontal, 5) @spinner_sensitive = Gtk::Spinner.new hbox.add(@spinner_sensitive) hbox.add(Gtk::Entry.new) @vbox.add(hbox) end def initialize_insensitive_box # Disabled hbox = Gtk::Box.new(:horizontal, 5) @spinner_insensitive = Gtk::Spinner.new hbox.add(@spinner_insensitive) hbox.add(Gtk::Entry.new) hbox.sensitive = false @vbox.add(hbox) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/stack.rb000066400000000000000000000012201511343406000235010ustar00rootroot00000000000000# Copyright (c) 2015 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Stack GtkStack is a container that shows a single child at a time, with nice transitions when the visible child changes. GtkStackSwitcher adds buttons to control which child is visible. =end class StackDemo def initialize(main_window) builder = Gtk::Builder.new(:resource => "/stack/stack.ui") builder.connect_signals {} @window = builder["window1"] @window.screen = main_window.screen end def run if !@window.visible? @window.show_all else @window.destroy end @window end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/stack.ui000066400000000000000000000054271511343406000235300ustar00rootroot00000000000000 Stack 1 1 stack center 0 0 1 1 crossfade 1 20 20 gtk3-demo page1 Page 1 Page 2 1 1 1 center center page2 Page 2 1 center center 1 page3 face-laugh-symbolic 0 1 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/sw_resize_cursor.png000066400000000000000000000025311511343406000261720ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±6IDATX…í—ßK›WÇ?'oš_–έ±:[Óš!k(ÓÍ+;(þ€Ž\Å•®¶Œõfàþˆ‚àÝ`7côj0¦Á´eн°¥ Æ^Œ± mé¦QfëtuÆ4vÚ,y_sÎ.‹‹uf½Ù¾pÈËûæœïçœç<ç}^ø_ÿui¯ÀC¦ínû`Cç—mllì@0Ô6Ü+Úwqqñ-Ã0~…B€Ü„wêÝÝݦD"Ѻ²²òq<ÿdnnîƒ'NØ>|xtuuõÛŠŠŠƒ€¥È`bjjꨮ볆aH]×_øýþs@9`Þ Bèº~Ehrrò‹®®®w”Rj~~þ;‡ÃQ ضLD"‘ú®G¦§§ÚÚZu÷îÝl:Î\»ví3à L©Tj  *@* ªÉÉɽ^¯ohbbbÀn·» !ÆÇǦR©ð‚qüøq(‹Å¢¥ak===Àëä÷ßV{Àd†¹ðf2™t,//¸zõ*uuu¾p8ü•Ýn?XÓíÛ·­n·{ “ɼ×ÖÖfžÀãñpúôiõøñãߺººRyóvB)µiy¤”ÚÚÚš  ¿¿ŸK—. ÇÓ‡¿*N:åhii¹.¥l9{ö¬9‰ÐÐÐÀÈȈŒF£±æææëOŸ>ÍlwÓL‹i#ØÍ›7¹|ù²ç3::úuUUU%p€ áØSÎÌÌ$ûúú>Ç㇉ÄkRÊ¢"—ëfójyyùs¯×{²··w=²{p:‡º»»­VkÜét.•••%¥”»ZA!„’Rþyÿþý$¹0‘; 7eÀåååÁÂ×q)F'€ZÀA> »šAGGBˆ}µ‹/RYYéÜÀ¡uï- ŠÈ\÷ÞrH) —Ë¥.\¸°s¹K555a†$WA-ÉÌ###‰DâEIŸW&“ÉïO:r›qK ¹’é$ðvþº¡’@xü<Ö¶äJîrÀ ”•@i` xèÀæÚo„–ÙÝÇÄî²€‘ÿ•%sÿú Ÿ‡ÐžæJÊIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/test_mod.rb000066400000000000000000000007051511343406000242210ustar00rootroot00000000000000# Copyright (c) 2008-2015 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = test demo Demonstrates the demo interface. =end class TestModDemo def initialize(window) puts "ok" @window = Gtk::Window.new(:toplevel) @window.add(Gtk::Label.new("This is a test")) end def run if !@window.visible? @window.show_all else @window.destroy end @window end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/text_cursor.png000066400000000000000000000015141511343406000251440ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±)IDATX…í–±kaÆw¶5H¼# -…'i;—£)!CᆠÎÅÍ-üº¸ÝBqqN t0C:„n-^P’¦1JMÓª§¢Þ×ÁKp(x'¡]îî{ážïÇûÝñ¼àË×–äõ˲žWÓé4 0›Á`ð®mÛ2Àh4ú’ËåÞmoo÷ûƺÝnýää$V¯×eY–I&“âøøXT«U@×u{ooï­®ëï¾Wÿ… ¿³Ù¬ 4Mápøzßn·§;;;eàÞÐjµÄœ¢Ñ¨0 ãzoÛ¶ØÚÚ2€nünyØØØx™J¥^ÇãñÇétúÙU½Ùl^†ñéððð¬R©|,¯Þnµ¬ …7ó¨V«- ,1k¸R¯×û°(ŽËåò \†‘g ‡Ã_óÉÚÚšpr@¢ÓéLJ¥Rˆºñ󜆖e]d2™p"‘677E­V£ÑhH«««²išrãð ‹Å~D"‘uUU{Š¢\˜¦y …ºªªþTUõbÿ(ŸÏœL&_î"¿e>xÜgvÏ‚Y¿ð ¨áb*Z@f6Ýqž¯î_r– (±„¿¯«?J,€±Ž®IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/textmask.rb000066400000000000000000000031551511343406000242450ustar00rootroot00000000000000# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Pango/Text Mask This demo shows how to use PangoCairo to draw text with more than just a single color. =end class TextmaskDemo def initialize(_main_window) @window = Gtk::Window.new(:toplevel) @window.resizable = true @window.set_size_request(400, 200) @window.title = "Text Mask" da = Gtk::DrawingArea.new @window.add(da) da.signal_connect "draw" do |_widget, cr| cr.save layout = da.create_pango_layout("Pango power!\nPango power!\nPango power!") desc = Pango::FontDescription.new("sans bold 34") layout.font_description = desc cr.move_to(30, 20) cr.pango_layout_path(layout) pattern = Cairo::LinearPattern.new(0.0, 0.0, da.allocated_width, da.allocated_height) pattern.add_color_stop(0.0, 1.0, 0.0, 0.0) pattern.add_color_stop(0.2, 1.0, 0.0, 0.0) pattern.add_color_stop(0.3, 1.0, 1.0, 0.0) pattern.add_color_stop(0.4, 0.0, 1.0, 0.0) pattern.add_color_stop(0.6, 0.0, 1.0, 1.0) pattern.add_color_stop(0.7, 0.0, 0.0, 1.0) pattern.add_color_stop(0.8, 1.0, 0.0, 1.0) pattern.add_color_stop(1.0, 1.0, 0.0, 1.0) cr.set_source(pattern) cr.fill_preserve cr.set_source_rgb(0.0, 0.0, 0.0) cr.set_line_width(0.5) cr.stroke cr.restore true end end def run if !@window.visible? @window.show_all else @window.destroy end @window end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/textscroll.rb000066400000000000000000000075221511343406000246120ustar00rootroot00000000000000# 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 class TextscrollDemo def initialize(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) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def 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 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 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/textview.rb000066400000000000000000000366021511343406000242670ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Text View/Multiple Views The GtkTextView widget displays a GtkTextBuffer. One GtkTextBuffer can be displayed by multiple GtkTextViews. This demo has two views displaying a single buffer, and shows off the widget's text formatting features. =end class TextviewDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.set_default_size(450, 450) @window.title = "Multiple Views" vpaned = Gtk::Paned.new(:vertical) @window.add(vpaned) # For convenience, we just use the autocreated buffer from # the first text view; you could also create the buffer # by itself Gtk::TextBuffer.new, then later create a view # widget. view1 = Gtk::TextView.new view2 = Gtk::TextView.new(view1.buffer) sw = Gtk::ScrolledWindow.new sw.set_policy(:automatic, :automatic) vpaned.add1(sw) sw.add(view1) sw = Gtk::ScrolledWindow.new sw.set_policy(:automatic, :automatic) vpaned.add2(sw) sw.add(view2) create_tags(view1.buffer) insert_text(view1.buffer) attach_widgets(view1) attach_widgets(view2) vpaned.show_all end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_tags(buffer) # Create a bunch of tags. Note that it's also possible to # create tags with Gtk::TextTag.new then add them to the # tag table for the buffer, Gtk::TextBuffer.create_tag is # just a convenience function. Also note that you don't have # to give tags a name; pass NULL for the name to create an # anonymous tag. # # In any real app, another useful optimization would be to create # a Gtk::TextTagTable in advance, and reuse the same tag table for # all the buffers with the same tag set, instead of creating # new copies of the same tags for every buffer. # # Tags are assigned default priorities in order of addition to the # tag table. That is, tags created later that affect the same text # property affected by an earlier tag will override the earlier # tag. You can modify tag priorities with # Gtk::TextTag.priority=. buffer.create_tag("heading", "weight" => :bold, "size" => 15 * Pango::SCALE) buffer.create_tag("italic", "style" => :italic) buffer.create_tag("bold", "weight" => :bold) buffer.create_tag("big", # points times the PANGO_SCALE factor "size" => 20 * Pango::SCALE) buffer.create_tag("xx-small", "scale" => :xx_small) buffer.create_tag("x-large", "scale" => :x_large) buffer.create_tag("monospace", "family" => "monospace") buffer.create_tag("blue_foreground", "foreground" => "blue") buffer.create_tag("red_background", "background" => "red") buffer.create_tag("big_gap_before_line", "pixels_above_lines" => 30) buffer.create_tag("big_gap_after_line", "pixels_below_lines" => 30) buffer.create_tag("double_spaced_line", "pixels_inside_wrap" => 10) buffer.create_tag("not_editable", "editable" => false) buffer.create_tag("word_wrap", "wrap_mode" => :word) buffer.create_tag("char_wrap", "wrap_mode" => :char) buffer.create_tag("no_wrap", "wrap_mode" => :none) buffer.create_tag("center", "justification" => :center) buffer.create_tag("right_justify", "justification" => :right) buffer.create_tag("wide_margins", "left_margin" => 50, "right_margin" => 50) buffer.create_tag("strikethrough", "strikethrough" => true) buffer.create_tag("underline", "underline" => :single) buffer.create_tag("double_underline", "underline" => :double) buffer.create_tag("superscript", "rise" => 10 * Pango::SCALE, # 10 pixels "size" => 8 * Pango::SCALE) # 8 points buffer.create_tag("subscript", "rise" => -10 * Pango::SCALE, # 10 pixels "size" => 8 * Pango::SCALE) # 8 points buffer.create_tag("rtl_quote", "wrap_mode" => :word, "direction" => :rtl, "indent" => 30, "left_margin" => 20, "right_margin" => 20) end def insert_text(buffer) icon_theme = Gtk::IconTheme.default pixbuf = icon_theme.load_icon("gtk3-demo", 32, :generic_fallback) # get start of buffer; each insertion will revalidate the # iterator to point to just after the inserted text. iter = buffer.get_iter_at(:offset => 0) buffer.insert(iter, < ["heading"]) buffer.insert(iter, "For example, you can have ") buffer.insert(iter, "italic", :tags => ["italic"]) buffer.insert(iter, ", ") buffer.insert(iter, "bold", :tags => ["bold"]) buffer.insert(iter, ", or ") buffer.insert(iter, "monospace(typewriter)", :tags => ["monospace"]) buffer.insert(iter, ", or ") buffer.insert(iter, "big", :tags => ["big"]) buffer.insert(iter, " text. ") buffer.insert(iter, "It's best not to hardcode specific text sizes; you can\ use relative sizes as with CSS, such as ") buffer.insert(iter, "xx-small", :tags => ["xx-small"]) buffer.insert(iter, " or ") buffer.insert(iter, "x-large", :tags => ["x-large"]) buffer.insert(iter, " to ensure that your program properly adapts if the \ user changes the default font size.\n\n") buffer.insert(iter, "Colors. ", :tags => ["heading"]) buffer.insert(iter, "Colors such as ") buffer.insert(iter, "a blue foreground", :tags => ["blue_foreground"]) buffer.insert(iter, " or ") buffer.insert(iter, "a red background", :tags => ["red_background"]) buffer.insert(iter, " or even ") buffer.insert(iter, "a blue foreground on red background", :tags => %w(blue_foreground red_background)) buffer.insert(iter, "(select that to read it) can be used.\n\n") buffer.insert(iter, "Underline, strikethrough, and rise. ", :tags => ["heading"]) buffer.insert(iter, "Strikethrough", :tags => ["strikethrough"]) buffer.insert(iter, ", ") buffer.insert(iter, "underline", :tags => ["underline"]) buffer.insert(iter, ", ") buffer.insert(iter, "double underline", :tags => ["double_underline"]) buffer.insert(iter, ", ") buffer.insert(iter, "superscript", :tags => ["superscript"]) buffer.insert(iter, ", and ") buffer.insert(iter, "subscript", :tags => ["subscript"]) buffer.insert(iter, " are all supported.\n\n") buffer.insert(iter, "Images. ", :tags => ["heading"]) buffer.insert(iter, "The buffer can have images in it: ") buffer.insert(iter, pixbuf) buffer.insert(iter, pixbuf) buffer.insert(iter, pixbuf) buffer.insert(iter, " for example.\n\n") buffer.insert(iter, "Spacing. ", :tags => ["heading"]) buffer.insert(iter, "You can adjust the amount of space before each line.\n") buffer.insert(iter, "This line has a whole lot of space before it.\n", :tags => %w(big_gap_before_line wide_margins)) buffer.insert(iter, "You can also adjust the amount of space after each \ line; this line has a whole lot of space after it.\n", :tags => %w(big_gap_after_line wide_margins)) text = "You can also adjust the amount of space between wrapped lines; \ this line has extra space between each wrapped line in the same paragraph. To \ show off wrapping, some filler text: the quick brown fox jumped over the lazy \ dog. Blah blah blah blah blah blah blah blah blah.\n" buffer.insert(iter, text, :tags => %w(double_spaced_line wide_margins)) buffer.insert(iter, "Also note that those lines have extra-wide margins.\n\n") buffer.insert(iter, "Editability. ", :tags => ["heading"]) buffer.insert(iter, "This line is 'locked down' and can't be edited by the \ user - just try it! You can't delete this line.\n\n", :tags => ["not_editable"]) buffer.insert(iter, "Wrapping. ", :tags => ["heading"]) buffer.insert(iter, "This line(and most of the others in this buffer) is \ word-wrapped, using the proper Unicode algorithm. Word wrap should work in all\ scripts and languages that GTK+ supports. Let's make this a long paragraph to\ demonstrate: blah blah blah blah blah blah blah blah blah blah blah blah blah\ blah blah blah blah blah blah\n\n") buffer.insert(iter, "This line has character-based wrapping, and can wrap \ between any two character glyphs. Let's make this a long paragraph to \ demonstrate: blah blah blah blah blah blah blah blah blah blah blah blah blah \ blah blah blah blah blah blah\n\n", :tags => ["char_wrap"]) buffer.insert(iter, "This line has all wrapping turned off, so it makes \ the horizontal scrollbar appear.\n\n\n", :tags => ["no_wrap"]) buffer.insert(iter, "Justification. ", :tags => ["heading"]) buffer.insert(iter, "\nThis line has center justification.\n", :tags => ["center"]) buffer.insert(iter, "This line has right justification.\n", :tags => ["right_justify"]) buffer.insert(iter, "\nThis line has big wide margins. Text text text text\ text text text text text text text text text text text text text text text \ text text text text text text text text text text text text text text text \ text text.\n", :tags => ["wide_margins"]) buffer.insert(iter, "Internationalization. ", :tags => ["heading"]) buffer.insert(iter, "You can put all sorts of Unicode text in the buffer.\ \n\nGerman(Deutsch Süd) Grüß Gott\nGreek(Ελληνικά) Γειά σας\nHebrew \ שלו×\nJapanese(日本語)\n\nThe widget properly handles bidirectional text, word\ wrapping, DOS/UNIX/Unicode paragraph separators, grapheme boundaries, and so \ on using the Pango internationalization framework.\n") buffer.insert(iter, "Here's a word-wrapped quote in a right-to-left language:\n") buffer.insert(iter, "\331\210\331\202\330\257 \330\250\330\257\330\243 \ \330\253\331\204\330\247\330\253 \331\205\331\206 \330\243\331\203\330\253\330\ \261 \330\247\331\204\331\205\330\244\330\263\330\263\330\247\330\252 \330\252\ \331\202\330\257\331\205\330\247 \331\201\331\212 \330\264\330\250\331\203\330\ \251 \330\247\331\203\330\263\331\212\331\210\331\206 \330\250\330\261\330\247\ \331\205\330\254\331\207\330\247 \331\203\331\205\331\206\330\270\331\205\330\ \247\330\252 \331\204\330\247 \330\252\330\263\330\271\331\211 \331\204\331\ \204\330\261\330\250\330\255\330\214 \330\253\331\205 \330\252\330\255\331\210\ \331\204\330\252 \331\201\331\212 \330\247\331\204\330\263\331\206\331\210\330\ \247\330\252 \330\247\331\204\330\256\331\205\330\263 \330\247\331\204\331\205\ \330\247\330\266\331\212\330\251 \330\245\331\204\331\211 \331\205\330\244\330\ \263\330\263\330\247\330\252 \331\205\330\247\331\204\331\212\330\251 \331\205\ \331\206\330\270\331\205\330\251\330\214 \331\210\330\250\330\247\330\252\330\ \252 \330\254\330\262\330\241\330\247 \331\205\331\206 \330\247\331\204\331\ \206\330\270\330\247\331\205 \330\247\331\204\331\205\330\247\331\204\331\212 \ \331\201\331\212 \330\250\331\204\330\257\330\247\331\206\331\207\330\247\330\ \214 \331\210\331\204\331\203\331\206\331\207\330\247 \330\252\330\252\330\256\ \330\265\330\265 \331\201\331\212 \330\256\330\257\331\205\330\251 \331\202\ \330\267\330\247\330\271 \330\247\331\204\331\205\330\264\330\261\331\210\330\ \271\330\247\330\252 \330\247\331\204\330\265\330\272\331\212\330\261\330\251.\ \331\210\330\243\330\255\330\257 \330\243\331\203\330\253\330\261 \331\207\330\ \260\331\207 \330\247\331\204\331\205\330\244\330\263\330\263\330\247\330\252 \ \331\206\330\254\330\247\330\255\330\247 \331\207\331\210 \302\273\330\250\330\ \247\331\206\331\203\331\210\330\263\331\210\331\204\302\253 \331\201\331\212 \ \330\250\331\210\331\204\331\212\331\201\331\212\330\247.\n\n" , :tags => ["rtl_quote"]) buffer.insert(iter, "You can put widgets in the buffer: Here's a button: ") buffer.create_child_anchor(iter) buffer.insert(iter, " and a menu: ") buffer.create_child_anchor(iter) buffer.insert(iter, " and a scale: ") buffer.create_child_anchor(iter) buffer.insert(iter, " and an animation: ") buffer.create_child_anchor(iter) buffer.insert(iter, " finally a text entry: ") buffer.create_child_anchor(iter) buffer.insert(iter, ".\n") buffer.insert(iter, "\n\nThis demo doesn't demonstrate all the \ Gtk::TextBuffer features; it leaves out, for example: invisible/hidden text \ (doesn't work in GTK 2, but planned), tab stops, application-drawn areas on \ the sides of the widget for displaying breakpoints and such...") # Apply word_wrap tag to whole buffer buf_start, buf_end = buffer.bounds buffer.apply_tag("word_wrap", buf_start, buf_end) end def find_anchor(iter) while iter.forward_char return true if iter.child_anchor end false end def attach_widgets(text_view) buffer = text_view.buffer iter = buffer.start_iter i = 0 widget = nil while find_anchor(iter) anchor = iter.child_anchor if i == 0 widget = Gtk::Button.new(:label => "Click Me") widget.signal_connect("clicked") { easter_egg_callback } elsif i == 1 widget = Gtk::ComboBoxText.new widget.append_text("Option 1") widget.append_text("Option 2") widget.append_text("Option 3") elsif i == 2 widget = Gtk::Scale.new(:horizontal, nil) widget.set_range(0, 100) widget.set_size_request(70, -1) elsif i == 3 widget = Gtk::Image.new(:resource => "/textview/floppybuddy.gif") elsif i == 4 widget = Gtk::Entry.new end text_view.add_child_at_anchor(widget, anchor) widget.show_all i += 1 end end def easter_egg_callback buffer = Gtk::TextBuffer.new iter = buffer.start_iter buffer.insert(iter, "This buffer is shared by a set of nested text views.\n \ Nested view:") anchor = buffer.create_child_anchor(iter) buffer.insert(iter, "\nDon't do this in real applications, please.\n") view = Gtk::TextView.new(buffer) recursive_attach_view(0, view, anchor) window = Gtk::Window.new sw = Gtk::ScrolledWindow.new sw.set_policy(:automatic, :automatic) window.add(sw) sw.add(view) window.set_default_size(300, 400) window.show_all end def recursive_attach_view(depth, view, anchor) return if depth > 4 child_view = Gtk::TextView.new(view.buffer) # Frame is to add a black border around each child view. frame = Gtk::Frame.new frame.add(child_view) view.add_child_at_anchor(frame, anchor) recursive_attach_view(depth + 1, child_view, anchor) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/theming.ui000066400000000000000000000246661511343406000240640ustar00rootroot00000000000000 10 vertical 1 1 0 1 Normal 1 1 edit-find 1 1 Active 1 1 edit-find 1 1 1 0 Insensitive 1 1 edit-find 1 1 Raised 1 1 edit-find-symbolic 1 1 Raised Active 1 1 edit-find-symbolic 1 1 1 0 Insensitive Active 1 edit-find 1 1 1 1 1 1 • Search... edit-find-symbolic 1 1 1 1 center center Hi, I am a button 1 1 1 And I'm another button 1 1 1 1 This is a button party! 1 1 1 2 1 1 1 icons 1 Normal 1 list-add-symbolic 1 1 Normal 1 list-add-symbolic 1 Active 1 list-remove-symbolic 1 1 1 Active 1 list-remove-symbolic 1 1 1 0 Insensitive 1 edit-find-symbolic 1 1 0 Insensitive Active 1 go-up-symbolic 1 1 1 10 horizontal 1 Plain end 1 1 Destructive 1 Suggested ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/theming_style_classes.rb000066400000000000000000000034671511343406000270030ustar00rootroot00000000000000# # This sample code is a port of gtk3/demos/gtk-demo/theming_style_classes.c. # The UI file used in this sample code is copied from gtk3/demos/gtk-demo. # This is licensed under the terms of the GNU Lesser General Public # License, version 2.1 or (at your option) later. # # 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 # 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 =begin = Theming/Style Classes GTK+ uses CSS for theming. Style classes can be associated with widgets to inform the theme about intended rendering. This demo shows some common examples where theming features of GTK+ are used for certain effects: primary toolbars, inline toolbars and linked buttons. =end class ThemingStyleClassesDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Style Classes" @window.resizable = false builder = Gtk::Builder.new(:resource => "/theming_style_classes/theming.ui") grid = builder["grid"] grid.show_all @window.add(grid) end def run if !@window.visible? @window.show_all else @window.destroy end @window end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/toolpalette.rb000066400000000000000000000333541511343406000247450ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Tool Palette A tool palette widget shows groups of toolbar items as a grid of icons or a list of names. =end class ToolpaletteDemo def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Tool Palette" @window.set_default_size(200, 600) @canvas_items = [] # Add widgets to control the ToolPalette appearance @box = Gtk::Box.new(:vertical, 6) @box.margin = 6 @window.add(@box) create_orientation_combobox create_style_combobox # Add hbox. @hbox = Gtk::Box.new(:horizontal, 5) @box.pack_start(@hbox, :expand => true, :fill => true, :padding => 0) create_and_fill_the_toolpalette add_comboboxes_signals # Notebook create_and_fill_the_notebook end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_style_combobox style_model = Gtk::ListStore.new(String, Integer) iter = style_model.append iter[0] = "Text" iter[1] = Gtk::ToolbarStyle::TEXT.to_i iter = style_model.append iter[0] = "Both" iter[1] = Gtk::ToolbarStyle::BOTH.to_i iter = style_model.append iter[0] = "Both: Horizontal" iter[1] = Gtk::ToolbarStyle::BOTH_HORIZ.to_i iter = style_model.append iter[0] = "Icons" iter[1] = Gtk::ToolbarStyle::ICONS.to_i iter = style_model.append iter[0] = "Default" iter[1] = -1 # A custom meaning for this demo. @combo_style = Gtk::ComboBox.new(:model => style_model) cell_renderer = Gtk::CellRendererText.new @combo_style.pack_start(cell_renderer, true) @combo_style.set_attributes(cell_renderer, "text" => 0) @combo_style.active_iter = iter @box.pack_start(@combo_style, :expand => false, :fill => false, :padding => 0) end def create_orientation_combobox orientation_model = Gtk::ListStore.new(String, Integer) iter = orientation_model.append iter[0] = "Horizontal" iter[1] = Gtk::Orientation::HORIZONTAL iter = orientation_model.append iter[0] = "Vertical" iter[1] = Gtk::Orientation::VERTICAL @combo_orientation = Gtk::ComboBox.new(:model => orientation_model) cell_renderer = Gtk::CellRendererText.new @combo_orientation.pack_start(cell_renderer, true) @combo_orientation.set_attributes(cell_renderer, "text" => 0) @combo_orientation.active_iter = iter @box.pack_start(@combo_orientation, :expand => false, :fill => false, :padding => 0) end def create_and_fill_the_toolpalette @palette = Gtk::ToolPalette.new load_icon_items load_toggle_items load_special_items palette_scroller = Gtk::ScrolledWindow.new palette_scroller.set_policy(:never, :automatic) palette_scroller.margin = 6 palette_scroller.hexpand = true palette_scroller.add(@palette) @hbox.add(palette_scroller) @box.show_all add_dnd_for_tool_items_to_palette end def add_dnd_for_tool_items_to_palette @palette.signal_connect "drag-data-received" do |widget, context, x, y| drag_item = @drag_palette.drag_item drop_group = widget.get_drop_group(x, y) if drag_item.class == Gtk::ToolItemGroup palette_drop_group(drag_palette, drag_item, drop_group) elsif drag_item.class == Gtk::ToolButton && drop_group allocation = drop_group.allocation palette_drop_item(drag_item, drop_group, x - allocation.x, y - allocation.y) end end @palette.add_drag_dest(@palette, Gtk::DestDefaults::ALL, [Gtk::ToolPaletteDragTargets::ITEMS, Gtk::ToolPaletteDragTargets::GROUPS], Gdk::DragAction::COPY) end def add_comboboxes_signals @combo_orientation.signal_connect "changed" do |widget| on_combo_orientation_changed(widget) end @combo_style.signal_connect "changed" do |widget| on_combo_style_changed(widget) end # Kepp the widgets in sync on_combo_orientation_changed(@combo_orientation) end def create_passive_contents @passive_contents = Gtk::DrawingArea.new @passive_contents.signal_connect "draw" do |widget, cr| canvas_draw(widget, cr) end @passive_contents.signal_connect "drag-data-received" do |widget, _context, x, y, selection, _info, _time| tool_item = @palette.get_drag_item(selection) # append a new canvas item when a tool button was found if tool_item.class == Gtk::ToolButton canvas_item = CanvasItem.new(widget, tool_item, x, y) @canvas_items << canvas_item widget.queue_draw end end end def create_interactive_contents @interactive_contents = Gtk::DrawingArea.new @interactive_contents.signal_connect "draw" do |widget, cr| canvas_draw(widget, cr) end @interactive_contents.signal_connect "drag-motion" do |widget, context, x, y, time| if @drop_item # already have a drop indicator - just update position @drop_item.x = x @drop_item.y = y widget.queue_draw Gdk.drag_status(context, Gdk::DragAction::COPY, time) else # request DnD data for creating a drop indicator target = widget.drag_dest_find_target(context, nil) return false unless target @drag_data_requested_for_drop = false widget.drag_get_data(context, target, time) end true end @interactive_contents.signal_connect "drag-data-received" do |widget, context, x, y, selection, _info, time| # find the tool button which is the source of this DnD operation tool_item = @palette.get_drag_item(selection) if tool_item.class == Gtk::ToolButton item = CanvasItem.new(widget, tool_item, x, y) # Either create a new item or just create a preview item, depending on # why the drag data was requested. if @drag_data_requested_for_drop @canvas_items << item context.finish(:success => true, :delete => false, :time => time) @drop_item = nil else @drop_item = item Gdk.drag_status(context, Gdk::DragAction::COPY, time) end widget.queue_draw end end @interactive_contents.signal_connect "drag-leave" do |widget| @drop_item = nil if @drop_item widget.queue_draw end @interactive_contents.signal_connect "drag-drop" do |widget, context, _x, _y, time| target = widget.drag_dest_find_target(context, nil) if target @drag_data_requested_for_drop = true widget.drag_get_data(context, target, time) end false end end def create_and_fill_the_notebook notebook = Gtk::Notebook.new notebook.margin = 6 @hbox.pack_end(notebook, :expand => false, :fill => false, :padding => false) # Passive DnD dest create_passive_contents @palette.add_drag_dest(@passive_contents, Gtk::DestDefaults::ALL, [Gtk::ToolPaletteDragTargets::ITEMS], Gdk::DragAction::COPY) contents_scroller = Gtk::ScrolledWindow.new contents_scroller.set_policy(:automatic, :always) contents_scroller.add(@passive_contents) notebook.append_page(contents_scroller, Gtk::Label.new("Passive DnD Mode")) contents_scroller.margin = 6 # Interactive DnD dest create_interactive_contents @palette.add_drag_dest(@interactive_contents, Gtk::DestDefaults::HIGHLIGHT, [Gtk::ToolPaletteDragTargets::ITEMS], Gdk::DragAction::COPY) contents_scroller = Gtk::ScrolledWindow.new contents_scroller.set_policy(:automatic, :always) contents_scroller.add(@interactive_contents) notebook.append_page(contents_scroller, Gtk::Label.new("Interactive DnD Mode")) end def canvas_draw(widget, cr) cr.set_source_rgb(1, 1, 1) cr.paint @canvas_items.each do |canvas_item| canvas_item.draw(cr, false) end @drop_item.draw(cr, true) if @drop_item end def palette_drop_group(drag_palette, drag_group, drop_group) drop_position = -1 drop_position = drag_palette.get_group_position(drop_group) if drop_group drag_palette.set_group_position(drag_group, drop_position) end def palette_drop_item(drag_item, drop_group, x, y) drag_group = drag_item.parent drop_item = drop_group.get_drop_item(x, y) drop_position = -1 drop_position = drop_gropu.get_item_position(drop_item) if drop_item if drag_group != drop_group homogeneous = drag_group.child_get_property(drag_item, "homogeneous") expand = drag_group.child_get_property(drag_item, "expand") fill = drag_group.child_get_property(drag_item, "fill") new_row = drag_group.child_get_property(drag_item, "new-row") drop_group.insert(drag_item, drop_position) drop_group.child_set(drag_item, "homogeneous" => homogeneous, "expand" => expand, "fill" => fill, "new-row" => new_row) else drop_group.set_item_position(drag_item, drop_position) end end def on_combo_orientation_changed(combo_box) sw = @palette.parent iter = combo_box.active_iter return unless iter @palette.orientation = iter[1] if @palette.orientation == Gtk::Orientation::HORIZONTAL sw.set_policy(:automatic, :never) else sw.set_policy(:never, :automatic) end end def on_combo_style_changed(combo_box) iter = combo_box.active_iter return unless iter if iter[1] == -1 @palette.unset_style else @palette.style = iter[1] end end def load_icon_items max_icons = 10 icons_count = 0 icon_theme = Gtk::IconTheme.get_for_screen(@palette.screen) contexts = icon_theme.contexts contexts.each do |context| group = Gtk::ToolItemGroup.new(context) @palette.add(group) next if context == "Animations" puts "Got context '#{context}" icon_names = icon_theme.icons(context) icon_names.sort icon_names.each do |icon_name| next if icon_name == "emblem-desktop" next if icon_name =~ /^.*-symbolic$/ puts "Got icon name '#{icon_name}'" item = Gtk::ToolButton.new item.icon_name = icon_name item.tooltip_text = icon_name group.insert(item, -1) # Prevent us having an insane number of icons icons_count += 1 break if icons_count >= max_icons end end end def load_toggle_items group = Gtk::ToolItemGroup.new("Radio Item") @palette.add(group) item = nil (1..10).each do |i| label = "##{i}" item = Gtk::RadioToolButton.new(item) item.label = label group.insert(item, -1) end end def create_entry_item(text) entry = Gtk::Entry.new entry.text = text entry.width_chars = 5 item = Gtk::ToolItem.new item.add(entry) item end def load_special_items group = Gtk::ToolItemGroup.new("Advanced Features group") label_button = Gtk::Button.new(:label => "Advanced Features") label_button.show group.label_widget = label_button @palette.add(group) item = create_entry_item("homogeneous=FALSE") group.insert(item, -1) group.child_set_property(item, "homogeneous", false) item = create_entry_item("homogeneous=FALSE, expand=TRUE") group.insert(item, -1) group.child_set_property(item, "homogeneous", false) group.child_set_property(item, "expand", true) item = create_entry_item("homogeneous=FALSE, expand=TRUE, fill=FALSE") group.insert(item, -1) group.child_set_property(item, "homogeneous", false) group.child_set_property(item, "expand", true) group.child_set_property(item, "fill", false) item = create_entry_item("homogeneous=FALSE, expand=TRUE, new-row=TRUE") group.insert(item, -1) group.child_set_property(item, "homogeneous", false) group.child_set_property(item, "expand", true) group.child_set_property(item, "new-row", true) item = Gtk::ToolButton.new item.icon_name = "go-up" item.tooltip_text = "Show on vertical palettes only" group.insert(item, -1) item.visible_horizontal = false item = Gtk::ToolButton.new item.icon_name = "go-next" item.tooltip_text = "Show on horizontal palettes only" group.insert(item, -1) item.visible_vertical = false item = Gtk::ToolButton.new item.icon_name = "edit-delete" item.tooltip_text = "Do not show at all" group.insert(item, -1) item.no_show_all = true item = Gtk::ToolButton.new item.icon_name = "view-fullscreen" item.tooltip_text = "Expanded this item" group.insert(item, -1) group.child_set_property(item, "homogeneous", false) group.child_set_property(item, "expand", true) item = Gtk::ToolButton.new item.icon_name = "help-browser" item.tooltip_text = "A regular item" group.insert(item, -1) end end class CanvasItem attr_reader :pixbuf attr_accessor :x, :y def initialize(widget, button, x, y) icon_name = button.icon_name icon_theme = Gtk::IconTheme.get_for_screen(widget.screen) width, _height = Gtk::IconSize.lookup(:dialog) @pixbuf = icon_theme.load_icon(icon_name, width, Gtk::IconLookupFlags::GENERIC_FALLBACK) return nil unless @pixbuf @x = x @y = y end def draw(cr, preview) cx = @pixbuf.width cy = @pixbuf.height cr.set_source_pixbuf(@pixbuf, @x - cx * 0.5, @y - cy * 0.5) if preview cr.paint(0.6) else cr.paint end end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/transparent.rb000066400000000000000000000102301511343406000247360ustar00rootroot00000000000000# 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 class TransparentDemo SHADOW_OFFSET_X = 7 SHADOW_OFFSET_Y = 7 SHADOW_RADIUS = 5 def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.set_default_size(450, 450) @window.title = "Transparency" 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 end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def 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 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/tree_store.rb000066400000000000000000000214311511343406000245550ustar00rootroot00000000000000# Copyright (c) 2017 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # =begin = Tree View/Tree Store The GtkTreeStore is used to store data in tree form, to be used later on by a GtkTreeView to display it. This demo builds a simple GtkTreeStore and displays it. If you're new to the GtkTreeView widgets and associates, look into the GtkListStore example first. =end class TreeStoreDemo TreeItem = Struct.new("TreeItem", :label, :alex, :havoc, :tim, :owen, :dave, :world_holiday, :children) HOLIDAY_NAME_COLUMN, ALEX_COLUMN, HAVOC_COLUMN, TIM_COLUMN, OWEN_COLUMN, DAVE_COLUMN, VISIBLE_COLUMN, WORLD_COLUMN, NUM_COLUMNS = (0..8).to_a January = [ ["New Years Day", true, true, true, true, false, true, nil], ["Presidential Inauguration", false, true, false, true, false, false, nil], ["Martin Luther King Jr. day", false, true, false, true, false, false, nil] ].collect do |ary| TreeItem.new(*ary) end February = [ ["Presidents' Day", false, true, false, true, false, false, nil], ["Groundhog Day", false, false, false, false, false, false, nil], ["Valentine's Day", false, false, false, false, true, true, nil] ].collect do |ary| TreeItem.new(*ary) end March = [ ["National Tree Planting Day", false, false, false, false, false, false, nil], ["St Patrick's Day", false, false, false, false, false, true, nil] ].collect do |ary| TreeItem.new(*ary) end April = [ ["April Fools' Day", false, false, false, false, false, true, nil], ["Army Day", false, false, false, false, false, false, nil], ["Earth Day", false, false, false, false, false, true, nil], ["Administrative Professionals' Day", false, false, false, false, false, false, nil] ].collect do |ary| TreeItem.new(*ary) end May = [ ["Nurses' Day", false, false, false, false, false, false, nil], ["National Day of Prayer", false, false, false, false, false, false, nil], ["Mothers' Day", false, false, false, false, false, true, nil], ["Armed Forces Day", false, false, false, false, false, false, nil], ["Memorial Day", true, true, true, true, false, true, nil] ].collect do |ary| TreeItem.new(*ary) end June = [ ["June Fathers' Day", false, false, false, false, false, true, nil], ["Juneteenth (Liberation of Slaves)", false, false, false, false, false, false, nil], ["Flag Day", false, true, false, true, false, false, nil] ].collect do |ary| TreeItem.new(*ary) end July = [ ["Parents' Day", false, false, false, false, false, true, nil], ["Independence Day", false, true, false, true, false, false, nil] ].collect do |ary| TreeItem.new(*ary) end August = [ ["Air Force Day", false, false, false, false, false, false, nil], ["Coast Guard Day", false, false, false, false, false, false, nil], ["Friendship Day", false, false, false, false, false, false, nil] ].collect do |ary| TreeItem.new(*ary) end September = [ ["Grandparents' Day", false, false, false, false, false, true, nil], ["Citizenship Day or Constitution Day", false, false, false, false, false, false, nil], ["Labor Day", true, true, true, true, false, true, nil] ].collect do |ary| TreeItem.new(*ary) end October = [ ["National Children's Day", false, false, false, false, false, false, nil], ["Bosses' Day", false, false, false, false, false, false, nil], ["Sweetest Day", false, false, false, false, false, false, nil], ["Mother-in-Law's Day", false, false, false, false, false, false, nil], ["Navy Day", false, false, false, false, false, false, nil], ["Columbus Day", false, true, false, true, false, false, nil], ["Halloween", false, false, false, false, false, true, nil] ].collect do |ary| TreeItem.new(*ary) end November = [ ["Marine Corps Day", false, false, false, false, false, false, nil], ["Veterans' Day", true, true, true, true, false, true, nil], ["Thanksgiving", false, true, false, true, false, false, nil] ].collect do |ary| TreeItem.new(*ary) end December = [ ["Pearl Harbor Remembrance Day", false, false, false, false, false, false, nil], ["Christmas", true, true, true, true, false, true, nil], ["Kwanzaa", false, false, false, false, false, false, nil] ].collect do |ary| TreeItem.new(*ary) end Toplevel = [ ["January", false, false, false, false, false, false, January], ["February", false, false, false, false, false, false, February], ["March", false, false, false, false, false, false, March], ["April", false, false, false, false, false, false, April], ["May", false, false, false, false, false, false, May], ["June", false, false, false, false, false, false, June], ["July", false, false, false, false, false, false, July], ["August", false, false, false, false, false, false, August], ["September", false, false, false, false, false, false, September], ["October", false, false, false, false, false, false, October], ["November", false, false, false, false, false, false, November], ["December", false, false, false, false, false, false, December] ].collect do |ary| TreeItem.new(*ary) end def initialize(main_window) @window = Gtk::Window.new(:toplevel) @window.screen = main_window.screen @window.title = "Tree Store" vbox = Gtk::Box.new(:vertical, 8) vbox.margin = 8 @window.add(vbox) label = Gtk::Label.new("Jonathan's Holiday Card Planning Sheet") vbox.pack_start(label) sw = Gtk::ScrolledWindow.new sw.shadow_type = :etched_in sw.set_policy(:automatic, :automatic) vbox.pack_start(sw, :expand => true, :fill => true, :padding => 0) create_model @treeview = Gtk::TreeView.new(@model) @treeview.selection.mode = :multiple add_columns sw.add(@treeview) # Expand all rows after the treeview widget has been realized @treeview.signal_connect("realize", &:expand_all) @window.set_default_size(650, 400) end def run if !@window.visible? @window.show_all else @window.destroy end @window end private def create_model @model = Gtk::TreeStore.new(String, TrueClass, TrueClass, TrueClass, TrueClass, TrueClass, TrueClass, TrueClass) Toplevel.each do |month| iter = @model.append(nil) iter[HOLIDAY_NAME_COLUMN] = month.label iter[ALEX_COLUMN] = false iter[HAVOC_COLUMN] = false iter[TIM_COLUMN] = false iter[OWEN_COLUMN] = false iter[DAVE_COLUMN] = false iter[VISIBLE_COLUMN] = false iter[WORLD_COLUMN] = false holidays = month.children # add children holidays.each do |holiday| child_iter = @model.append(iter) child_iter[HOLIDAY_NAME_COLUMN] = holiday.label child_iter[ALEX_COLUMN] = holiday.alex child_iter[HAVOC_COLUMN] = holiday.havoc child_iter[TIM_COLUMN] = holiday.tim child_iter[OWEN_COLUMN] = holiday.owen child_iter[DAVE_COLUMN] = holiday.dave child_iter[VISIBLE_COLUMN] = true child_iter[WORLD_COLUMN] = holiday.world_holiday end end end def add_toggle_column(label, col_index, attributes) renderer = Gtk::CellRendererToggle.new renderer.xalign = 0.0 renderer.signal_connect "toggled" do |_cell, path_str| path = Gtk::TreePath.new(path_str) iter = @model.get_iter(path) toggle_item = iter[col_index] toggle_item = !toggle_item iter[col_index] = toggle_item end col_offset = @treeview.insert_column(-1, label, renderer, attributes) column = @treeview.get_column(col_offset - 1) column.sizing = :fixed column.clickable = true end def add_columns # column for holiday names renderer = Gtk::CellRendererText.new renderer.xalign = 0.0 col_offset = @treeview.insert_column(-1, "Holiday", renderer, :text => HOLIDAY_NAME_COLUMN) column = @treeview.get_column(col_offset - 1) column.clickable = true add_toggle_column("Alex", ALEX_COLUMN, :active => ALEX_COLUMN, :visible => VISIBLE_COLUMN, :activatable => WORLD_COLUMN) add_toggle_column("Havoc", HAVOC_COLUMN, :active => HAVOC_COLUMN, :visible => VISIBLE_COLUMN) add_toggle_column("Tim", TIM_COLUMN, :active => TIM_COLUMN, :visible => VISIBLE_COLUMN, :activatable => WORLD_COLUMN) add_toggle_column("Owen", OWEN_COLUMN, :active => OWEN_COLUMN, :visible => VISIBLE_COLUMN) add_toggle_column("Dave", DAVE_COLUMN, :active => DAVE_COLUMN, :visible => VISIBLE_COLUMN) end end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/vertical_text_cursor.png000066400000000000000000000014671511343406000270440ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±IDATX…퓱KaÆŸ‰DIIJjIÛÁXè™Eè&…L¤CÌZHQÒL™;ù?8ø8E¤·©E*&%1`ËmMrÜ÷uжOr¡t»¼ËÇû>Ïó¾ðA@@@@@€¶m/õz½†RJu:óððð &ÑØÜÜ w»]CJ)ûý¾Ýn·óÀÔhßÇqÖ/..Rù|)åË™™™0=¿X[[[ŽF£oŠÅ¢¨V«•RÙÑÆ°×´eY-Ë;;;lmm‰D^Ÿ5çææ®ý¸»®+:Î+€½½=2™ š¦%€@ol€áp8-ÄÍÅ¥”Sš¦e¬óßÄb±¿&á0®ë†€¯áýý}Ýq¹°° €ªÅÅEuuu%kµÚõò¼@2™|Ôh4d½^éºN"‘ð·¶¥R‰ƒƒÒétâ6ÔøRÊ©ËËK\×euuU‡C«ÙlþBܸx<>›Édž–ËeLÓóóóŸä@)õ§Q¡ Ã8*‹ŸÇ§¿ØØØÐt]ÿà¥96ÀéééI.—{«”™¦ùØ~ú p~~þb0¬·Z­0€auÏÆ{– …ÂûT*õüøøøk¥RÙjŒ|¡1$WVVÞe³ÙeÛ¶¯···«ý~¿|÷ hÀn¶>¾î"@ú¶ðhƒ 4þ?¿¨åI Ô,3IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/w_resize_cursor.png000066400000000000000000000025131511343406000260070ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±(IDATX…í–OH#wÇ?3‰7fµíª¡ b¡ bi…^L½ìIB•µ· ö ÂâÅK¡ˆ=˜F…*zëa¡X {ð æ$¬m=ê¡ØŠÖ‰UÓ5&šÉLæ×ÃLjÖŒk²ÚÃ~áGÂ{¿yï;ïß_‡Ýn%ªªjkkk;@Ð4ž¶0£c´Þ±y #œôõõ=s8ñ±±±'º®ãóù²¯@³0#LyP(d™ˆ{ÝÝÝßÍÏÏë^¯÷óËËËl‚Ià¥Iä&™ % 1ଫ«kraaAžššz²³³“í@Ç¿úõ¦ñs`¯³³sÜï÷?ohhÈD gþßËhšvÖÐÐ zzzBÐÜÜ,EIr¾L$ö:::¾õûýRSSÓÇ€Š;Á>==ÝzttÐu]!D4½üø cíÊ,žvŒ‘úáÌÌÌ7ÀcŒŸq[ÈdÀ ¼|€± K@øØþÆH…Ø0Q—ùÿ/ŒB´jÃÜ·µ àØÃh§é製â\…9S1ó®ÍüÍ; 7m-™ð–b,™`äWÁ:ÏÙÛÐã†Ò‹P¨· IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/wait_cursor.png000066400000000000000000000037351511343406000251330ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±ºIDATX…í—]hTÛÇgN2ÉdLæ#f&Iëµ5!1P“RáV|5 …ˆׇ¢¥‚Z>X¡E[!ÆŠ>ˆ[¥/Õ—R I´/—Ë\}h›¡‘|™x3ÉdÆdÎ×êCæœfb4ÞK¡/]°8{öœ³Öý×Þk¯ ÿ—ÿ±(ßôÙì>¾ ¸€1`x|®(Šü7A""ù¦iþBDþ)kˆeY£º®ÿz||¼ˆoàjη‹ÈßWs¦ëºd2™÷I§Ó?Y Äÿ4 㪪 àáǼxñ‚7oÞà÷ûÙ¼y3;w½ââbÛ„õöíÛßx½Þß’Õ`ÆOUU½eÿ¾wï×®]cbbq@QGÇŽãÀ(Ê’ùd2ù[ŸÏ× X+A¬ @×õOóòò…¦irñâEz{{1M¡±±‘ÖÖVêêêðx<ŒFéïï@UUöìÙCww7………Ö«W¯>Û¸qãŸW‘#"¢ŠÈWv.»»»¥¶¶Vª««¥¹¹Ynݺ%?–X,&ããã¢iš“÷D"!G•êêj©­­•ÎÎN1MÓ^/SçÏŸ±´kQW8wîÜ!—Ëõs€ÁÁA._¾ŒaÔÕÕ±oß>Ün7™L†ÅÅE,ËÂívãõz(,,¤µµ€'OžÇñûý444àr¹¼UUU®«W¯þ5ËÂê)°,ëKEQêu]§­­xqÞGËŽ ¿¿_¶mÛ&ëׯ—@ >ŸÏãóù$Hii©Ô××KoooΚ¸qãÆ ðPxWI}nX*P¥}}}¿ÒuÝiú4M“H$"‡–¦¦&©¬¬”ŠŠ Ùºu«ÖßßÿtÓ¦M{Ìð)€-qý €²;wnpû|>6oÞ¼äü3gÎP0=}útÖwü~ÿ%IŠæää2™LôüùsÖÓÓÓUPPðSÈЃ×qÿ€tÓJKKçº\®3£ÑH(77—$IbçOÄɨ%Ir×ÕÕ%Ñ755ñ‘‘‘‘ùóç 3î@Àív;ÙívÀ¾råÊY^¯÷ùùóçyÂÍf#ŸÏ÷4>% Â;w>!"Z°` ‚‚bŒQ[[Ûoüà­‰©$@hœNçvÎ9ÏÏÏ'´páB""jjjZ˜Š€`0*$Iâ‡PYY EQ‚ûöíû À+¬ŽëÛ’°¯uòäɯE UVVîÝ»‡`0È‹‹‹w-Õq3<看P^^Ž`0ø°»»û%€N?JE]|×ÍcÚÿ½páÂ솆çœ9s~Œ1 ’ ´¢ˆ…'É€Z҇‡“4 ®R©ãƒÍv»D”ÔêêjTWW¿a³Ûí0 ¥§§»F#KøÔju€´T ¨%I’õz}Òè÷ûEµZo~k³ÙôÍͯ7ºgÏÀ‰'’6·Û ¯@E½×ëMÆ[¯×“ßïÆ×@ñÍž=;it¹\EñÇñæz‡Ãau8‰ø­^³f $vmÛ€&Ä9ŸóäÉ“$£yyyB__Ÿ„ !ïíí}’““£ÊÏÏ\»v :îcY–g¸ À `M\iÌ|c·hUe®V«ÑÖÖ(**Bnn®øàÁƒ>¼yk’¢5 I’äÝ»wE‘ººº"‘H¤5Åø‰®!@–åvvv*¢(ÚµkƒÁÈÔ©S«ü)Þ5óÝ»w===L¥RZ²d qÎ9ízk¼ßb±Åb!¾±D´›1Æ-ZDH¥R‘Ëåb7nÜp¨@ìJ 0.[¶ìw‘H„mÞ¼9ùîß¿ŸˆˆÑï‰(q–¸×_ÅVшˆïÝ»79Û¶mÄã‹/>  €&£èü¼­­ížßïgf³9édëÖ­‰D˜,˽D´™ˆ¦Ù±‰ˆ6˲ü(‰°-[¶$ç•––R0äv»Ý`-b¹dÂ| P˜••µýÑ£GC?fƒ!élæÌ™téÒ¥h8Ž1ÆƘBD‡£MMMÑ¢¢¢7Š“Q]]ÝßË æ‚ S,,++û‹Çãyåv»YyyùN322¨¢¢‚jjj¨¦¦†***&,ÕA úúzbŒ±ŽŽŽmHñ ¿-*Ë vtt< ‡Ãüøñã4mÚ´ ëÁ„fgg“Íf£––ž––6„ßï_7 ÑøÀ*­V{Øf³}íõzÃ@€µ´´ðÚÚZ²X,d2™(//ÊÊÊhÆ tñâE ¹ßïHkkë÷!ÄA˜üÀÞœœœúcÇŽ}ít:ÝŠ¢$ëÁ„Ȳíêêò=zô_ÙÙÙgV¯^mOâÔ©S)A¤B#ÄÃñ€Ë„ÐgddL)..Ö›Íf½(Šxöì™|ÿþýQY–ƒ¾ X­ÖòÆÆÆÏnݺ¥ªªªE ¨¯¯ÇŽ;¢CCCŸ˜L¦4"béóÄÎÆtÄ®’±¬& öþŒŒ3̵Z­‹?»y󦪺ºZP¢(¢¯¯/ªÕj?7û˶“Š0H#€|ÅJÆÙÉA¬rÒÄÌðk«Õz>D®^½Êu:åææ’×ëÞ¾}ûsLð*N$¡"b!J3cûcßñêÕ+Ùçó±@ À†††|%%%ëdÞûϯ¯^¢ðL%QÄB#uww+W®\ñpΕöööþ7^èàþ~ÿoï&€æÆ¿*O8|@þH€H0 1ÊU^ vXÃè‚Re9I2»ãIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/gtk-demo/zoom_out_cursor.png000066400000000000000000000041721511343406000260360ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsttÞfxtEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub Steineræû÷/5tEXtDescriptionInverted variant of the DMZ cursor theme.hu[<3tEXtSourcehttp://jimmac.musichall.cz/themes.php?skin=7P3•±WIDATX…µWmLTÙ~î½30Cq¬˜e˜¶ÊT¢TìŠJƒÕÄ´‰1 šìb5ÄøU5­UP[kÛ`pìFRw©1E ØTMHcÔìZ´¨>ŽC–gæëÞ™sÞþ˜™[\†7铜ÜÜsîûžç<ç¼ïy¯€9Àçóu:Ýf"úq8ÎEÑœóA­Vë¡% ÝIMMž‹¿Éf ƒ‹$IúF£±*ŠÂïÞ½+ôôôˆ€¬¬,X,¾qãFJJJ#‘È_cUz½þË÷%2Œ±Ÿ2ƧөX­VÒëõ aÓëõ´cÇêëëS"‘ˆ¢(ÊÁÙ7-%EQ>åœóªª*ÒjµS&Ôét¤Óé¦ôkµZ:uêqÎy0ü¬±±QzßùY–kdYf›7oV ‚@¥¥¥tóæMþöí[F1Œ±ææf^RRB‚ ¨ßoÙ²…Ea>Ÿïï¥D0,ãœSYY™êÌb±ÐóçÏcŒwtt8._¾ü÷Ó§OzæÌ™?]½zõo]]]/8çÜn·³¼¼<Õ®¢¢‚8ç4::ºsN$Z[[çƒÁÑ .¨N Éãñ°¾¾¾W{öìù€Ur|;Ö²:tè@¿Ëãñ°U«V©ö/^¤@ 0ZWW·`6‚×ëýµÏ狤§§2›ÍôæÍÖÝÝÝ™ýH Åœ DÉæçç¯t:ÿf&“‰PFFù|>688øÛØ·ÓBãóù\555*û††>222²zõê¤ÆL· @òÖ­[—ºÝî7×®]ãq?6›<Ï«ù„ö£G>$"Z³f  ììlbŒQKKËÏ|c6ù&‘ÐÚíöœs¾hÑ"@EEEDDÔÐÐP4 ¢Ãá8611ÁDQ$tôèQ ƒþeË–•¾ÀöYZ €Œ²²2C(ò9r„$Iä÷ûÙÓ§O«hÐ8Ž?öôô„ã²]¹r…ÆÆÆþ3è' í?DÇóÅ¥K—ÔþÞÞÞȳgÏþ `ÞWÕhDQü`xxX0\’¤–¦¦&ÑŒ­©© – ääd—ÉdbqCCC‚F£É4eõˆ@Ù`0¨^¯WÔh4©±× ›ÍfhllL¤ž —Ëã Š¢Áív«ûm0ÈëõFbóM! ŽŒŒx–/_®v:Nˆ¢¸,öº³­­ÍÚÖÖ6[Zeçüû/_¾TÍÌ̇ÓÂÔººº£DDñ“»víZ""’e¹`–I§@Q”•“#*77—ˆˆŽ?þF$ˆ(Ñh,ôù|rü䊢Háp8|ç} ȲüŽŽ%Q‡¦@ ž?~)€o%" `yüø±½»»›I’DhÆ Ä9çDtx®“ÑÆ_·n‚N§“Ý»wÏ  ¢ˆî‹iÓ¦M¿‡Ã¬²²R Ÿ'Nq"ú%M{ˆH"¢_?vì˜j¿ÿ~bŒñõë×WÈÇ4y@`ðÖ––y½^f±XT'ûöí£p8ÌdYî!¢J"Êš4±™ˆ*eYî ‡ÃlïÞ½ª]~~>ÞÔÔÔ`¢ mÚû@ gÁ‚z{{‡^¼xÁŒF£êlÉ’%tãÆH(Š1ÆƘBD …" ‘ÜÜÜw’ÒÉ“'‰ˆ¨¦¦æ¯> wA\…yŠ ~?888îr¹ØŠ+Þqš’’BÅÅÅT^^NåååT\\4›Ííh&9Dº#€,DCÉ€è­& šÿýF Äž)VZ­Öõõõõß¿_Ú¶m› ( DQ„ÃáˆètºOL&ÓqDoÛ¯ût0X`1€<91uÒ­œ´1KüÄjµ^óûýáÛ·os½^Oäv»#>üÓdÅ™ˆL.D%ÄnÒ¯ŒÅ¿}‡Äøø¸ìñx˜ßïgCCCž¼¼¼Òïýç‚ÿ…^¼ðL„¢[ãëêêRnݺ5È9WZ[[ûvïÞ}«¿¿¿€ @èëý¿Í =€ïX{J^hð%ùÿI N"ÀBD%—Œ!zXCè¿6äWS‹QfIEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/000077500000000000000000000000001511343406000213005ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/aboutdialog.rb000077500000000000000000000023641511343406000241270ustar00rootroot00000000000000#!/usr/bin/env ruby =begin aboutdialog.rb - Ruby/GTK sample script. Copyright (c) 2005-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" unless Gtk::Version.or_later?(3, 4, 2) puts "This sample requires GTK+ 3.4.2 or later: #{Gtk::Version::STRING}" exit end a = Gtk::AboutDialog.new a.artists = ["Artist 1 ", "Artist 2 "] a.authors = ["Author 1 ", "Author 2 "] a.comments = "This is a sample script for Gtk::AboutDialog" a.copyright = "Copyright (C) 2020 Ruby-GNOME Project" a.documenters = ["Documenter 1 ", "Documenter 2 "] a.license = "This program is licenced under the same licence as Ruby-GNOME." 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" a.website = "https://ruby-gnome2.osdn.jp" a.website_label = "Ruby-GNOME Project Website" a.signal_connect("activate-link") do |_widget, uri| p _widget.class p uri end p a.run ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/aboutdialog2.rb000077500000000000000000000022651511343406000242110ustar00rootroot00000000000000#!/usr/bin/env ruby =begin aboutdialog2.rb - Ruby/GTK sample script. Copyright (c) 2005-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" unless Gtk::Version.or_later?(3, 4, 2) puts "This sample requires GTK+ 3.4.2 or later: #{Gtk::Version::STRING}" exit end about_dialog = Gtk::AboutDialog.show( nil, "artists" => ["Artist 1 ", "Artist 2 "], "authors" => ["Author 1 ", "Author 2 "], "comments" => "This is a sample script for Gtk::AboutDialog", "copyright" => "Copyright (C) 2005-2020 Ruby-GNOME Project", "documenters" => ["Documenter 1 ", "Documenter 2 "], "license" => "This program is licenced under the same licence as Ruby-GNOME.", "logo_icon_name" => "gtk-home", "program_name" => "Gtk::AboutDialog sample", "translator_credits" => "Translator 1 \nTranslator 2 \n", "version" => "1.0.0", "website" => "https://ruby-gnome2.osdn.jp", "website_label" => "Ruby-GNOME Project Website" ) about_dialog.signal_connect('delete_event') do Gtk.main_quit end Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/alpha-demo.rb000077500000000000000000000033141511343406000236400ustar00rootroot00000000000000#!/usr/bin/env ruby =begin alpha-demo.rb - alpha blended window sample script. (need xcompmgr) Original: alphademo.py by Mike Hearn (*1) and David Trowbridge (*2) * (1) http://plan99.net/~mike/blog/2006/06/05/alpha-blended-windows-in-python/ * (2) http://david.navi.cx/blog/?p=91 Translated to Ruby by Juergen Mangler Copyright (c) 2006-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" require "cairo" class AlphaDemo < Gtk::Window def initialize super() set_app_paintable(true) set_title("AlphaDemo") set_decorated(false) set_default_size(200, 220) signal_connect("delete_event") do Gtk.main_quit end set_double_buffered(false) signal_connect("draw") do |widget, _event| cr = widget.window.create_cairo_context rgba = [1.0, 1.0, 1.0] rgba << 0.0 if @supports_alpha cr.set_source_rgba(rgba) cr.set_operator(Cairo::OPERATOR_SOURCE) cr.paint twidth, theight = widget.size cr.set_source_rgba(1.0, 0.2, 0.2, 0.6) radius = [twidth, theight].min.to_f / 2 - 0.8 cr.arc(twidth.to_f / 2, theight.to_f / 2, radius, 0, 2.0 * Math::PI) cr.fill_preserve cr.stroke end signal_connect("screen-changed") do |widget, _old_screen| screen_changed(widget) end screen_changed(self) end def screen_changed(widget) visual = widget.screen.rgba_visual if visual && widget.screen.composited? set_visual(visual) @supports_alpha = true else set_visual(widget.screen.system_visual) @supports_alpha = false end end end alpha = AlphaDemo.new alpha.show Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/app-menu.ui000066400000000000000000000007371511343406000233700ustar00rootroot00000000000000
_About app.about
_Quit app.quit
ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/application.rb000077500000000000000000000015111511343406000241310ustar00rootroot00000000000000#!/usr/bin/env ruby =begin application.rb - Ruby/GTK version of the example-1.c at https://developer.gnome.org/gtk3/stable/gtk-getting-started.html Copyright (c) 2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" myapp = Gtk::Application.new("org.gtk.example", :handles_command_line) myapp.signal_connect "command-line" do |app, command_line| app.activate 0 end myapp.signal_connect "activate" do |app| win = Gtk::ApplicationWindow.new(app) win.set_title("window") win.set_default_size 200, 200 button_box = Gtk::ButtonBox.new(:horizontal) win.add(button_box) button = Gtk::Button.new(:label => "Hello World") button.signal_connect "clicked" do puts "Hello World" win.destroy end button_box.add(button) win.show_all end myapp.run ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/assistant.rb000077500000000000000000000173061511343406000236500ustar00rootroot00000000000000#!/usr/bin/env ruby =begin test-assistant.rb - Ruby/GTK version of testassistant.c from gtk+ 2.10 sources. Guillaume Cottenceau for the ruby-gnome2 project. Copyright (c) 2005-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class AssistantRunner def initialize @simple_assistant = nil @generous_assistant = nil @selected_branch = "A" @nonlinear_assistant = nil end def run_simple_assistant @simple_assistant = run_assistant(@simple_assistant, :create_simple_assistant) end def run_generous_assistant @generous_assistant = run_assistant(@generous_assistant, :create_generous_assistant) end def run_nonlinear_assistant @nonlinear_assistant = run_assistant(@nonlinear_assistant, :create_nonlinear_assistant) end private def run_assistant(assistant, assistant_create_method) assistant ||= send(assistant_create_method) if !assistant.visible? assistant.show else assistant.destroy assistant = nil end assistant end def add_completion_test_page(assistant, text, visible, complete) page = Gtk::Box.new(:vertical, 0) check = Gtk::CheckButton.new("Complete") page.add(Gtk::Label.new(text)) page.add(check) check.active = complete check.signal_connect("toggled") do complete = check.active? assistant.set_page_complete(page, complete) end page.show_all if visible assistant.append_page(page) assistant.set_page_title(page, text) assistant.set_page_complete(page, complete) page end def create_test_page(text) Gtk::Label.new(text) end def prepare_cb(assistant, page) if page.is_a?(Gtk::Label) puts "prepare: #{page.text}" elsif assistant.get_page_type(page) == :progress progress = page.child assistant.set_page_complete(page, false) progress.fraction = 0.0 GLib::Timeout.add(300) do page = assistant.get_nth_page(assistant.current_page) progress = page.child value = progress.fraction = (progress.fraction + 0.1).round(1) continue = value < 1.0 assistant.set_page_complete(page, true) unless continue continue end else puts "prepare: #{assistant.current_page}" end end def create_simple_assistant assistant = Gtk::Assistant.new assistant.set_default_size(400, 300) assistant.signal_connect("cancel") do puts "cancel" assistant.hide end assistant.signal_connect("close") do puts "close" assistant.hide end assistant.signal_connect("apply") do puts "apply" end assistant.signal_connect("prepare") do |_assistant, page| prepare_cb(_assistant, page) end page = create_test_page("Page 1") page.show assistant.append_page(page) assistant.set_page_title(page, "Page 1") assistant.set_page_complete(page, true) page = create_test_page("Page 2") page.show assistant.append_page(page) assistant.set_page_title(page, "Page 2") assistant.set_page_type(page, :confirm) assistant.set_page_complete(page, true) end def create_generous_assistant assistant = Gtk::Assistant.new assistant.set_default_size(400, 300) assistant.signal_connect("cancel") do puts "cancel" assistant.hide end assistant.signal_connect("close") do puts "close" assistant.hide end assistant.signal_connect("apply") do puts "apply" end assistant.signal_connect("prepare") do|_assistant, page| prepare_cb(_assistant, page) end page = create_test_page("Introduction") page.show assistant.append_page(page) assistant.set_page_title(page, "Introduction") assistant.set_page_type(page, :intro) assistant.set_page_complete(page, true) page = add_completion_test_page(assistant, "Content", true, false) next_page = add_completion_test_page(assistant, "More Content", true, true) check = Gtk::CheckButton.new("Next page visible"); check.active = true check.signal_connect("toggled") do puts "beuh" next_page.visible = check.active? end check.show page.add(check) add_completion_test_page(assistant, "Even More Content", true, true) page = create_test_page("Confirmation") page.show assistant.append_page(page) assistant.set_page_title(page, "Confirmation") assistant.set_page_type(page, :confirm) assistant.set_page_complete(page, true) page = Gtk::Alignment.new(0.5, 0.5, 0.9, 0.0) page.add(Gtk::ProgressBar.new) page.show_all assistant.append_page(page) assistant.set_page_title(page, "Progress") assistant.set_page_type(page, :progress) assistant.set_page_complete(page, true) page = create_test_page("Summary") page.show assistant.append_page(page) assistant.set_page_title(page, "Summary") assistant.set_page_type(page, :summary) assistant.set_page_complete(page, true) end def create_nonlinear_assistant assistant = Gtk::Assistant.new assistant.set_default_size(400, 300) assistant.signal_connect("cancel") do puts "cancel" assistant.hide end assistant.signal_connect("close") do puts "close" assistant.hide end assistant.signal_connect("apply") do puts "apply" end assistant.signal_connect("prepare") do |_assistant, page| prepare_cb(_assistant, page) end assistant.set_forward_page_func do |current_page| retval = -1 if current_page == 0 if @selected_branch == "A" retval = 1 else retval = 2 end elsif current_page == 1 || current_page == 2 retval = 3 end retval end page = Gtk::Box.new(:vertical, 6) button = Gtk::RadioButton.new(:label => "branch A") page.pack_start(button, :expand => false, :fill => false, :padding => 0) button.signal_connect("toggled") do @selected_branch = "A" end button.active = true button = Gtk::RadioButton.new(:label => "branch B") page.pack_start(button, :expand => false, :fill => false, :padding => 0) button.signal_connect("toggled") do @selected_branch = "B" end page.show_all assistant.append_page(page) assistant.set_page_title(page, "Page 1") assistant.set_page_complete(page, true) page = create_test_page("Page 2A") page.show assistant.append_page(page) assistant.set_page_title(page, "Page 2A") assistant.set_page_complete(page, true) page = create_test_page("Page 2B") page.show assistant.append_page(page) assistant.set_page_title(page, "Page 2B") assistant.set_page_complete(page, true) page = create_test_page("Confirmation") page.show assistant.append_page(page) assistant.set_page_title(page, "Confirmation") assistant.set_page_type(page, :confirm) assistant.set_page_complete(page, true) end end runner = AssistantRunner.new buttons = [ ["simple assistant", proc {runner.run_simple_assistant}], ["generous assistant", proc {runner.run_generous_assistant}], ["nonlinear assistant", proc {runner.run_nonlinear_assistant}] ] if ENV["RTL"] Gtk::Widget.default_direction = Gtk::Widget::TEXT_DIR_RTL end window = Gtk::Window.new(:toplevel) window.signal_connect("destroy") {Gtk.main_quit} window.signal_connect("delete-event") {false} box = Gtk::Box.new(:vertical, 6) window.add(box) buttons.each do |label, callback| button = Gtk::Button.new(:label => label) button.signal_connect("clicked") do callback.call end box.pack_start(button, :expand => true, :fill => true, :padding => 0) end window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/bindings.rb000066400000000000000000000065041511343406000234270ustar00rootroot00000000000000#!/usr/bin/env ruby =begin bindings.rb - Ruby/GTK sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end =begin Usage: bindings.rb Following key bindings are effective in the TextView area. + l : scroll down by one page + m : scroll up by one page + j : move cursor donw by one line + k : move cursor up by one line clicking buttons cause following effect "Ctrl + l" : same as pressing + l in text view area. "Ctrl + m" : same as pressing + m in text view area. "cancel Ctrl +j/k" : disable + j and + k bindings. =end require "gtk3" class Pager < Gtk::TextView def initialize(path) @path = path super() load set_editable(false) set_size_request(400, 400) end private def load open(@path).read.each_line do |line| buffer.insert_at_cursor(line) end buffer.place_cursor(buffer.start_iter) end end file_path = ARGV[0] || __FILE__ window = Gtk::Window.new window.name = "pager_window" css_provider = Gtk::CssProvider.new if Gtk::Version.or_later?(3, 20, 0) css_provider.load(:data => <j" { "move-cursor" (display-lines, 1, 0) }; bind "k" { "move-cursor" (display-lines, -1, 0) }; bind "l" { "move-cursor" (buffer-ends, 1, 0) }; bind "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 => <j" { "move-cursor" (display-lines, 1, 0) }; bind "k" { "move-cursor" (display-lines, -1, 0) }; bind "l" { "move-cursor" (buffer-ends, 1, 0) }; bind "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")) hbox.add(button2 = Gtk::Button.new(:label => "Ctrl + m")) hbox.add(button3 = Gtk::Button.new(:label => "Cancel Ctrl + j/k")) vbox = Gtk::Box.new(:vertical) sw = Gtk::ScrolledWindow.new sw.set_size_request(500, 500) pager = Pager.new(file_path) pager.style_context.add_provider(css_provider, Gtk::StyleProvider::PRIORITY_USER) sw.add(pager) vbox.add(hbox) vbox.add(sw) window.add(vbox) window.show_all window.signal_connect("destroy") { Gtk.main_quit } binding_set = Gtk::BindingSet.find("MoveCursor") button1.signal_connect "clicked" do binding_set.activate(Gdk::Keyval::KEY_l, Gdk::ModifierType::CONTROL_MASK, pager) pager.grab_focus end button2.signal_connect "clicked" do binding_set.activate(Gdk::Keyval::KEY_m, Gdk::ModifierType::CONTROL_MASK, pager) pager.grab_focus end button3.signal_connect "clicked" do binding_set.remove(Gdk::Keyval::KEY_j, Gdk::ModifierType::CONTROL_MASK) binding_set.remove(Gdk::Keyval::KEY_k, Gdk::ModifierType::CONTROL_MASK) pager.grab_focus end pager.grab_focus Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/builder-from-resource.rb000077500000000000000000000025511511343406000260470ustar00rootroot00000000000000#!/usr/bin/env ruby =begin builder_from_resource.rb - Ruby/GTK sample script. Copyright (c) 2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" require "fileutils" current_path = File.expand_path(File.dirname(__FILE__)) # The gresource file name gresource_bin = "#{current_path}/simple_window.gresource" # The gresource xml file name # see here https://developer.gnome.org/gio/stable/GResource.html gresource_xml = "#{current_path}/simple_window.gresource.xml" # Generate the resource file: # see here https://developer.gnome.org/gio/stable/glib-compile-resources.html Dir.chdir(File.dirname(gresource_xml)) do system("glib-compile-resources", "--target", gresource_bin, File.basename(gresource_xml)) end at_exit do FileUtils.rm_f(gresource_bin) end resource = Gio::Resource.load(gresource_bin) Gio::Resources.register(resource) # Reference: # https://developer.gnome.org/gtk3/stable/GtkBuilder.html builder = Gtk::Builder.new(:resource => "/simple_window/simple_window.ui") window = builder.get_object("window") window.set_title "Build interface from resource" window.set_default_size 300, 300 label = builder["label"] label.text = "My UI was created with Glade" window.show_all window.signal_connect "destroy" do Gtk.main_quit Gio::Resources.unregister(resource) end Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/builder.rb000066400000000000000000000014251511343406000232550ustar00rootroot00000000000000#!/usr/bin/env ruby =begin builder.rb - Ruby/GTK version of gtk+/examples/builder.c. https://git.gnome.org/browse/gtk+/tree/examples/builder.c?h=gtk-3-16 Copyright (c) 2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" ui_file = File.expand_path("builder.ui", __dir__) builder = Gtk::Builder.new builder.add_from_file(ui_file) win = builder.get_object("window") win.signal_connect("delete-event") { Gtk.main_quit } button = builder.get_object("button1") button.signal_connect "clicked" do puts "Hello World!" end button = builder.get_object("button2") button.signal_connect "clicked" do puts "Hello World!" end button = builder.get_object("quit") button.signal_connect("clicked") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/builder.ui000066400000000000000000000027311511343406000232700ustar00rootroot00000000000000 True Grid 10 True True Button 1 0 0 True Button 2 1 0 True Quit 0 1 2 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/button-menu.ui000066400000000000000000000011471511343406000241170ustar00rootroot00000000000000
horizontal-buttons Copy app.copy edit-copy-symbolic Paste app.paste edit-paste-symbolic
ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/button.rb000066400000000000000000000031611511343406000231410ustar00rootroot00000000000000#!/usr/bin/env ruby =begin button.rb - Ruby/GTK sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("buttons") window.border_width = 0 window.signal_connect("delete_event") do Gtk.main_quit end box1 = Gtk::Box.new(:vertical, 0) window.add(box1) grid = Gtk::Grid.new grid.set_row_spacing(5) grid.set_column_spacing(5) grid.set_border_width(10) box1.pack_start(grid, :expand => true, :fill => true, :padding => 0) button = [] 0.upto(8) do |i| button.push Gtk::Button.new(:label => "button" + (i + 1).to_s) end 0.upto(8) do |i| button[i].signal_connect("clicked") do p [i] j = (i + 1) % 9 if button[j].visible? button[j].hide else button[j].show end end button[i].show end grid.attach(button[0], 0, 0, 1, 1) grid.attach(button[1], 1, 1, 1, 1) grid.attach(button[2], 2, 2, 1, 1) grid.attach(button[3], 0, 2, 1, 1) grid.attach(button[4], 2, 0, 1, 1) grid.attach(button[5], 1, 1, 1, 1) grid.attach(button[6], 1, 0, 1, 1) grid.attach(button[7], 2, 1, 1, 1) grid.attach(button[8], 0, 1, 1, 1) separator = Gtk::Separator.new(:vertical) box1.pack_start(separator, :expand => false, :fill => true, :padding => 0) box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2, :expand => false, :fill => true, :padding => 0) close = Gtk::Button.new(:label => "close") close.signal_connect("clicked") do Gtk.main_quit end box2.pack_start(close, :expand => true, :fill => true, :padding => 0) close.can_default = true close.grab_default window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/button2.rb000066400000000000000000000011511511343406000232200ustar00rootroot00000000000000#!/usr/bin/env ruby =begin button2.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2020 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new("Gtk::Button sample") button1 = Gtk::Button.new(:mnemonic => "_HELLO") button2 = Gtk::Button.new(:label => "_HELLO") button3 = Gtk::Button.new(:stock_id => Gtk::Stock::QUIT) button3.signal_connect("clicked"){ Gtk.main_quit } box = Gtk::Box.new(:vertical) box.add(button1) box.add(button2) box.add(button3) window.add(box) window.set_default_size(100, 100) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/buttonbox.rb000066400000000000000000000040341511343406000236520ustar00rootroot00000000000000#!/usr/bin/env ruby =begin buttonbox.rb - Ruby/GTK3 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" def create_bbox_window(horizontal, title, pos, spacing, layout) window = Gtk::Window.new(title) window.signal_connect("delete_event") do window.destroy end box1 = Gtk::Box.new(:vertical, 0) window.add(box1) if horizontal window.set_default_size(550, 60) window.move(150, pos) bbox = Gtk::ButtonBox.new(:horizontal) else window.set_default_size(150, 400) window.move(pos, 200) bbox = Gtk::ButtonBox.new(:vertical) end bbox.layout_style = layout bbox.spacing = spacing box1.border_width = 25 box1.pack_start(bbox, :expand => true, :fill => true, :padding => 0) button = Gtk::Button.new(:label => "OK") bbox.add(button) button.signal_connect("clicked") do window.destroy end button = Gtk::Button.new(:label => "Cancel") bbox.add(button) button.signal_connect("clicked") do window.destroy end button = Gtk::Button.new(:label => "Help") bbox.add(button) window.show_all end def test_hbbox create_bbox_window(true, "Spread", 50, 40, :spread) create_bbox_window(true, "Edge", 250, 40, :edge) create_bbox_window(true, "Start", 450, 40, :start) create_bbox_window(true, "End", 650, 15, :end) end def test_vbbox create_bbox_window(false, "Spread", 50, 40, :spread) create_bbox_window(false, "Edge", 250, 40, :edge) create_bbox_window(false, "Start", 450, 40, :start) create_bbox_window(false, "End", 650, 15, :end) end window = Gtk::Window.new("button box") window.signal_connect("delete_event") do Gtk.main_quit end window.border_width = 20 bbox = Gtk::ButtonBox.new(:horizontal) window.add(bbox) button = Gtk::Button.new(:label => "Horizontal") button.signal_connect("clicked") do test_hbbox end bbox.add(button) button = Gtk::Button.new(:label => "Vertical") button.signal_connect("clicked") do test_vbbox end bbox.add(button) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/cairo-cursor.rb000066400000000000000000000021011511343406000242270ustar00rootroot00000000000000=begin cairo_cursor.rb Ruby/GTK3 script Adapted from https://developer.gnome.org/gtk3/stable/ch25s02.html#id-1.6.3.4.5 Copyright (c) 2015-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new("Gdk cursor sample") window.signal_connect("destroy") { Gtk.main_quit } # see cairo formats information here: # http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-format-t surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 6, 6) cr = Cairo::Context.new(surface) cr.set_source_rgba(0, 1, 0, 0.7) cr.arc(3, 3, 3, 0, 2 * Math::PI) cr.fill cr.destroy pixbuf = surface.to_pixbuf(src_x: 0, src_y: 0, width: 6, heihgt: 6) cursor = Gdk::Cursor.new(pixbuf, 0, 0) # generate the underlaying GDK resource associated with the window widget. # Here just create window.window without calling #show_all method. window.realize window.window.set_cursor(cursor) label = Gtk::Label.new("Put your cursor on this window.") window.add(label) window.set_default_size(200, 100) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/cairo-pong.rb000077500000000000000000000106011511343406000236640ustar00rootroot00000000000000#!/usr/bin/env ruby =begin cairo-pong.rb - Ruby/GTK with cairo sample script. Original: gtkcairo sample by Evan Martins. Copyright (c) 2005-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" unless Gdk.cairo_available? raise "GTK+ 2.8.0 or later and cairo support are required." end module Pong class CenteredItem attr_accessor :x, :y attr_reader :width, :height def initialize(x, y, width, height) @x = x @y = y @width = width @height = height end def min_x @x - @width / 2 end def max_x @x + @width / 2 end def min_y @y - @height / 2 end def max_y @y + @height / 2 end end class CenteredCircle < CenteredItem def draw(cr) cr.translate(min_x, min_y) cr.scale(@width, @height) cr.arc(0.5, 0.5, 0.5, 0, 2 * Math::PI) cr.fill end end class CenteredRect < CenteredItem def draw(cr) cr.translate(min_x, min_y) cr.scale(@width, @height) cr.rectangle(0, 0, 1, 1) cr.fill end end class Ball < CenteredCircle attr_accessor :dx, :dy def initialize(dx = 0.02, dy = 0.02) super(0.8, 0.5, 0.04, 0.04) @dx = dx @dy = dy end def update @x += @dx @y += @dy # ball bouncing if max_y > 1 @y = 1 - (max_y - 1) @dy *= -1 elsif min_y < 0 @y -= min_y @dy *= -1 end if max_x > 1 @x = 1 - (max_x - 1) @dx *= -1 elsif min_x < 0 @x -= min_x @dx *= -1 end end end class Paddle < CenteredRect def initialize(field, x, y) super(x, y, 0.05, 0.3) @field = field end def update(ball) # is the ball coming towards us? if (ball.x < @x && ball.dx > 0) || (ball.x > @x && ball.dx < 0) # move to intercept it @y = ball.y end end def ball_hit?(ball) ball.y > min_y && ball.y < max_y end def update_ball(ball) if ball_hit?(ball) if ball.min_x < @x && ball.max_x > min_x # hit our left side ball.x -= (ball.max_x - min_x) ball.dx = -ball.dx elsif ball.max_x > @x && ball.min_x < max_x # hit our right side ball.x += (max_x - ball.min_x) ball.dx = -ball.dx end end end end class Field attr_accessor :width, :height def initialize(margin = 0.05) @margin = margin @left_paddle = Paddle.new(self, @margin, 0.5) @right_paddle = Paddle.new(self, 1 - @margin, 0.7) @paddles = [@left_paddle, @right_paddle] @ball = Ball.new end def update @paddles.each do |paddle| paddle.update(@ball) end @ball.update @paddles.each do |paddle| paddle.update_ball(@ball) end end def draw(cr) cr.set_source_rgb(1, 1, 1) cr.rectangle(0, 0, 1, 1) cr.fill cr.save do cr.set_source_rgba(0.8, 0.8, 0.8, 0.8) cr.set_line_join(Cairo::LINE_JOIN_ROUND) @paddles.each do |paddle| cr.save { paddle.draw(cr) } end end cr.set_source_rgb(0, 0, 0) cr.save { @ball.draw(cr) } end end class Window < Gtk::Window def initialize(speed = 30) super() @speed = speed self.title = "Pong Demonstration" signal_connect("destroy") { Gtk.main_quit } signal_connect("key_press_event") do |widget, event| if event.state.control_mask? && event.keyval == Gdk::Keyval::KEY_q destroy true else false end end set_default_size(260, 200) @field = Field.new @drawing_area = Gtk::DrawingArea.new set_draw vb = Gtk::Box.new(:vertical, 5) vb.border_width = 10 vb.pack_start(@drawing_area, :expand => true, :fill => true, :padding => 0) vb.show_all add(vb) GLib::Timeout.add(@speed) do @field.update @drawing_area.queue_draw unless @drawing_area.destroyed? end end def set_draw @drawing_area.signal_connect("draw") do |widget, cr| window = widget.window cr.scale(window.width, window.height) @field.draw(cr) end end end end window = Pong::Window.new window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/calendar.rb000066400000000000000000000024061511343406000234000ustar00rootroot00000000000000=begin calendar.rb - Gtk::Calendar sample script. Copyright (c) 2002-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" cal = Gtk::Calendar.new window = Gtk::Window.new("Calendar sample") window.add(cal) window.show_all window.signal_connect("delete_event") do Gtk.main_quit end date = Time.new cal.select_month(date.month, date.year) cal.select_day(date.day) cal.mark_day(date.day) # cal.clear_marks cal.set_display_options(Gtk::CalendarDisplayOptions::SHOW_HEADING | Gtk::CalendarDisplayOptions::SHOW_DAY_NAMES | Gtk::CalendarDisplayOptions::SHOW_WEEK_NUMBERS) puts "this is #{cal.month} #{cal.day}, #{cal.year}" cal.signal_connect("day_selected") do puts "selected day: #{cal.day}" end cal.signal_connect("month_changed") do puts "changed month: #{cal.month}" end cal.signal_connect("day_selected_double_click") do puts "dclicked day: #{cal.day}" end cal.signal_connect("prev_month") do puts "prev month: #{cal.month}" end cal.signal_connect("next_month") do puts "next_month: #{cal.month}" end cal.signal_connect("prev_year") do puts "prev_year: #{cal.year}" end cal.signal_connect("next_year") do puts "next year: #{cal.year}" end Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/checkbutton.rb000066400000000000000000000017671511343406000241510ustar00rootroot00000000000000#!/usr/bin/env ruby =begin checkbutton.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("check buttons") window.border_width = 0 window.signal_connect("delete_event") do Gtk.main_quit end box1 = Gtk::Box.new(:vertical) window.add(box1) box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2) button1 = Gtk::CheckButton.new("_button1") button1.set_use_underline(true) button2 = Gtk::CheckButton.new("_button2") button3 = Gtk::CheckButton.new(Gtk::Stock::QUIT) box2.add(button1) box2.add(button2) box2.add(button3) box1.pack_start(Gtk::Separator.new(:horizontal)) box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2) close = Gtk::Button.new(:label => "close") close.signal_connect("clicked") do Gtk.main_quit end box2.pack_start(close) close.can_default = true close.grab_default window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/colorchooser.rb000066400000000000000000000010121511343406000243200ustar00rootroot00000000000000=begin colorchooser.rb - Gtk::ColorChooserWidget sample script. Copyright (c) 2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" color_selection = Gtk::ColorChooserWidget.new color_selection.use_alpha = true color_selection.signal_connect "color-activated" do |widget, color| p color.to_s end window = Gtk::Window.new window.border_width = 10 window.add(color_selection) window.show_all window.signal_connect("destroy") {Gtk.main_quit} Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/combo-check.rb000066400000000000000000000037151511343406000240050ustar00rootroot00000000000000#!/usr/bin/env ruby =begin combo_check.rb - Ruby/GTK sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("entry") window.border_width = 0 window.signal_connect("destroy") do Gtk.main_quit end box1 = Gtk::Box.new(:vertical) window.add(box1) box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2) entry = Gtk::Entry.new entry.text = "hello world" entry.set_editable(false) entry.select_region(0, -1) box2.pack_start(entry) ## Gtk::ComboBoxText is simpler than Gtk::ComboBox, but has less functions. ## Gtk::Combo has been deprecated. cb = Gtk::ComboBoxText.new(:entry => true) cb.append_text("item0") cb.append_text("item1 item1") cb.append_text("item2 item2 item2") cb.append_text("item3 item3 item3 item3") cb.append_text("item4 item4 item4 item4 item4") cb.append_text("item5 item5 item5 item5 item5 item5") cb.append_text("item6 item6 item6 item6 item6") cb.append_text("item7 item7 item7 item7") cb.append_text("item8 item8 item8") cb.append_text("item9 item9") cb.child.text = "hello world" cb.child.select_region(0, -1) cb.child.set_editable(false) box2.pack_start(cb, :expand => true, :fill => true, :padding => 0) check = Gtk::CheckButton.new("Editable") box2.pack_start(check, :expand => false, :fill => true, :padding => 0) check.signal_connect("toggled") do cb.child.set_editable(check.active?) entry.set_editable(check.active?) end check.set_state_flags(Gtk::StateFlags::NORMAL, true) ## Run this code to see all of GtkStateFlags ## # Gtk::StateFlags.constants.each do |i| # p i # end box1.pack_start(Gtk::Separator.new(:horizontal)) box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2) button = Gtk::Button.new(:label => "close") button.signal_connect("clicked") do Gtk.main_quit end box2.pack_start(button) button.can_default = true button.grab_default window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/combobox-from-cellrender.rb000066400000000000000000000020051511343406000265100ustar00rootroot00000000000000#!/usr/bin/env ruby =begin combobox_from_cellrender.rb - Ruby/GTK sample script Copyright (c) 2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new "Combobox with CellRender" lstore = Gtk::ListStore.new(TrueClass, String) (1..5).each do |i| lstore.append.set_values([false, "item#{i}"]) end combobox = Gtk::ComboBox.new(:model => lstore, :entry => true) toggle = Gtk::CellRendererToggle.new toggle.signal_connect "toggled" do |widget, path| puts widget.class puts path.class end combobox.pack_start(toggle, true) combobox.add_attribute(toggle, "active", 0) combobox.set_entry_text_column(1) window.add combobox combobox.signal_connect("changed") do |widget| list = widget.model list.each do |_model, _path, iter| iter[0] = false end iter = widget.active_iter puts iter.inspect puts "#{iter[0]} #{iter[1]}" iter[0] = true end window.signal_connect("destroy") { Gtk.main_quit } window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/combobox.rb000066400000000000000000000034061511343406000234400ustar00rootroot00000000000000#!/usr/bin/env ruby =begin combobox.rb - Ruby/GTK sample script. Copyright (c) 2004-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" unless Gtk::Version.or_later?(3, 10, 7) puts "This sample requires GTK+ 3.10.7 or later" exit end window = Gtk::Window.new("Gtk::ComboBox sample") window.signal_connect("destroy") {Gtk.main_quit} # # Text only # combo1 = Gtk::ComboBoxText.new ["foo", "bar", "fuga", "hoge"].each do |val| combo1.append_text(val) end combo1.active = 1 combo1.signal_connect("changed") do p "combo1: #{combo1.active}, #{combo1.active_iter[0]}" end # # Icon and text # model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String) [[Gtk::Stock::QUIT, "quit"], [Gtk::Stock::CANCEL, "cancel"], [Gtk::Stock::OK, "ok"]].each do |stock, name| iter = model.append iter[0] = window.render_icon_pixbuf(stock, Gtk::IconSize::MENU) iter[1] = name end combo2 = Gtk::ComboBox.new(:model => model) # column 1 renderer = Gtk::CellRendererPixbuf.new combo2.pack_start(renderer, false) combo2.add_attribute(renderer, "pixbuf", 0) # column 2 renderer = Gtk::CellRendererText.new combo2.pack_start(renderer, true) combo2.add_attribute(renderer, "text", 1) combo2.active = 2 combo2.signal_connect("changed") do p "combo2: #{combo2.active}, #{combo2.active_iter[1]}" end # # Gtk::ComboBoxEntry # combo3 = Gtk::ComboBoxText.new(:entry => true) ["foo", "bar", "fuga", "hoge"].each do |val| combo3.append_text(val) end combo3.active = 1 combo3.signal_connect("changed") do if combo3.active_iter p "combo3: #{combo3.active}, #{combo3.active_iter[0]}" end end # Show main window vbox = Gtk::Box.new(:vertical) vbox.add(combo1) vbox.add(combo2) vbox.add(combo3) window.add(vbox) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/cursor.rb000066400000000000000000000014421511343406000231430ustar00rootroot00000000000000=begin cursor.rb - Gdk::Cursor sample script. Copyright (C) 2001-2006 Masao Mutoh Copyright (c) 2002-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new("Gdk::Cursor sample") window.signal_connect('destroy') {Gtk.main_quit} window.realize button = Gtk::Button.new(:label => "Click!") button.use_underline = false cursors = Gdk::CursorType.values - [Gdk::CursorType::CURSOR_IS_PIXMAP] - [Gdk::CursorType::LAST_CURSOR] cursors = cursors.cycle button.signal_connect('clicked') do cursor = cursors.next p cursor button.set_label(cursor.inspect) window.window.set_cursor(Gdk::Cursor.new(cursor)) end window.add(button) window.set_default_size(400, 100) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/dialog.rb000066400000000000000000000021711511343406000230650ustar00rootroot00000000000000#!/usr/bin/env ruby =begin dialog.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2006 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("Gtk::Dialog sample") button = Gtk::Button.new(:label => "Create Dialog") button.signal_connect("clicked") do dialog = Gtk::Dialog.new dialog.title = "Gtk::Dialog Sample" dialog.transient_for = window dialog.set_default_size(300, 300) dialog.child.add(Gtk::Label.new("Gtk::Dialog Sample")) dialog.add_button("OK", Gtk::ResponseType::OK) dialog.add_button(Gtk::Stock::CANCEL, Gtk::ResponseType::CANCEL) dialog.add_button(Gtk::Stock::CLOSE, Gtk::ResponseType::CLOSE) dialog.set_default_response(Gtk::ResponseType::CANCEL) dialog.signal_connect("response") do |widget, response| case response when Gtk::ResponseType::OK p "OK" when Gtk::ResponseType::CANCEL p "Cancel" when Gtk::ResponseType::CLOSE p "Close" dialog.destroy end end dialog.show_all end window.add(button) window.signal_connect("destroy") {Gtk.main_quit} window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/dialog2.rb000077500000000000000000000017701511343406000231560ustar00rootroot00000000000000#!/usr/bin/env ruby =begin dialog2.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("Gtk::Dialog sample2") button = Gtk::Button.new(:label => "Create Dialog") button.signal_connect("clicked") do dialog = Gtk::Dialog.new(:title =>"Gtk::Dialog Sample 2", :parent => window, :flags => :modal, :buttons => [[Gtk::Stock::OK, Gtk::ResponseType::OK], [Gtk::Stock::CANCEL, Gtk::ResponseType::CANCEL]]) dialog.child.add(Gtk::Label.new("Gtk::Dialog Sample 2")) dialog.set_default_size(300, 300) dialog.child.show_all result = dialog.run case result when Gtk::ResponseType::OK p "OK" when Gtk::ResponseType::CANCEL p "Cancel" end dialog.destroy end window.add(button) window.signal_connect("destroy") {Gtk.main_quit} window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/dnd.rb000066400000000000000000000040411511343406000223710ustar00rootroot00000000000000=begin dnd.rb - Drag and Drop sample script. Copyright (C) 2002-2015 Masao Mutoh Copyright (c) 2002-2016 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class SrcWindow < Gtk::Window def initialize super("Source Window") @label = Gtk::Label.new("Drag here!") add(@label) set_default_size(100, 100) drag_source_set(Gdk::ModifierType::BUTTON1_MASK | Gdk::ModifierType::BUTTON2_MASK, [["test", Gtk::TargetFlags::SAME_APP, 12_345]], Gdk::DragAction::COPY | Gdk::DragAction::MOVE) signal_connect("drag-data-get") do |_widget, _context, selection_data, _info, _time| selection_data.set(Gdk::Selection::TYPE_STRING, "this is a test") puts "drag-data-get signal:" puts selection_data.text end end end class DestWindow < Gtk::Window def initialize super("Dest Window") @label = Gtk::Label.new("Drop here!") add(@label) set_default_size(100, 100) drag_dest_set(Gtk::DestDefaults::MOTION | Gtk::DestDefaults::HIGHLIGHT, [["test", :same_app, 12_345]], Gdk::DragAction::COPY | Gdk::DragAction::MOVE) signal_connect("drag-data-received") do |_widget, context, _x, _y, selection_data, _info, _time| context.targets.each do |target| if target.name == "test" || selection_data.type == Gdk::Selection::TYPE_STRING data_len = selection_data.data.size puts "drag-data-received signal:" puts selection_data.data.pack("C#{data_len}") puts selection_data.text else next end end end signal_connect("drag-drop") do |widget, context, _x, _y, time| widget.drag_get_data(context, context.targets[0], time) end end end win1 = SrcWindow.new win2 = DestWindow.new win1.show_all.signal_connect("destroy") { Gtk.main_quit } win2.show_all.signal_connect("destroy") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/dndtreeview.rb000066400000000000000000000027111511343406000241460ustar00rootroot00000000000000=begin dndtreeview.rb - Drag and Drop sample script. Copyright (C) 2003-2015 Masao Mutoh Copyright (c) 2003-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" class TestWindow < Gtk::Window attr_reader :list TARGET_TABLE = [["GTK_TREE_MODEL_ROW", 0, 0]] def initialize super("Drag and Drop Gtk::TreeView") set_default_size(300, 128) signal_connect("destroy") { Gtk.main_quit } data = [["Hello", "KON-NI-CHIWA"], ["Goodbye", "SAYO-NARA"], ["Good morning", "OHA-YO-GOZAI-MASU"], ["Good evening", "KON-BAN-WA"]] model = Gtk::ListStore.new(String, String) view = Gtk::TreeView.new(model) renderer = Gtk::CellRendererText.new col1 = Gtk::TreeViewColumn.new("English", renderer, { :text => 0 }) col2 = Gtk::TreeViewColumn.new("Japanese", renderer, { :text => 1 }) view.append_column(col1) view.append_column(col2) data.each do |v1, v2| iter = model.append iter.set_value(0, v1) iter.set_value(1, v2) end view.enable_model_drag_source(Gdk::ModifierType::BUTTON1_MASK, TARGET_TABLE, Gdk::DragAction::COPY | Gdk::DragAction::MOVE) view.enable_model_drag_dest(TARGET_TABLE, Gdk::DragAction::COPY | Gdk::DragAction::MOVE) add(view) end end win = TestWindow.new win.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/drag-move.rb000066400000000000000000000052061511343406000235110ustar00rootroot00000000000000=begin drag-move.rb - Move widget by drag sample script. Copyright (C) 2011-2015 Ruby-GNOME2 Project Team Copyright (C) 2006 Kouhei Sutou This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class DraggableWidget < Gtk::EventBox def initialize super set_visible_window(false) @dragging = false @drag_button = 1 set_button_press_event set_button_release_event set_motion_notify_event end def layout parent end def move(x, y) if layout layout.move(self, x, y) true else false end end def dragging? @dragging end private def set_button_press_event signal_connect("button-press-event") do |widget, event| if event.button == @drag_button widget.grab_add x, y, w, h = widget.allocation.to_a drag_start(x, y, event.x_root, event.y_root) else false end end end def set_motion_notify_event signal_connect("motion-notify-event") do |widget, event| if dragging? drag_motion(event.x_root, event.y_root) else false end end end def set_button_release_event signal_connect("button-release-event") do |widget, event| if event.button == @drag_button widget.grab_remove drag_end else false end end end def set_drag_move_position_event signal_connect("drag-move-position") do |widget, x, y| if layout layout.move(widget, x, y) true else false end end end def drag_start(x, y, base_x, base_y) @dragging = true @drag_x = x @drag_y = y @drag_base_x = base_x @drag_base_y = base_y true end def drag_motion(base_x, base_y) delta_x = base_x - @drag_base_x delta_y = base_y - @drag_base_y if delta_x != 0 and delta_y != 0 move(@drag_x + delta_x, @drag_y + delta_y) else false end end def drag_end @dragging = false true end end window = Gtk::Window.new("Draggable Widget sample") window.signal_connect("destroy") {Gtk.main_quit} layout = Gtk::Layout.new draggable_widget = DraggableWidget.new draggable_widget.set_size_request(50, 50) layout.put(draggable_widget, 75, 75) draggable_widget.signal_connect("draw") do |widget, context| width = widget.width_request height = widget.height_request context.fill do center_x = width / 2 center_y = height / 2 radius = width / 2 start_angle = 0 * Math::PI stop_angle = 2 * Math::PI context.arc(center_x, center_y, radius, start_angle, stop_angle) end false end window.add(layout) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/drawing.rb000066400000000000000000000047051511343406000232660ustar00rootroot00000000000000=begin drawing.rb - Ruby/GTK version of gtk+/examples/drawing.c. https://git.gnome.org/browse/gtk+/tree/examples/drawing.c?h=gtk-3-16 Copyright (c) 2015-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" surface = nil def clear_surface(surface) cr = Cairo::Context.new(surface) cr.set_source_rgb(1, 1, 1) cr.paint cr.destroy end def draw_brush(widget, surface, x, y) cr = Cairo::Context.new(surface) cr.rectangle(x - 3, y - 3, 6, 6) cr.fill cr.destroy widget.queue_draw_area(x - 3, y - 3, 6, 6) end myapp = Gtk::Application.new "org.gtk.example", :flags_none myapp.signal_connect "activate" do |app| win = Gtk::ApplicationWindow.new app win.set_title "Drawing Area" win.signal_connect "delete-event" do win.destroy end win.set_border_width 8 frame = Gtk::Frame.new frame.shadow_type = Gtk::ShadowType::IN win.add frame drawing_area = Gtk::DrawingArea.new # Set a minimum size drawing_area.set_size_request 100, 100 frame.add drawing_area # Signals used to handle the backing surface drawing_area.signal_connect "draw" do |_da, cr| cr.set_source(surface, 0, 0) cr.paint false end drawing_area.signal_connect "configure-event" do |da, _ev| surface.destroy if surface surface = win.window.create_similar_surface(Cairo::CONTENT_COLOR, da.allocated_width, da.allocated_height) # Initialize the surface to white clear_surface(surface) # the configure event have been handled, no need for further # processing true end # Event signals drawing_area.signal_connect "motion-notify-event" do |da, ev| return false unless surface if (ev.state & Gdk::EventMask::BUTTON_PRESS_MASK.to_i) != 0 draw_brush(da, surface, ev.x, ev.y) end end drawing_area.signal_connect "button-press-event" do |da, ev| return false unless surface case ev.button when Gdk::BUTTON_PRIMARY draw_brush(da, surface, ev.x, ev.y) when Gdk::BUTTON_SECONDARY clear_surface(surface) da.queue_draw end true end # Ask to receive events the drawing area doesn't normally # subscribe to. In particular, we need to ask for the # button press and motion notify events that we want to handle. drawing_area.add_events([:button_press_mask, :pointer_motion_mask]) win.show_all end myapp.run ARGV ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/entry.rb000066400000000000000000000010741511343406000227700ustar00rootroot00000000000000#!/usr/bin/env ruby =begin entry.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("entry") window.border_width = 0 box1 = Gtk::Box.new(:vertical, 10) window.add(box1) entry = Gtk::Entry.new box1.add(entry) box1.add(Gtk::Separator.new(:horizontal)) button = Gtk::Button.new(:label => "close") button.signal_connect("clicked") do Gtk.main_quit end box1.add(button) window.show_all entry.text = "hello world" Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/entrycompletion.rb000066400000000000000000000012311511343406000250550ustar00rootroot00000000000000#!/usr/bin/env ruby =begin entrycompletion.rb - Ruby/GTK sample script. Copyright (c) 2004-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. Enter "G", "t" on the entry box. =end require "gtk3" window = Gtk::Window.new window.set_default_size(200, 200) entry = Gtk::Entry.new completion = Gtk::EntryCompletion.new entry.completion = completion model = Gtk::ListStore.new(String) ["GNOME", "total", "totally"].each do |v| iter = model.append iter[0] = v end completion.model = model completion.text_column = 0 window.add(entry) window.show_all window.signal_connect("destroy"){Gtk.main_quit} Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/eventbox.rb000066400000000000000000000027151511343406000234640ustar00rootroot00000000000000=begin eventbox.rb - Ruby/GTK sample script. Copyright (c) 2015-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end # https://developer.gnome.org/gtk3/unstable/GtkEventBox.html # https://developer.gnome.org/gtk3/stable/GtkImage.html # Gtk::EventBox are widgets container used to catch events for widgets that # do not have their own window (Gdk::Window) like Gtk::Image for example. require "gtk3" window = Gtk::Window.new("Event Box example") surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 265, 95) cr = Cairo::Context.new(surface) r1 = [10, 10, 75, 75] r2 = [95, 10, 75, 75] r3 = [180, 10, 75, 75] cr.set_source_rgb(1, 0, 0) cr.rectangle(*r1) cr.fill cr.set_source_rgb(0, 1, 0) cr.rectangle(*r2) cr.fill cr.set_source_rgb(0, 0, 1) cr.rectangle(*r3) cr.fill image = Gtk::Image.new( pixbuf: surface.to_pixbuf(src_x: 0, src_y: 0, width: 265, height: 95) ) event_box = Gtk::EventBox.new event_box.add(image) event_box.signal_connect "button-press-event" do |_widget, event| if event.y >= 10 && event.y <= 85 if event.x >= 10 && event.x <= 85 puts "red x = #{event.x} \t y = #{event.y}" elsif event.x >= 95 && event.x <= 180 puts "green x = #{event.x} \t y = #{event.y}" elsif event.x >= 190 && event.x <= 255 puts "blue x = #{event.x} \t y = #{event.y}" end end end window.add(event_box) window.show_all window.signal_connect("delete-event") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/expander.rb000066400000000000000000000010741511343406000234350ustar00rootroot00000000000000#!/usr/bin/env ruby =begin expander.rb - Ruby/GTK2 sample script. Copyright (c) 2004-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" expander = Gtk::Expander.new("Expander Sample") expander.expanded = true button = Gtk::Button.new(:label => "Hide this button.") button.signal_connect("clicked") do expander.expanded = false end button.set_size_request(200, 200) expander.add(button) win = Gtk::Window.new win.add(expander) win.show_all win.signal_connect("destroy"){Gtk.main_quit} Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/filechooser.rb000077500000000000000000000021071511343406000241320ustar00rootroot00000000000000#!/usr/bin/env ruby =begin filechooser.rb - Ruby/GTK2 sample script. Copyright (c) 2004-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" dialog = Gtk::FileChooserDialog.new(:title => "Gtk::FileChooser sample", :action => :open, :buttons => [[Gtk::Stock::OPEN, :accept], [Gtk::Stock::CANCEL, :cancel]]) extra_button = Gtk::Button.new(:label => "Extra button") extra_button.signal_connect("clicked") do puts "extra button is clicked" end dialog.extra_widget = extra_button filter_rb = Gtk::FileFilter.new filter_rb.name = "Ruby Scripts" filter_rb.add_pattern("*.rb") filter_rb.add_pattern("*.rbw") dialog.add_filter(filter_rb) filter_c = Gtk::FileFilter.new filter_c.name = "C sources" filter_c.add_pattern("*.[c|h]") dialog.add_filter(filter_c) dialog.add_shortcut_folder("/tmp") if dialog.run == Gtk::ResponseType::ACCEPT puts "filename = #{dialog.filename}" puts "uri = #{dialog.uri}" end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/flowbox.rb000077500000000000000000000047341511343406000233200ustar00rootroot00000000000000#!/usr/bin/env ruby # # Copyright (c) 2014 Gian Mario Tagliaretti # Copyright (c) 2015-2020 Ruby-GNOME Project Team # # Permission is granted to copy, distribute and/or modify this document # under the terms of the GNU Free Documentation License, Version 1.3 # or any later version published by the Free Software Foundation; # with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. # A copy of the license is included in the section entitled "GNU # Free Documentation License". # # Original code: https://github.com/sebp/PyGObject-Tutorial/blob/master/examples/layout_flowbox_example.py require "gtk3" unless Gtk::Version.or_later?(3, 12, 1) puts "This sample requires GTK+ 3.12.1 or later: #{Gtk::Version::STRING}" exit end COLORS = %w(AliceBlue AntiqueWhite AntiqueWhite1 AntiqueWhite2 AntiqueWhite3 AntiqueWhite4 aqua aquamarine aquamarine1 aquamarine2 aquamarine3 aquamarine4 azure azure1 azure2 azure3 azure4 beige bisque bisque1 bisque2 bisque3 bisque4 black BlanchedAlmond blue blue1 blue2 blue3 blue4 BlueViolet brown brown1 brown2 brown3 brown4 burlywood burlywood1 burlywood2 burlywood3 burlywood4 CadetBlue CadetBlue1 CadetBlue2 CadetBlue3 CadetBlue4 chartreuse chartreuse1 chartreuse2 chartreuse3 chartreuse4 chocolate chocolate1 chocolate2 chocolate3 chocolate4 coral coral1 coral2 coral3 coral4) class FlowBoxWindow < Gtk::Window def initialize super set_border_width(10) set_default_size(300, 250) header = Gtk::HeaderBar.new header.title = "Flow Box" header.subtitle = "Sample FlowBox app" header.show_close_button = true set_titlebar(header) scrolled = Gtk::ScrolledWindow.new scrolled.set_policy(:never, :automatic) flowbox = Gtk::FlowBox.new flowbox.valign = :start flowbox.max_children_per_line = 30 flowbox.selection_mode = :none COLORS.each do |color| swatch = create_color_swatch(color) flowbox.add swatch end scrolled.add(flowbox) add(scrolled) signal_connect("destroy") { Gtk.main_quit } end private def create_color_swatch(color_name) color = Gdk::RGBA.parse(color_name) button = Gtk::Button.new area = Gtk::DrawingArea.new area.set_size_request(24, 24) area.signal_connect("draw") do |_, context| context.set_source_rgba(color) context.paint end button.add(area) end end win = FlowBoxWindow.new win.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/frame.rb000066400000000000000000000033041511343406000227170ustar00rootroot00000000000000#!/usr/bin/env ruby =begin frame.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("buttons") window.signal_connect("destroy") do Gtk.main_quit end window.border_width = 0 box1 = Gtk::Box.new(:vertical, 0) window.add(box1) box2 = Gtk::Box.new(:horizontal, 5) box2.border_width = 10 box1.pack_start(box2, :expand => true, :fill => true, :padding => 0) label = Gtk::Label.new("Hello World") frame = Gtk::Frame.new("Frame 1") box2.pack_start(frame, :expand => true, :fill => true, :padding => 0) box3 = Gtk::Box.new(:vertical, 5) box3.border_width = 5 frame.add(box3) button = Gtk::Button.new(:label => "switch") button.signal_connect("clicked") do label.reparent(box3) end box3.pack_start(button, :expand => false, :fill => true, :padding => 0) box3.pack_start(label, :expand => false, :fill => true, :padding => 0) frame = Gtk::Frame.new("Frame 2") box2.pack_start(frame, :expand => true, :fill => true, :padding => 0) box4 = Gtk::Box.new(:vertical, 5) box4.border_width = 5 frame.add(box4) button = Gtk::Button.new(:label => "switch") button.signal_connect("clicked") do label.reparent(box4) end box4.pack_start(button, :expand => false, :fill => true, :padding => 0) separator = Gtk::Separator.new(:horizontal) box1.pack_start(separator, :expand => false, :fill => true, :padding => 0) box2 = Gtk::Box.new(:horizontal, 10) box2.border_width = 10 box1.pack_start(box2, :expand => false, :fill => true, :padding => 0) button = Gtk::Button.new(:label => "close") button.signal_connect("clicked") do Gtk.main_quit end box2.pack_start(button) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/gdkscreen.rb000066400000000000000000000012671511343406000236000ustar00rootroot00000000000000=begin gdkscreen.rb - Gdk::Screen sample script. Copyright (C) 2004-2006 Masao Mutoh Copyright (C) 2007-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" Gtk.init screen = Gdk::Screen.default settings_map = [ "gtk-double-click-time", "gtk-dnd-drag-threshold", "gtk-can-change-accels", "gtk-color-palette", "gtk-font-name", "gtk-icon-sizes", "gtk-key-theme-name", "gtk-toolbar-style", "gtk-toolbar-icon-size", "gtk-im-preedit-style", "gtk-im-status-style", "gtk-cursor-blink", "gtk-cursor-blink-time", "gtk-theme-name" ] settings_map.each do |v| puts "#{v}: #{screen.get_setting(v)}" end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/gnome-logo-icon.png000066400000000000000000000060221511343406000247770ustar00rootroot00000000000000‰PNG  IHDR00Wù‡ pHYs  ÒÝ~ütIMEÒ !??G… ±IDATxœí™mp”ÕÇ÷nt@²ÙMIHÌî“Í’]Ü @"³@‚–šQ¦8MÀ@iE ”–J­Äi+`U”Ö)*kkªR-[B[ªX“ªmi±$Vc² /BDÝ /aŠåöþ°IžÍ‹f¦_<3ÿ$ϹçœçîëynàKùR¾ˆÿ7€Ñ£G;` ©ü€hÙ÷ôôDþbõ¡ø#+cÆŒq*¥Ü1‚û…ùJ©Ž¾ BÎ;€Ú«´âk‹>!Á ×ëwÄëõ*„7Bzôz=ñ!èõúb!e½Ôé\R§CÆÙ%%n­¶Ù%%‘÷ 1¡‹Ò#¤¬”R‚ë¶… ïB Â:Î)¤ôJ)QvýPXXX~¦»û> =J©‘OÀ˜”d–B–K©#S¦Lqü~sD'¤[J±¯]_˜Íf€~v!ýçO`lò¸yc“ǽ‘”<îàØäqó"Á¤Î¢5äBH€J©Ó¡Ó銘6$&&òÕ¹sƒqcèâ†K>9%ͬP^ˆì¥”%95Msǘ4É€ |(;ÇŠ+0 Þ__ýçK@HQ)zo^ÆÝuu^)åÌX>‡À/ƒDò{‡Ãnç›Ë—Ô§ŒOo ùá°ÛùÞw×yˆ ‡aO!)D?´¶¶ºº><á”B4H!üÑm3¦OÇ”™ ШåÛFƒ‘­nw¸—«ûêûñnB§ó Žhœã®Ð³7ºmÍšïøÇgšúúõ…!1‘ß¾ò;@õøLS“†>Òûƒ&žiq¦gšaqG@z¥DÃa·¥H)«¥RHÖ¬^ÍônpK±÷õõ—Bb4ùíÎáXž “e‹†¾ùA%Ü՞aÎR!´+¥ !ýæ(½êì<ª”Rë3ÌYd˜³PJ«Ër0ì§”"ÔåŒöÍ0g©¥UË•ßÛïÇYZµ¿?€R*²ï÷›±Ègfe›Aù¢uË—Uy±ý™ù ÈÉÉyãðáî…·-àñŸ>àB4Ï.åÈ‘#ti+&x„»…‘J)Åæ-[+Ö:Ì)-Áž—n®Þ¼eë ýðz>,¦k¬*«¿»V)¥œ¦k¬(¥œJ©OC½öi¸‡Â½5P¯…ì6‡ü>UJíPJ™µüŠƒl£BH/P~>~âC€r!d“%gb“ïðù@%à°X',Ö<(ÂbζYú„õ!h´Xó¼B`Q—TdtÌ96,Ö<„_ëpÔRŽ=€ÔÌ,3ÐH¨Ì-œ6•~å©/«ì˜¹ç¹|H©DŸÂdž  \)U®oñ !ª•RÏõ#&§Ž¶÷Òi†æ.ÔÓÓCOO¾Ö掯/º½23ój„”Ì) @îkY÷`5’öUL˜´±!<Q.¤d˜0"„GJ9¯ë˜ŽwDÚ‚4ÓΟ?A˜W44G ^¯àì™3áÌw4·´TæÙlžlG~5Jy¡‡=ÏïÝù‚%Ûî |t¢úôtii)¯¼ü2ÆÄ$.©KÍ—­oØ€R !Ä’<›­¨Ùú³§êAøÒ…ŒÞkn1î?<<úTŸ ,ˆLÿ§ŸÐí÷ÓÐhÀØ”TNŸ:ÉØq)½ôIé&'JÕsùÓoD$#=ú½uþäÔ´ÄhýéS'HNMÓôû¥gGì](95è*@éAŒ,y€ÒÙ3ŒIãMøO‹èSƧÁ-»]¯¼ŒÁ`ОBw"N§ë…¤tóz„ÈGF ú*/ð"Æ´LŒi™˜²óhk=„..®æÎ‹Á` ÃdÑžBÁ#ß\0@BJF;`ù"=­%ÛÝHÉÌb€ò “åw«WUóUÕ½ìÂ|úŠæܵì›4ÿû]„”ètq$¤f:Ò2R‹!IHH`Ûc›Âä=@÷ïŽwú8ÞécÆM7õâcšÝk¾õ­œ8ÚÁ‰£ÚkÀd6c0$p¼£¥¶©Eƒ~„ GlÖl6<¸Ž‰¹9ÛÔ¢%-ÿ|3Ò^pýuXr&RX0Î#m‘Z(¼=pÿ÷BÄžBᣒRÖ5#A~eU%+—- ?º-9WEEð‡‘‡AEs !BÐÑÖBG[ áû¢‹uÚõ“Ùõ«gÂäý€ËVèZuSéÍüñ÷u,þú"L&R§ãÁÜOû¡÷ñµ6ãkmFtšk%esôz¾Ò8®˜àõܰEÏÊ»¾AÅ¢…a•¨É¶;c^ &{Þ/혬À5öËS¾í½ƒØ¦— \×jÈ´ÉNžÜø úx…ÕÙŽÉ Ñ6áø9×^?x@!ú•š dOº®ŸN§»‹¨Òz0¹ÿÞTܱ üXc»qÎCaýO6lDÆ„NôKgý 1 *š ääOëooœG¨îLÖݳ‚ŠÛçC°×+­“ šB1œ7ƒ¾á\ꬿ)!^÷¥_ruz:¹E7[Ïw/ëu…ÚÖcŒƒfi©üy§'LÞroú Ì "ß}Åœ‘î{õ…gòs§Ü8¬µ¡}+uÐzçozçoBT^ć£”Û¦lS‹=gA`Ac,?×ô àBÆÄ\+ÞZ‡¼Í¡o#tqý ½êâ8sþ+×þ[A1¶‚bqá\Hw0om|Ðæã ϯëmÅHÉÊåK RÒ8ß´üIFë¹ÓXÏ®A]e`ê¯O2¿b_›Ø€î_9š‰k&`íÞÍ¡tñÒ]—°žy뙿Йu%w¾ýW””5JÊF%%±ðÄs/º.]e¸oÉžn^ÝÜŠuæ× !?Mûôô4JŠn¨¿eG u-w’{º‰­[Ì¡ýD#ò)K÷æèkeX»—pÄÕÁ’¿_¡@kâmäÞÁBñ·ì(éyiO\5ŠÀ‚õ-ë×VfŽï.¡˜p?s»é`KÚ;@4‚Èe»îîªð«½m®¦,/›½eq¬ž·¨QHÚÇö_ìevág 깸iOoßc“8üd6rw!üaåitÛöÑuñ]÷Náçw·5=õðªm9× „n ä+d¥:K,›ù·”P:£ÀZ :º^r³ÿê“÷Ô·¬ Dpó[vŸ…ºæ@4rÅÚ ˜|2Ö"®'ù¬- oeîÏžä¿w—²‰R‹ý©âç[·ª²dÆ´A"6Ü<“Mkïð5,@ÁNŸmšÖ]|¶ýiö¿â7k{|”Ù깸Éw”ko£ev?uïñÿ³šÜwv3íÉOøÓÿiëŽ)¥æ½¸ç5Ï#ÛŸ7v‡þñ6©\ðUøöåºHˆ‰Mon$¿(øŽ+ž¸•‹÷ìéÇ)"‰Ï’R½:vÉwe¶7B¸ÌQOÝ{®H[Ê£èºx!: óÇþ€g÷ëo¹<»~ϱ“Å$^àÌãÞoÜN¡ÓE^4 5ñ0—”‡Œt­÷ÇN o E”R@Ms[»eÿ»ÍtŸ½<" ñc(>•«Ó" Ú:s^`ÛˆDîBE2µ%ù<ûçÓ,u$óìá NG ] Íœ?,âÐk>Ì#X.äÓû?2>‚åˆ;GÈŽÃE³Øöæë¬T %‡Û;yüÙZö½ý!¿wÀš`/$@ÑTî|óužX©-= À‹]åÔ5£¶4ŸÅ¯=|‰ñâž×xdûó|εÅ!,{©SÅâWQ;ç-¿:#Ö’À­¡ß^”R|ì°ûõ·æïG¢ìÚcÔ½{uo'¥‚'ëôZêÿº˜ÇœUÀÃìnJ |”ÚªxþÕ•ÆæÝ‹ù¯: @s[ï»ÓˆýðT¿+îY—¦0ëR ÜWwXtÃŒ½€ƒÚÒJ¢/Ƶ®Ô‡zÅþ?GŠq)I»IEND®B`‚ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/gtkglarea1.rb000066400000000000000000000067631511343406000236630ustar00rootroot00000000000000=begin gtkglarea1.rb draw a triangle on a grey background this script need the opengl-bindings gem from : https://github.com/vaiorabbit/ruby-opengl gem install opengl-bindings sources: http://antongerdelan.net/opengl/hellotriangle.html opengl-bindings/sample/RedBook/varray opengl-bindings/sample/GLES/gles.rb http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/ https://developer.gnome.org/gtk3/stable/GtkGLArea.html https://www.bassi.io/articles/2015/02/17/using-opengl-with-gtk/ http://stackoverflow.com/questions/30337845/gldrawarrays-not-working-using-gtkglarea-in-gtk3 http://gamedev.stackexchange.com/questions/8042/vertex-array-object-opengl =end require "gtk3" require "opengl" unless Gtk::Version.or_later?(3, 16, 0) puts "This sample requires GTK+ 3.16.0 or later: #{Gtk::Version::STRING}" exit end OpenGL.load_lib include OpenGL window = Gtk::Window.new("OpenGL widget test") window.set_size_request(400, 400) glarea = Gtk::GLArea.new window.add(glarea) gl_vao = nil glarea.signal_connect("realize") do |widget| widget.make_current # Check can only be done when we have an OpenGL context # https://www.opengl.org/wiki/FAQ#What_is_an_OpenGL_context_and_why_do_you_need_a_window_to_do_GL_rendering.3F # https://www.opengl.org/wiki/FAQ#How_do_I_tell_what_version_of_OpenGL_I.27m_using.3F version = glGetString(GL_VERSION).to_s.split(" ").first.split(".").collect(&:to_i) unless version[0] >= 3 && version[1] >= 2 puts "Gtk::GLArea widget require an OpenGL version >= 3.2, your version is #{version[0]}.#{version[1]}" exit 1 end puts "realize" # Define a triangle in a vertex buffer ( Vertex Buffer Object) points = [ 0.0, 0.5, 0.0, # x1, y1, z1 0.5, -0.5, 0.0, # x2, y2, z2 -0.5, -0.5, 0.0 # x3, y3, z3 ] # Create a vertex array object (VAO) and "bind" it (set it as the current VAO) vao_buf = " " glGenVertexArrays(1, vao_buf) gl_vao = vao_buf.unpack("L")[0] glBindVertexArray(gl_vao) # We copy points onto the graphics card in a unit called vertex buffer object (vbo). # Create an empty buffer vbo_buf = " " glGenBuffers(1, vbo_buf) g_vbo = vbo_buf.unpack("L")[0] # Set the empty buffer as the current OpenGL's state machine by "binding" glBindBuffer(GL_ARRAY_BUFFER, g_vbo) # Copy the points in the currently bound buffer glBufferData(GL_ARRAY_BUFFER, 3 * 4 * Fiddle::SIZEOF_FLOAT, points.pack("F*"), GL_STATIC_DRAW ) # First attribute buffer : vertices glEnableVertexAttribArray(0) glVertexAttribPointer(0, # No particular reason for 0 3, # size GL_FLOAT, # type GL_FALSE, # normalized? 0, # stride 0 # array buffer offset ) # Clear the current VAO glBindVertexArray(0) end glarea.signal_connect("render") do |_widget, _context| puts "render" glClearColor(0.3, 0.3, 0.3, 1) glClear(GL_COLOR_BUFFER_BIT) # Reload the VAO we created previously glBindVertexArray(gl_vao) glDrawArrays(GL_TRIANGLES, 0, 3) # we completed our drawing; the draw commands will be # flushed at the end of the signal emission chain, and # the buffers will be drawn on the window true # to stop other handlers from being invoked for the event. # false to propagate the event further. end window.signal_connect("destroy") { Gtk.main_quit } window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/gtkglarea2.rb000066400000000000000000000125461511343406000236600ustar00rootroot00000000000000=begin gtkglarea2.rb draw a triangle using shaders on a grey background this script need the opengl-bindings gem from : https://github.com/vaiorabbit/ruby-opengl gem install opengl-bindings sources: http://antongerdelan.net/opengl/hellotriangle.html opengl-bindings/sample/RedBook/varray opengl-bindings/sample/GLES/gles.rb http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/ https://developer.gnome.org/gtk3/stable/GtkGLArea.html https://www.bassi.io/articles/2015/02/17/using-opengl-with-gtk/ http://stackoverflow.com/questions/30337845/gldrawarrays-not-working-using-gtkglarea-in-gtk3 =end require "gtk3" require "opengl" unless Gtk::Version.or_later?(3, 16, 0) puts "This sample requires GTK+ 3.16.0 or later: #{Gtk::Version::STRING}" exit end OpenGL.load_lib include OpenGL window = Gtk::Window.new("OpenGL widget shaders test") window.set_size_request(400, 400) glarea = Gtk::GLArea.new window.add(glarea) vertex_shader = <= 3 && version[1] >= 2 puts "Gtk::GLArea widget require an OpenGL version >= 3.2, your version is #{version[0]}.#{version[1]}" exit 1 end puts "realize" # Define a triangle in a vertex buffer ( Vertex Buffer Object) points = [ 0.0, 0.5, 0.0, # x1, y1, z1 0.5, -0.5, 0.0, # x2, y2, z2 -0.5, -0.5, 0.0 # x3, y3, z3 ] vao_buf = " " glGenVertexArrays(1, vao_buf) gl_vao = vao_buf.unpack("L")[0] glBindVertexArray(gl_vao) # We copy those points onto the graphics card in a unit called vertex buffer object (vbo). # Create an empty buffer vbo_buf = " " glGenBuffers(1, vbo_buf) g_vbo = vbo_buf.unpack("L")[0] # Set the empty buffer as the current OpenGL's state machine by "binding" glBindBuffer(GL_ARRAY_BUFFER, g_vbo) # Copy the points in the currently bound buffer glBufferData(GL_ARRAY_BUFFER, 3 * 4 * Fiddle::SIZEOF_FLOAT, points.pack("F*"), GL_STATIC_DRAW ) # First attribute buffer : vertices glEnableVertexAttribArray(0) glVertexAttribPointer(0, # No particular reason for 0 3, # size GL_FLOAT, # type GL_FALSE, # normalized? 0, # stride 0 # array buffer offset ) glBindVertexArray(0) # Load the shaders: _ok, shader_program = setup_shaders(vertex_shader, fragment_shader) end glarea.signal_connect("render") do |_widget, _context| puts "render" glClearColor(0.3, 0.3, 0.3, 1) glClear(GL_COLOR_BUFFER_BIT) # Set the created shader program as current glUseProgram(shader_program) glBindVertexArray(gl_vao) glDrawArrays(GL_TRIANGLES, 0, 3) true end glarea.signal_connect("unrealize") do |widget| puts "unrealize" widget.make_current glDeleteVertexArrays(1, [gl_vao].pack("L")) glDeleteProgram(shader_program) end window.signal_connect("destroy") { Gtk.main_quit } window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/helloworld.rb000066400000000000000000000011431511343406000237770ustar00rootroot00000000000000#!/usr/bin/env ruby =begin helloworld.rb - Ruby/GTK2 first sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" button = Gtk::Button.new(:label => "Hello World") button.signal_connect("clicked") { puts "Hello World" } window = Gtk::Window.new("Hello World sample") window.signal_connect("delete_event") { puts "delete event occurred" false } window.signal_connect("destroy") { puts "destroy event occurred" Gtk.main_quit } window.border_width = 10 window.add(button) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/icons-theme-viewer.rb000066400000000000000000000031561511343406000253440ustar00rootroot00000000000000#!/usr/bin/env ruby =begin icons-theme-viewer.rb - Ruby/GTK sample script. Copyright (c) 2016 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" def fill_model(icons) model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf) icons.each do |icon| pixbuf = Gtk::IconTheme.default.load_icon(icon, 32, 0) iter = model.append iter[0] = icon iter[1] = pixbuf end model end def gen_icon_view(pattern, context = nil) icon_theme = Gtk::IconTheme.default icons = icon_theme.icons(context).grep(/#{pattern}/) model = fill_model(icons) icon_view = Gtk::IconView.new(:model => model) icon_view.text_column = 0 icon_view.pixbuf_column = 1 icon_view end window = Gtk::Window.new("View all your icons") window.set_default_size(700, 700) window.signal_connect("delete-event") { Gtk.main_quit } icon_view = gen_icon_view("application") sw = Gtk::ScrolledWindow.new(nil, nil) sw.add(icon_view) entry = Gtk::Entry.new entry.buffer.text = "application" entry.tooltip_text = "Use a pattern to filter icons" entry.set_icon_from_icon_name(:secondary, "edit-clear") entry.set_icon_tooltip_text(:secondary, "Reset pattern") entry.signal_connect "icon-release" do |widget, position| widget.buffer.text = "" if position == :secondary end entry.signal_connect "activate" do |widget| sw.remove(icon_view) pattern = widget.buffer.text icon_view = gen_icon_view(pattern) sw.add(icon_view) window.show_all end box = Gtk::Box.new(:vertical, 0) box.pack_start(entry) box.pack_start(sw, :expand => true, :fill => true) window.add(box) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/iconview.rb000066400000000000000000000015571511343406000234600ustar00rootroot00000000000000#!/usr/bin/env ruby =begin iconview.rb - Ruby/GTK3 sample script. Copyright (c) 2005-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" TEXT_COLUMN = 0 PIXBUF_COLUMN = 1 model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf) iv = Gtk::IconView.new iv.set_model(model) iv.text_column = TEXT_COLUMN 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] = GdkPixbuf::Pixbuf.new(:file => f) end iv.signal_connect("item_activated") do |iv, path| iter = model.get_iter(path) p iter [0] end win = Gtk::Window.new("Gtk::IconView sample") win.signal_connect("destroy"){Gtk.main_quit} win.add(iv) win.set_default_size(300,300) win.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/image.rb000066400000000000000000000010451511343406000227070ustar00rootroot00000000000000#!/usr/bin/env ruby =begin image.rb - Ruby/GTK sample script. Copyright (c) 2002-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new("Image") window.signal_connect("destroy") { Gtk.main_quit } window.border_width = 10 button = Gtk::Button.new label = Gtk::Label.new("Gtk::Image") image = Gtk::Image.new(:file => "test.xpm") box = Gtk::Box.new(:horizontal, 5) box.add(image) box.add(label) button.add(box) window.add(button) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/keyboard-grab.rb000066400000000000000000000015171511343406000243420ustar00rootroot00000000000000=begin keyboard_grab.rb - Gdk::Window#keyboard_grab/ungrab sample script. Copyright (C) 2001-2006 Masao Mutoh This program is licenced under the same licence as Ruby-GNOME. $Date: 2006/06/17 13:18:12 $ $Id: keyboard_grab.rb,v 1.5 2006/06/17 13:18:12 mutoh Exp $ =end require "gtk3" window = Gtk::Window.new("Keyboard Grab/Ungrab sample") button1 = Gtk::Button.new(:label => "Grab Keyboard!") button2 = Gtk::Button.new(:label => "Ungrab Keyboard!") button1.signal_connect("clicked") do Gdk.keyboard_grab(window.window, true, Gdk::CURRENT_TIME) end button2.signal_connect("clicked") do Gdk.keyboard_ungrab(Gdk::CURRENT_TIME) end vbox = Gtk::Box.new(:vertical, 0) vbox.add(button1) vbox.add(button2) window.add(vbox) window.set_default_size(200, 100) window.show_all window.signal_connect("destroy") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/label.rb000066400000000000000000000021111511343406000226770ustar00rootroot00000000000000#!/usr/bin/env ruby =begin label.rb - Ruby/GTK3 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" win = Gtk::Window.new("Gtk::Label sample") win.signal_connect("destroy"){Gtk.main_quit} label1 = Gtk::Label.new("_Not Use Mnemonic", :use_underline => false) label1.selectable = true label2 = Gtk::Label.new("_Use Mnemonic", :use_underline => true) label3 = Gtk::Label.new.set_markup(%Q[Ruby-GNOME2 is cool!]) label4 = Gtk::Label.new.set_markup(%Q[_Not Use Mnemonic], :use_underline => false) label5 = Gtk::Label.new.set_markup(%Q[_Use Mnemonic], :use_underline => true) box = Gtk::Box.new(:vertical) box.add(label1) box.add(label2) box.add(label3) box.add(label4) box.add(label5) win.add(box) win.show_all # This can be called after realized only. label1.select_region(3, 8) Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/linkbutton.rb000077500000000000000000000013711511343406000240230ustar00rootroot00000000000000#!/usr/bin/env ruby =begin linkbutton.rb - Gtk::LinkButton sample. Copyright (c) 2006-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new("Gtk::LinkButton sample") window.signal_connect("destroy"){Gtk.main_quit} vbox = Gtk::Box.new(:vertical) # URI only button1 = Gtk::LinkButton.new("https://ruby-gnome2.osdn.jp/") button1.signal_connect("clicked") do puts button1.uri end vbox.pack_start(button1) # URI with a label button2 = Gtk::LinkButton.new("https://ruby-gnome2.osdn.jp/", "Ruby-GNOME Website") button2.signal_connect("clicked") do puts button2.uri end vbox.pack_start(button2) window.add(vbox) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/list-store-usage.rb000066400000000000000000000041331511343406000250350ustar00rootroot00000000000000#!/usr/bin/env ruby =begin list_store_usage.rb - Ruby/GTK script http://ruby-gnome2.osdn.jp/hiki.cgi?Gtk%3A%3AListStore https://developer.gnome.org/gtk3/stable/GtkListStore.html Copyright (c) 2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" def print_list(list) puts "" print "\t" list.each do |_model, _path, iter| print iter[1] + " " end print "\n" puts "" end def load_list model = Gtk::ListStore.new(TrueClass, String) 4.times do |i| model.append.set_values([false, "index#{i}"]) end model end NOTCH = "-[|]-" # Insert data puts "Initial state of the model build with append method" model = load_list print_list(model) puts "Prepend #{NOTCH}" model = load_list model.prepend.set_values([true, NOTCH]) print_list(model) puts "Insert #{NOTCH} at position 3" model = load_list model.insert(3).set_values([true, NOTCH]) print_list(model) puts "Insert #{NOTCH} before item at index 2" model = load_list model.insert_before(model.get_iter("2")).set_values([true, NOTCH]) print_list(model) puts "Insert #{NOTCH} after item at index 2" model = load_list model.insert_after(model.get_iter("2")).set_values([true, NOTCH]) print_list(model) puts "Move iter before position 2 and set #{NOTCH}" model = load_list iter = model.iter_first iter2 = model.get_iter("2") model.move_before(iter, iter2) iter.set_values([true, NOTCH]) print_list(model) puts "Move iter after position 2 and set #{NOTCH}" model = load_list iter = model.iter_first iter2 = model.get_iter("2") model.move_after(iter, iter2) iter.set_values([true, NOTCH]) print_list(model) # Move data puts "Reorder the list" model = load_list model.reorder([3, 2, 1, 0]) print_list(model) puts "Swap item at index 1 with item at index 3" model = load_list model.swap(model.get_iter("1"), model.get_iter("3")) print_list(model) # Remove data puts "Remove data at index 2" model = load_list iter = model.get_iter("2") model.remove(iter) print_list(model) puts "Clear and add #{NOTCH}" model = load_list model.clear model.append.set_values([true, NOTCH]) print_list(model) ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/listview.rb000077500000000000000000000041531511343406000235010ustar00rootroot00000000000000#!/usr/bin/env ruby =begin listview.rb - Ruby/GTK sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("Gtk::ListStore sample") window.border_width = 0 box1 = Gtk::Box.new(:vertical, 0) window.add(box1) box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2, :expand => true, :fill => true, :padding => 0) scrolled_win = Gtk::ScrolledWindow.new scrolled_win.set_policy(:automatic,:automatic) box2.pack_start(scrolled_win, :expand => true, :fill => true, :padding => 0) data = [ "hello", "world", "blah", "foo", "bar", "argh", "spencer", "is a", "wussy", "programmer" ] model = Gtk::ListStore.new(String) column = Gtk::TreeViewColumn.new("Data", Gtk::CellRendererText.new, {:text => 0}) treeview = Gtk::TreeView.new(model) treeview.append_column(column) treeview.selection.set_mode(:single) scrolled_win.add_with_viewport(treeview) data.each do |v| iter = model.append iter[0] = v end button = Gtk::Button.new(:label => "add") button.can_focus=true i = 0 button.signal_connect("clicked") do iter = model.append iter[0] = "add item #{i}" i += 1 end box2.pack_start(button, :expand => false, :fill => true, :padding => 0) button = Gtk::Button.new(:label => "remove") button.can_focus=true button.signal_connect("clicked") do iter = treeview.selection.selected model.remove(iter) if iter end box2.pack_start(button, :expand => false, :fill => true, :padding => 0) separator = Gtk::Separator.new(:horizontal) box1.pack_start(separator, :expand => false, :fill => true, :padding => 0) separator.show box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2, :expand => false, :fill => true, :padding => 0) button = Gtk::Button.new(:label => "close") button.signal_connect("clicked") do Gtk.main_quit end box2.pack_start(button, :expand => true, :fill => true, :padding => 0) button.can_default=true button.grab_default window.set_default_size(300, 300) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/menu.rb000066400000000000000000000046411511343406000225760ustar00rootroot00000000000000#!/usr/bin/env ruby =begin menu.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" def create_menu(depth) return nil if depth < 1 menu = Gtk::Menu.new group = nil (0..4).each do |i| buf = format("item %2d - %d", depth, i + 1) menuitem = Gtk::RadioMenuItem.new(group, buf) group = menuitem.group menu.append(menuitem) menuitem.set_submenu create_menu(depth - 1) if depth > 1 end menu end def create_option_menu lstore = Gtk::ListStore.new(TrueClass, String) (1..5).each do |i| lstore.append.set_values([false, "item #{i}"]) end combobox = Gtk::ComboBox.new(:model => lstore, :entry => true) toggle = Gtk::CellRendererToggle.new combobox.pack_start(toggle, true) combobox.add_attribute(toggle, "active", 0) combobox.set_entry_text_column(1) combobox.signal_connect("changed") do |widget| list = widget.model list.each do |model, _path, iter| model.set_value(iter, 0, false) end iter = widget.active_iter list.set_value(iter, 0, true) end combobox end window = Gtk::Window.new("menus") window.signal_connect("destroy") do Gtk.main_quit end window.border_width = 0 box1 = Gtk::Box.new(:vertical, 0) window.add(box1) menubar = Gtk::MenuBar.new box1.pack_start(menubar, :expand => false, :fill => true, :padding => 0) menu = create_menu(2) menuitem = Gtk::MenuItem.new(:label => "test\nline2") menuitem.set_submenu(menu) menubar.append(menuitem) menuitem = Gtk::MenuItem.new(:label => "foo") menuitem.set_submenu(create_menu(3)) menubar.append(menuitem) menuitem = Gtk::MenuItem.new(:label => "bar") menuitem.set_submenu(create_menu(4)) menubar.append(menuitem) box2 = Gtk::Box.new(:vertical, 10) box2.border_width = 10 box1.pack_start(box2, :expand => true, :fill => true, :padding => 0) optionmenu = create_option_menu box2.pack_start(optionmenu, :expand => true, :fill => true, :padding => 0) separator = Gtk::Separator.new(:horizontal) box1.pack_start(separator, :expand => false, :fill => true, :padding => 0) box2 = Gtk::Box.new(:horizontal, 10) box2.border_width = 10 box1.pack_start(box2, :expand => false, :fill => true, :padding => 0) button = Gtk::Button.new(:label => "close") button.signal_connect("clicked") do window.destroy end box2.pack_start(button, :expand => true, :fill => true, :padding => 0) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/menus_from_resources.gresource.xml000066400000000000000000000004731511343406000302670ustar00rootroot00000000000000 app-menu.ui toolbar-menu.ui button-menu.ui ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/menus_from_resources.rb000066400000000000000000000055731511343406000261030ustar00rootroot00000000000000#!/usr/bin/env ruby =begin menus_from_resources.rb - Ruby/GTK sample script. Copyright (c) 2016 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" require "fileutils" PATH = File.expand_path(File.dirname(__FILE__)) gresource_bin = "#{PATH}/menus_from_resources.gresource" gresource_xml = "#{PATH}/menus_from_resources.gresource.xml" system("glib-compile-resources", "--target", gresource_bin, "--sourcedir", File.dirname(gresource_xml), gresource_xml) at_exit do FileUtils.rm_f(gresource_bin) end resource = Gio::Resource.load(gresource_bin) Gio::Resources.register(resource) application_instance = Gtk::Application.new("org.gtk.menus_from_resources", :non_unique) application_instance.signal_connect "startup" do |application| %w(about preferences quit copy paste open save close).each do |label| action = Gio::SimpleAction.new(label) action.signal_connect("activate") do |_action, _parameter| puts label end application.add_action(action) end builder = Gtk::Builder.new(:resource => "/org/gtk/menus_from_resources/app-menu.ui") app_menu = builder["appmenu"] application.set_app_menu(app_menu) end application_instance.signal_connect "activate" do |application| window = Gtk::ApplicationWindow.new(application) window.set_default_size(200, 200) window.border_width = 20 toolbar = Gtk::Toolbar.new toolbar.style = :both toolbutton = Gtk::ToolButton.new(:label => "Open a Menu", :stock_id => Gtk::Stock::OPEN) toolbutton.signal_connect "clicked" do |widget| builder = Gtk::Builder.new(:resource => "/org/gtk/menus_from_resources/toolbar-menu.ui") menu = Gtk::Menu.new(builder["toolbarmenu"]) # This method is important, it links the menu to the # Gio::Actions of the Gtk::Application throught one of # its children menu.attach_to_widget(widget) menu.show_all event = Gtk.current_event menu.popup(nil, nil, event.button, event.time) end toolbar.insert(toolbutton, 0) button = Gtk::Button.new(:label => "Click me") button.signal_connect "clicked" do |widget| builder = Gtk::Builder.new(:resource => "/org/gtk/menus_from_resources/button-menu.ui") menu = Gtk::Popover.new(widget, builder["buttonmenu"]) event = Gtk.current_event x, y = event.window.coords_to_parent(event.x, event.y) rect = Gdk::Rectangle.new(x - widget.allocation.x, y - widget.allocation.y, 1, 1) menu.set_pointing_to(rect) menu.show end hbox = Gtk::Box.new(:vertical, 0) hbox.pack_start(toolbar, :expand => false, :fill => false) hbox.pack_start(button, :expand => true, :fill => true) window.add(hbox) window.show_all window.present end application_instance.run ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/misc-button.rb000066400000000000000000000020361511343406000240720ustar00rootroot00000000000000#!/usr/bin/env ruby =begin misc_button.rb - Ruby/GTK sample script. Copyright (c) 2004-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" box = Gtk::Box.new(:vertical) # Gtk::ColorButton colorbutton = Gtk::ColorButton.new colorbutton.signal_connect("color-set") do p colorbutton.color.to_s end box.add(colorbutton) # Gtk::FontButton fontbutton = Gtk::FontButton.new fontbutton.signal_connect("font-set") do p fontbutton.font_name end box.add(fontbutton) # Gtk::FileChooserButton filebutton = Gtk::FileChooserButton.new("Gtk::FileChooserButton", :open) filebutton.filename = GLib.home_dir filebutton.signal_connect("current-folder-changed") do |w, e| p filebutton.filename end box.add(filebutton) # Quit quitbutton = Gtk::Button.new(:label => "Quit") quitbutton.signal_connect("clicked") do Gtk.main_quit end box.add(quitbutton) win = Gtk::Window.new win.add(box) win.set_default_size(200, 100) win.show_all win.signal_connect("delete-event") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/mouse-gesture.rb000066400000000000000000000233041511343406000244330ustar00rootroot00000000000000=begin mouse-gesture.rb - mouse gesture sample script. Copyright (C) 2005,2006 Kouhei Sutou Copyright (c) 2005-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class GestureProcessor DEFAULT_THRESHOLD = 16 DEFAULT_SKEW_THRESHOLD_ANGLE = 30 attr_accessor :threshold, :skew_threshold_angle attr_reader :motions def initialize(threshold = nil, skew_threshold_angle = nil) @threshold = threshold || DEFAULT_THRESHOLD @skew_threshold_angle = skew_threshold_angle @skew_threshold_angle ||= DEFAULT_SKEW_THRESHOLD_ANGLE reset end def started? @started end MOTIONS = %w(L R U D UL UR LL LR) def available_motion?(motion) MOTIONS.include?(motion) end def start(x, y) @prev_x = @x = x @prev_y = @y = y @started = true @motions = [] end def update_position(x, y) mx = x - @prev_x my = y - @prev_y motion = judge_motion(mx, my) if motion @prev_x = @x = x @prev_y = @y = y if @motions.last == motion false else @motions << motion true end else false end end def reset @started = false @x = @y = -1 @motions = [] end def to_a @motions end def position [@x, @y] end private def judge_motion(mx, my) mxa = mx.abs mya = my.abs distance = Math.sqrt(mxa ** 2 + mya ** 2) upper_theta = (45 + @skew_threshold_angle) * (Math::PI / 180.0) lower_theta = (45 - @skew_threshold_angle) * (Math::PI / 180.0) if distance > @threshold and mya < Math.tan(upper_theta) * mxa and mya > Math.tan(lower_theta) * mxa judge_corner_motion(mx, my) elsif mxa > @threshold or mya > @threshold judge_cross_motion(mx, my) else nil end end def judge_corner_motion(mx, my) if mx < 0 if my < 0 "UL" else "LL" end else if my < 0 "UR" else "LR" end end end def judge_cross_motion(mx, my) if mx.abs > my.abs if mx < 0 "L" else "R" end else if my < 0 "U" else "D" end end end end class Gesture < Gtk::EventBox DEFAULT_BACK_RGBA = [0.2, 0.2, 0.2, 0.5] DEFAULT_LINE_RGBA = [1, 0, 0, 1] DEFAULT_NEXT_RGBA = [0, 1, 0, 0.8] DEFAULT_CURRENT_RGBA = [1, 0, 1, 0.8] def initialize(conf={}) super() set_visible_window(false) conf ||= {} @back_rgba = conf[:back_rgba] || DEFAULT_BACK_RGBA @line_rgba = conf[:line_rgba] || DEFAULT_LINE_RGBA @next_rgba = conf[:next_rgba] || DEFAULT_NEXT_RGBA @current_rgba = conf[:current_rgba] || DEFAULT_CURRENT_RGBA @processor = GestureProcessor.new(conf[:threshold], conf[:skew_threshold_angle]) @actions = [] set_expose_event set_motion_notify_event set_button_release_event end def add_action(sequence, action = proc) invalid_motion = sequence.find do |motion| not @processor.available_motion?(motion) end raise "invalid motion: #{invalid_motion}" if invalid_motion @actions << [sequence, action] end def start(widget, button, x, y, base_x, base_y) self.grab_add @widget = widget @button = button @processor.start(x, y) @base_x = base_x @base_y = base_y @cr = window.create_cairo_context @cr.set_source_rgba(@line_rgba) @cr.move_to(x, y) end private def perform_action act = action act.call(@widget) if act @processor.reset end def action motions = @processor.motions @actions.each do |sequence, act| return act if sequence == motions end nil end def available_motions motions = @processor.motions @actions.collect do |sequence, act| if sequence == motions sequence.last else nil end end.compact.uniq end def next_available_motions motions = @processor.motions @actions.collect do |sequence, act| if sequence[0..-2] == motions sequence.last else nil end end.compact.uniq end def match? not action.nil? end def set_expose_event signal_connect("draw") do |widget, event| if @processor.started? cr = widget.window.create_cairo_context cr.rectangle(*widget.allocation.to_a) cr.set_source_rgba(@back_rgba) cr.fill cr.set_source_rgba(@next_rgba) draw_available_marks(cr, next_available_motions) if action cr.set_source_rgba(@current_rgba) draw_mark(cr, *@processor.position) end @cr.stroke_preserve true else false end end end def draw_mark(cr, x = nil, y = nil, radius = nil) x ||= @processor.position[0] y ||= @processor.position[1] radius ||= @processor.threshold cr.save do cr.translate(x, y) cr.scale(radius, radius) cr.arc(0, 0, 0.5, 0, 2 * Math::PI) cr.fill end end def draw_available_marks(cr, motions) motions.each do |motion| adjust_x = calc_position_ratio(motion, %w(R), %w(L), %w(UR LR), %w(UL LL)) adjust_y = calc_position_ratio(motion, %w(D), %w(U), %w(LR LL), %w(UR UL)) threshold = @processor.threshold x, y = @processor.position x += threshold * adjust_x y += threshold * adjust_y draw_mark(cr, x, y, threshold) end end def calc_position_ratio(motion, inc, dec, inc_skew, dec_skew) case motion when *inc 1 when *inc_skew 1 / Math.sqrt(2) when *dec -1 when *dec_skew -1 / Math.sqrt(2) else 0 end end def set_motion_notify_event signal_connect("motion_notify_event") do |widget, event| if @processor.started? x = @base_x + event.x y = @base_y + event.y @cr.line_to(x, y) @cr.save do if @processor.update_position(x, y) queue_draw end end @cr.stroke_preserve true else false end end end def set_button_release_event signal_connect("button_release_event") do |widget, event| if event.button == @button and @processor.started? self.grab_remove perform_action hide true else false end end end end class GesturedWidget < Gtk::EventBox DEFAULT_GESTURE_BUTTON = 3 def initialize(gesture_button = nil) super() set_visible_window(false) @gesture_button = gesture_button || DEFAULT_GESTURE_BUTTON set_button_press_event end def layout parent end def gesture(x, y, base_x, base_y) if layout layout.gesture(self, @gesture_button, x, y, base_x, base_y) end end private def set_button_press_event signal_connect("button_press_event") do |widget, event| if event.button == @gesture_button x, y, w, h = widget.allocation.to_a gesture(x + event.x, y + event.y, x, y) else false end end end end class Layout < Gtk::Layout def initialize super() @gesture = Gesture.new put(@gesture, 0, 0) end def gesture(widget, button, x, y, base_x, base_y) remove(@gesture) put(@gesture, 0, 0) _, _, w, h = allocation.to_a @gesture.set_size_request(w, h) @gesture.show @gesture.start(widget, button, x, y, base_x, base_y) end def add_gesture_action(sequence, action = proc) @gesture.add_action(sequence, action) end end window = Gtk::Window.new("Mouse Gesture sample") layout = Layout.new gestured_widget = GesturedWidget.new gestured_widget.set_size_request(50, 50) gestured_widget.signal_connect("draw") do |widget, event| x, y, w, h = widget.allocation.to_a cr = widget.window.create_cairo_context cr.set_source_rgba([0.8, 0.8, 0.3, 1]) cr.translate(x, y) cr.scale(w, h) cr.arc(0.5, 0.5, 0.5, -0.1, 360) cr.fill false end layout.put(gestured_widget, 75, 75) gestured_widget2 = GesturedWidget.new gestured_widget2.set_size_request(100, 50) gestured_widget2.signal_connect("draw") do |widget, event| x, y, w, h = widget.allocation.to_a cr = widget.window.create_cairo_context cr.set_source_rgba([0.3, 0.3, 0.8, 1]) cr.translate(x, y) cr.scale(w, h) cr.arc(0.5, 0.5, 0.5, -0.1, 360) cr.fill false end layout.put(gestured_widget2, 0, 25) # gesture handlers expand_size = 20 expand_left = proc do |widget| x = layout.child_get_property(widget, :x) y = layout.child_get_property(widget, :y) w, h = widget.size_request layout.move(widget, x - expand_size, y) widget.set_size_request(w + expand_size, h) end expand_right = proc do |widget| x = layout.child_get_property(widget, :x) y = layout.child_get_property(widget, :y) w, h = widget.size_request layout.move(widget, x, y) widget.set_size_request(w + expand_size, h) end expand_top = proc do |widget| x = layout.child_get_property(widget, :x) y = layout.child_get_property(widget, :y) w, h = widget.size_request layout.move(widget, x, y - expand_size) widget.set_size_request(w, h + expand_size) end expand_bottom = proc do |widget| x = layout.child_get_property(widget, :x) y = layout.child_get_property(widget, :y) w, h = widget.size_request layout.move(widget, x, y) widget.set_size_request(w, h + expand_size) end layout.add_gesture_action(["L"]) do |widget| expand_left.call(widget) end layout.add_gesture_action(["U"]) do |widget| expand_top.call(widget) end layout.add_gesture_action(["LL"]) do |widget| expand_left.call(widget) expand_bottom.call(widget) end layout.add_gesture_action(["R", "LR"]) do |widget| expand_right.call(widget) expand_bottom.call(widget) expand_right.call(widget) end window.add(layout) window.signal_connect("destroy") { Gtk.main_quit } window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/pango-layout.rb000077500000000000000000000046641511343406000242610ustar00rootroot00000000000000#!/usr/bin/env ruby =begin pangolayout.rb - Ruby/GTK sample script. Copyright (c) 2005-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" RADIUS = 80 N_WORDS = 16 HEIGHT = 400 WIDTH = 400 class PaintableWindow < Gtk::Window attr_reader :x, :y, :width, :height def initialize(name) super(name) set_app_paintable(true) set_decorated(true) set_default_size(WIDTH, HEIGHT) signal_connect("destroy") { Gtk.main_quit } set_double_buffered(false) # Get the size attributes when the window is resized signal_connect "size-allocate" do |_widget, rectangle| @x = rectangle.x @y = rectangle.y @width = rectangle.width @height = rectangle.height end signal_connect "screen-changed" do |widget, _old_screen| screen_changed(widget) end screen_changed(self) end def supports_alpha? @supports_alpha end private def screen_changed(widget) visual = widget.screen.rgba_visual if visual && widget.screen.composited? set_visual(visual) @supports_alpha = true else set_visual(widget.screen.system_visual) @supports_alpha = false end end end pangolayout = PaintableWindow.new("Pango Render") pangolayout.signal_connect "draw" do |widget, cr| # Redraw on a clean destination # http://cairographics.org/manual/cairo-cairo-t.html#cairo-operator-t cr.set_operator(Cairo::OPERATOR_SOURCE) if widget.supports_alpha? cr.set_source_rgba(0, 0, 0, 0.3) else cr.set_source_rgb(1, 1, 1) end cr.paint device_radius = [widget.width, widget.height].min / 6.0 cr.translate(device_radius + (widget.width - 2 * device_radius) / 2.0, device_radius + (widget.height - 2 * device_radius) / 2.0) cr.scale(device_radius / RADIUS, device_radius / RADIUS) pango_layout = cr.create_pango_layout pango_layout.text = "Ruby-GNOME2" pango_layout.font_description = Pango::FontDescription.new("Sans Bold 14") N_WORDS.times do |i| angle = 360 * i / N_WORDS.to_f cr.set_source_rgb((65_535 * rand) / 65_355, (65_535 * rand) / 65_355, (65_535 * rand) / 65_355) cr.rotate((angle * Math::PI) / 180.0) cr.update_pango_layout(pango_layout) width, _height = pango_layout.size cr.move_to((width / 2) / Pango::SCALE, RADIUS) cr.show_pango_layout(pango_layout) end end pangolayout.show Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/pointer-grab.rb000066400000000000000000000016251511343406000242220ustar00rootroot00000000000000=begin pointer_grab.rb - Gdk::Window#pointer_grab/ungrab sample script. Copyright (C) 2001-2015 Masao Mutoh This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new("Pointer grab/ungrab sample") cursor = Gdk::Cursor.new(:watch) button1 = Gtk::Button.new(:label => "Grab Window!") button2 = Gtk::Button.new(:label => "Ungrab Window!") button1.signal_connect("clicked") do Gdk.pointer_grab(window.window, true, :button_press_mask, window.window, cursor, Gdk::CURRENT_TIME) p Gdk.pointer_is_grabbed? end button2.signal_connect("clicked") do Gdk.pointer_ungrab(Gdk::CURRENT_TIME) p Gdk.pointer_is_grabbed? end vbox = Gtk::Box.new(:vertical, 0) vbox.add(button1) vbox.add(button2) window.add(vbox) window.set_default_size(200, 100) window.show_all window.signal_connect("destroy") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/print.rb000066400000000000000000000146731511343406000227740ustar00rootroot00000000000000#!/usr/bin/env ruby =begin print.rb - Gtk::Print* sample Copyright (C) 2007 Mathieu Blondel Copyright (C) 2007-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" # Values returned by a Pango::Layout or set in a Pango::Layout # are always multiple of Pango::SCALE. Those are convenience methods to # deal with that. class Pango::Layout def size_in_points size.collect { |v| v / Pango::SCALE } end def width_in_points size[0] / Pango::SCALE end def height_in_points size[1] / Pango::SCALE end def width_in_points=(width) self.width = width * Pango::SCALE end end class Print < Gtk::PrintOperation FONT = Pango::FontDescription.new("sans 12") FONT_SMALL = Pango::FontDescription.new("sans 8") FONT_SIZE = 12 FONT_SMALL_SIZE = 8 def initialize(parent_window, text) super() @parent_window = parent_window @text = text # with this option disabled, the origin is the the upper left corner # *taking into consideration margins* ! self.use_full_page = false self.unit = Gtk::Unit::POINTS # set default paper size page_setup = Gtk::PageSetup.new paper_size = Gtk::PaperSize.new(Gtk::PaperSize.default) page_setup.paper_size_and_default_margins = paper_size self.default_page_setup = page_setup # show a progress bar self.show_progress = true # You must choose between "paginate" and "begin-print". # "begin-print" is emitted only once and "paginate" is emitted # until the block returns true. # In both cases, you must set the number of pages at the end with # Gtk::PrintOperation#n_pages= signal_connect("begin-print") do |pop, context| puts "calls begin-print" cr = context.cairo_context paragraphs = @text.split("\n") layouts = [] paragraphs.each do |para| layouts << create_layout(cr, para) end # distribute paragraph layouts among pages @page_layouts = [] curr_height = 0 n_pages = 0 layouts.each do |layout| height = layout.height_in_points if curr_height + height > real_page_height n_pages += 1 curr_height = 0 end @page_layouts[n_pages] ||= [] @page_layouts[n_pages] << layout curr_height += height end pop.n_pages = n_pages + 1 end signal_connect("draw-page") do |_pop, context, page_num| puts format("calls draw-page %d", page_num) cr = context.cairo_context x, y = [0, 0] # this means we start at the upper left margin if @page_layouts[page_num] @page_layouts[page_num].each do |layout| cr.move_to(x, y) cr.show_pango_layout(layout) y += layout.height_in_points end total_pages = @page_layouts.length else total_pages = 1 end # page_num starts at 0 draw_footer(cr, page_num + 1, total_pages) end end def run_print_dialog res = run(Gtk::PrintOperationAction::PRINT_DIALOG, @parent_window) case res when Gtk::PrintOperationResult::ERROR puts "error" when Gtk::PrintOperationResult::CANCEL puts "cancelled" when Gtk::PrintOperationResult::APPLY puts "applied" when Gtk::PrintOperationResult::IN_PROGRESS puts "in progress" end end def run_preview res = run(Gtk::PrintOperationAction::PREVIEW, @parent_window) end private def page_height setup = default_page_setup # this takes margins into consideration, contrary to get_paper_height setup.get_page_height(Gtk::Unit::POINTS) end def page_width setup = default_page_setup width = setup.get_page_width(Gtk::Unit::POINTS) end def real_page_height page_height - footer_height end def footer_height 5 * FONT_SMALL_SIZE end def create_layout(cr, text) layout = cr.create_pango_layout layout.width_in_points = page_width layout.font_description = FONT layout.wrap = Pango::Layout::WrapMode::CHAR layout.ellipsize = Pango::Layout::ELLIPSIZE_NONE layout.single_paragraph_mode = false layout.text = text layout end def draw_footer(cr, nth_page, total_page) layout = cr.create_pango_layout layout.alignment = Pango::Layout::ALIGN_RIGHT layout.font_description = FONT_SMALL layout.text = format("Page %d/%d\n%s\nPowered by Ruby-GNOME2!", nth_page, total_page, Time.now.strftime("Printed on %Y/%m/%d at %H:%M")) width, height = layout.size_in_points x, y = [page_width, page_height] x -= width y -= height cr.move_to(x, y) cr.show_pango_layout(layout) cr.rel_move_to(width, -2) cr.rel_line_to(-page_width, 0) cr.stroke end end class Window < Gtk::Window def initialize super signal_connect("delete-event") { Gtk.main_quit } set_default_size(600, 600) @textview = Gtk::TextView.new @textview.wrap_mode = Gtk::WrapMode::WORD fill_buffer hbox = Gtk::Box.new(:horizontal) page_setup_button = Gtk::Button.new(:label => "Page setup") page_setup_button.signal_connect("clicked") do @page_setup = Gtk.print_run_page_setup_dialog(self, # parent window @page_setup) end print_preview_button = Gtk::Button.new(:label => "Print Preview") print_preview_button.signal_connect("clicked") do printop = Print.new(self, @textview.buffer.text) printop.default_page_setup = @page_setup if @page_setup printop.run_preview end print_button = Gtk::Button.new(:label => "Print") print_button.signal_connect("clicked") do printop = Print.new(self, @textview.buffer.text) printop.default_page_setup = @page_setup if @page_setup printop.run_print_dialog end [page_setup_button, print_preview_button, print_button].each do |b| hbox.pack_start(b, :expand => true, :fill => true) # expand, fill end vbox = Gtk::Box.new(:vertical) scroll = Gtk::ScrolledWindow.new @textview.show scroll.add(@textview) scroll.set_policy(:automatic, :automatic) vbox.pack_start(scroll, :expand => true, :fill => true) vbox.pack_end(hbox, :expand => false, :fill => false) add(vbox) show_all end private def fill_buffer open(__FILE__).read.each_line do |line| @textview.buffer.insert_at_cursor(line) end @textview.buffer.place_cursor(@textview.buffer.start_iter) end end Window.new Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/properties.rb000077500000000000000000000044751511343406000240360ustar00rootroot00000000000000#!/usr/bin/env ruby =begin properties.rb - GLib::Object#properties and Gtk::Container#child_properties sample script. Copyright (C) 2004-2006 Masao Mutoh Copyright (c) 2004-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class MyButton < Gtk::Button type_register def initialize(label = nil) # XXX: # When type_register() is used. # super is equivalent to GLib::Object#initialize. super("label" => label) @fuga = 0 @hoge = 0 end # define new property "fuga" install_property(GLib::Param::Int.new("fuga", # name "Fuga", # nick "fuga fuga", # blurb 0, # min 10_000,# max 0, # default GLib::Param::READABLE | GLib::Param::WRITABLE)) # define new property "hoge" install_child_property(1,GLib::Param::Int.new("hoge", # name "Hoge", # nick "hoge hoge", # blurb 0, # min 10_000,# max 0, # default GLib::Param::READABLE | GLib::Param::WRITABLE) ) # implementation of the property "fuga" def fuga puts "MyButton#fuga is called" @fuga end def fuga=(arg) puts "MyButton#fuga= is called" @fuga = arg notify("fuga") end # implementation of the property "hoge" def get_hoge(child) puts "MyButton#get_hoge is called" @hoge end def set_hoge(child, arg) puts "MyButton#set_hoge is called" @hoge = arg end end b = MyButton.new("Hello") p b p b.label p b.gtype p MyButton.properties p b.get_property("fuga") b.set_property("fuga", 1) p b.get_property("fuga") p MyButton.child_properties p child = b.child p b.child_get_property(child, "hoge") b.child_set_property(child, "hoge", 2) p b.child_get_property(child, "hoge") p MyButton.ancestors ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/radiobutton.rb000066400000000000000000000017741511343406000241700ustar00rootroot00000000000000#!/usr/bin/env ruby =begin radiobutton.rb - Ruby/GTK2 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("Gtk::RadioButton sample") window.signal_connect("destroy") { Gtk.main_quit } main_vbox = Gtk::Box.new(:vertical) window.add(main_vbox) top_box = Gtk::Box.new(:vertical, 10) top_box.border_width = 10 main_vbox.add(top_box) button1 = Gtk::RadioButton.new(:label => "_button1", :use_underline => true) button2 = Gtk::RadioButton.new(:member => button1, :label => "_button2", :use_underline => false) top_box.add(button1) top_box.add(button2) main_vbox.add(Gtk::Separator.new(:horizontal)) bottom_box = Gtk::Box.new(:vertical, 10) bottom_box.border_width = 10 main_vbox.add(bottom_box) close = Gtk::Button.new(:label => "close") close.signal_connect("clicked") do Gtk.main_quit end bottom_box.add(close) close.can_default = true close.grab_default window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/recentchooserdialog.rb000077500000000000000000000023751511343406000256620ustar00rootroot00000000000000#!/usr/bin/env ruby =begin recentchooserdialog.rb - Ruby/GTK sample script. Copyright (c) 2006-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" dialog = Gtk::RecentChooserDialog.new(:title => "Recent Chooser Dialog Sample", :buttons => [["_Cancel", :cancel], ["_Accept", :accept]]) dialog.signal_connect("response") do |_widget, response| case response when Gtk::ResponseType::ACCEPT info = dialog.current_item if info puts "----" puts info.uri puts info.display_name puts info.description puts info.mime_type puts info.added puts info.modified puts info.visited puts info.private_hint? p info.get_application_info("gedit") p info.applications puts info.last_application p info.groups puts info.has_group?("web") puts info.has_application?("gedit") puts info.get_icon(64) puts info.short_name puts info.uri_display puts info.age puts info.local? puts info.exist? end else puts "Close" dialog.destroy Gtk.main_quit end end dialog.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/rgtk+cairo.rb000077500000000000000000000016121511343406000236700ustar00rootroot00000000000000#!/usr/bin/env ruby =begin rgtk+cairo.rb - Ruby/GTK2 using Ruby/Cairo sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. Heavily inspired from png.rb example of rcairo. =end require "gtk3" w = Gtk::Window.new w.add(vb = Gtk::Box.new(:vertical)) vb.add(da = Gtk::DrawingArea.new) da.set_size_request(200, 200) da.signal_connect "draw" do |_widget, cr| # fill background with white cr.set_source_rgba(1.0, 1.0, 1.0, 1.0) cr.paint # create shape cr.move_to(50, 50) cr.curve_to(100, 25, 100, 75, 150, 50) cr.line_to(150, 150) cr.line_to(50, 150) cr.close_path cr.set_source_rgb(0.0, 0.0, 0.0) cr.fill_preserve cr.set_source_rgb(1.0, 0.0, 0.0) cr.set_line_join(Cairo::LINE_JOIN_MITER) cr.set_line_width(4) cr.stroke end w.signal_connect("destroy") { Gtk.main_quit } w.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/scalebutton.rb000077500000000000000000000014671511343406000241630ustar00rootroot00000000000000#!/usr/bin/env ruby =begin scalebutton.rb - Very simple Gtk::ScaleButton example. Copyright (c) 2007-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new window.set_size_request(300, 300) scale = Gtk::ScaleButton.new scale.set_value(30) scale.set_valign(:end) scale.set_halign(:end) box = Gtk::Box.new(:vertical) box.add(scale) box.vexpand = true box.hexpand = true window.add(box) # see here for an explication on icons order # https://developer.gnome.org/gtk3/stable/GtkScaleButton.html#GtkScaleButton--icons scale.set_icons(%w(go-bottom go-top system-run)) scale.signal_connect("value-changed") { |_widget, value| puts "value changed: #{value}" } window.show_all window.signal_connect("destroy") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/simple_window.gresource.xml000066400000000000000000000002311511343406000266730ustar00rootroot00000000000000 simple_window.ui ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/simple_window.ui000066400000000000000000000010401511343406000245120ustar00rootroot00000000000000 False True False label end ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/statusicon.rb000077500000000000000000000053321511343406000240270ustar00rootroot00000000000000#!/usr/bin/env ruby =begin status_icon.rb - Gtk::StatusIcon sample. This sample refers gtk/tests/teststatusicon.c of GTK+-2.10.x. Copyright (c) 2006-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" unless Gtk::Version.or_later?(3, 10, 7) puts "This sample requires GTK+ 3.10.7 or later" exit end class StatusIconSample < Gtk::StatusIcon STATUS_INFO = 0 STATUS_QUESTION = 1 def initialize super @status = STATUS_INFO update_icon signal_connect("activate") {icon_activated} signal_connect("popup-menu") do |w, button, activate_time| menu = Gtk::Menu.new menuitem = Gtk::MenuItem.new(:label => "Quit") menuitem.signal_connect("activate") do set_visible(false) Gtk.main_quit end menu.append(menuitem) menu.show_all menu.popup(nil, nil, button, activate_time) end @timeout = timeout_func end def update_icon if @status == STATUS_INFO self.stock = Gtk::Stock::DIALOG_INFO set_tooltip_text("Some Information ...") else self.stock = Gtk::Stock::DIALOG_QUESTION set_tooltip_text("Some Question ...") end end def timeout_func GLib::Timeout.add(2000) do if @status == STATUS_INFO @status = STATUS_QUESTION else @status = STATUS_INFO end update_icon true end end def icon_activated unless @dialog @dialog = Gtk::MessageDialog.new(:parent => nil, :flags => 0, :type => Gtk::MessageType::QUESTION, :buttons_type => Gtk::ButtonsType::CLOSE, :message => "You wanna test the status icon?") @dialog.window_position = Gtk::WindowPosition::CENTER @dialog.signal_connect("response") {@dialog.hide} @dialog.signal_connect("delete_event") {@dialog.hide_on_delete} toggle = Gtk::ToggleButton.new(:label => "_Show the icon", :use_underline => true) @dialog.child.pack_end(toggle, :expand => true, :fill => true, :padding => 6) toggle.active = visible? toggle.signal_connect("toggled") do |w| set_visible(w.active?) end toggle = Gtk::ToggleButton.new(:label => "_Change the icon", :use_underline => true) @dialog.child.pack_end(toggle, :expand => true, :fill => true, :padding => 6) toggle.active = (@timeout != 0) toggle.signal_connect("toggled") do if @timeout and @timeout > 0 GLib::Source.remove(@timeout) @timeout = 0 else @timeout = timeout_func end end end @dialog.show_all @dialog.present end end StatusIconSample.new Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/stock.rb000066400000000000000000000015471511343406000227570ustar00rootroot00000000000000=begin stock.rb - Gtk::Stock sample script. Copyright (C) 2001-2006 Masao Mutoh Copyright (c) 2001-2020 Ruby-GNOME Project Team This program is licenced under the same licence as Ruby-GNOME. =end require "gtk3" window = Gtk::Window.new("Gtk::Stock sample") window.signal_connect("destroy") { Gtk.main_quit } stocks = Gtk::Stock.constants.sort.cycle image = Gtk::Image.new(:stock => Gtk::Stock::OK, :size => :dialog) label = Gtk::Label.new("Gtk::Stock::OK") button = Gtk::Button.new(:label => "Click!") button.signal_connect("clicked") do stock = stocks.next stock_name = "Gtk::Stock::#{stock}" label.set_text(stock_name) image.set_stock(eval(stock_name)) end box = Gtk::Box.new(:vertical, 0) box.add(image, :expand => true) box.add(label, :expand => true) box.add(button) window.add(box) window.set_default_size(200, 200) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/style-property.rb000077500000000000000000000044041511343406000246540ustar00rootroot00000000000000#!/usr/bin/env ruby =begin style_property.rb - Ruby/GTK sample script. Copyright (c) 2004-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class MyButton < Gtk::Button type_register def initialize(label = nil) # When type_register() is used. # super is equivalent to GLib::Object#initialize. super("label" => label) end install_style_property(GLib::Param::Int.new("foo", # name "Foo", # nick "FOO", # blurb 0, # min 100, # max 5, # default GLib::Param::READABLE | GLib::Param::WRITABLE)) do |pspec, str| p pspec, str str.to_i + 10 # return the converted value. end install_style_property(GLib::Param::Enum.new("bar", # name "Bar", # nick "BAR", # blurb GLib::Type["GdkCursorType"], # Enum type Gdk::CursorType::ARROW, # default GLib::Param::READABLE | GLib::Param::WRITABLE)) do |pspec, str| p pspec, str if str.strip! == "boat" Gdk::Cursor::BOAT else pspec.default end end end provider = Gtk::CssProvider.new provider.load(:data => <<-CSS) * { -MyButton-foo: 30; -MyButton-bar: boat; } CSS display = Gdk::Display.default screen = display.default_screen Gtk::StyleContext.add_provider_for_screen(screen, provider, Gtk::StyleProvider::PRIORITY_USER) win = Gtk::Window.new("Custom style properties") b = MyButton.new("Hello") b.signal_connect("clicked") { Gtk.main_quit } p MyButton.style_properties win.set_default_size(100, 100) win.add(b) win.show_all win.signal_connect("destroy") { Gtk.main_quit } # You need to call them after "Gtk::Widget#show" # (Or in expose event). p b.style_get_property("foo") p b.style_get_property("bar") Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/t-gtkplug.rb000066400000000000000000000027101511343406000235430ustar00rootroot00000000000000#!/usr/bin/env ruby =begin Sample script using Gtk::Socket and Gtk::Plug. $ ruby t-gtksocket.rb Written by Alex Boussinet for testing purpose only. Copyright (c) 2003-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class MyGtkPlug def initialize(xid, plug) plug = "Button" if plug.nil? if xid.nil? @window = Gtk::Window.new("Gtk::Plug Test") @window.set_default_size(250, 50) else @window = Gtk::Plug.new(xid.to_i) end @window.window_position = Gtk::WindowPosition::CENTER @window.signal_connect("delete_event") { Gtk.main_quit } @vbox = Gtk::Box.new(:vertical, 5) @window.add(@vbox) @button1 = Gtk::Button.new(:label => plug) @button1.signal_connect("clicked") { $stderr.puts plug } @button2 = Gtk::Button.new(:label => "Exit") @button2.signal_connect("clicked") { Gtk.main_quit } # Exit button to test an unexpected end of child process by Gtk::Socket @vbox.pack_start(@button1, :expand => true, :fill => true) @vbox.pack_start(@button2, :expand => true, :fill => true) @window.show_all end end xid = nil ARGV.each_index do |i| arg = ARGV.at(i) if arg == "-x" if arg.length > 2 xid = arg[2..-1] else xid = ARGV.at(i + 1) ARGV.delete_at(i + 1) end xid = nil if xid.to_i <= 0 ARGV.delete_at(i) end end MyGtkPlug.new(xid, ARGV.shift) Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/t-gtksocket.rb000066400000000000000000000031421511343406000240640ustar00rootroot00000000000000#!/usr/bin/env ruby =begin Sample script using Gtk::Socket and Gtk::Plug. $ ruby t-gtksocket.rb Written by Alex Boussinet for testing purpose only. Copyright (c) 2003-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" class MyGtkSocket < Gtk::Window def initialize super("Gtk::Socket Test") set_window_position(Gtk::WindowPosition::CENTER) signal_connect("delete_event") { Gtk.main_quit } @buttons = [] 6.times do |n| @buttons << Gtk::Button.new(:label => "Plug #{n}") @buttons.last.signal_connect("clicked") { plug(n) } end @grid = Gtk::Grid.new @grid.set_row_spacing(5) @grid.set_column_spacing(5) add(@grid) @vbox = Gtk::Box.new(:vertical, 5) @buttons.each { |b| @vbox.add(b) } @vbox.set_size_request(150, 190) @grid.attach(@vbox, 0, 0, 1, 1) @socket = Gtk::Socket.new @grid.attach(@socket, 1, 0, 1, 1) @socket.set_size_request(150, 150) show_all @xid = @socket.id @pid = 0 end def plug(arg) if @pid != 0 Process.kill("SIGKILL", @pid) Process.waitpid(@pid) begin @grid.remove(@socket) unless @socket.destroyed? rescue ArgumentError # socket has been destroyed because child process finished unexpectedly end @socket = Gtk::Socket.new @grid.attach(@socket, 1, 0, 1, 1) @socket.set_size_request(150, 190) @socket.show @xid = @socket.id end @pid = fork { exec "ruby t-gtkplug.rb -x #{@xid} Plug#{arg}" } end end MyGtkSocket.new Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/template-from-resource.rb000077500000000000000000000025451511343406000262370ustar00rootroot00000000000000#!/usr/bin/env ruby =begin template_from_resource.rb - Ruby/GTK sample script. Copyright (c) 2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" require "fileutils" current_path = File.expand_path(File.dirname(__FILE__)) # The gresource file name gresource_bin = "#{current_path}/template.gresource" # The gresource xml file name # see here https://developer.gnome.org/gio/stable/GResource.html gresource_xml = "#{current_path}/template.gresource.xml" # Generate the resource file: # see here https://developer.gnome.org/gio/stable/glib-compile-resources.html Dir.chdir(File.dirname(gresource_xml)) do system("glib-compile-resources", "--target", gresource_bin, File.basename(gresource_xml)) end at_exit do FileUtils.rm_f(gresource_bin) end resource = Gio::Resource.load(gresource_bin) Gio::Resources.register(resource) class MyWindow < Gtk::Window class << self def init set_template(:resource => "/template/template.ui") bind_template_child("label") end end type_register end window = MyWindow.new window.set_title "Build interface from resource" window.set_default_size 300, 300 window.label.text = "My UI was created with Glade" window.show_all window.signal_connect "destroy" do Gtk.main_quit Gio::Resources.unregister(resource) end Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/template.gresource.xml000066400000000000000000000002171511343406000256320ustar00rootroot00000000000000 template.ui ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/template.ui000066400000000000000000000010521511343406000234500ustar00rootroot00000000000000 ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/test.xpm000066400000000000000000000037671511343406000230220ustar00rootroot00000000000000/* XPM */ static char *openfile[] = { /* width height num_colors chars_per_pixel */ " 20 19 66 2", /* colors */ ".. c None", ".# c #000000", ".a c #dfdfdf", ".b c #7f7f7f", ".c c #006f6f", ".d c #00efef", ".e c #009f9f", ".f c #004040", ".g c #00bfbf", ".h c #ff0000", ".i c #ffffff", ".j c #7f0000", ".k c #007070", ".l c #00ffff", ".m c #00a0a0", ".n c #004f4f", ".o c #00cfcf", ".p c #8f8f8f", ".q c #6f6f6f", ".r c #a0a0a0", ".s c #7f7f00", ".t c #007f7f", ".u c #5f5f5f", ".v c #707070", ".w c #00f0f0", ".x c #009090", ".y c #ffff00", ".z c #0000ff", ".A c #00afaf", ".B c #00d0d0", ".C c #00dfdf", ".D c #005f5f", ".E c #00b0b0", ".F c #001010", ".G c #00c0c0", ".H c #000f0f", ".I c #00007f", ".J c #005050", ".K c #002f2f", ".L c #dfcfcf", ".M c #dfd0d0", ".N c #006060", ".O c #00e0e0", ".P c #00ff00", ".Q c #002020", ".R c #dfc0c0", ".S c #008080", ".T c #001f1f", ".U c #003f3f", ".V c #007f00", ".W c #00000f", ".X c #000010", ".Y c #00001f", ".Z c #000020", ".0 c #00002f", ".1 c #000030", ".2 c #00003f", ".3 c #000040", ".4 c #00004f", ".5 c #000050", ".6 c #00005f", ".7 c #000060", ".8 c #00006f", ".9 c #000070", "#. c #7f7f80", "## c #9f9f9f", /* pixels */ "........................................", "........................................", "........................................", ".......................#.#.#............", ".....................#.......#...#......", "...............................#.#......", ".......#.#.#.................#.#.#......", ".....#.y.i.y.#.#.#.#.#.#.#..............", ".....#.i.y.i.y.i.y.i.y.i.#..............", ".....#.y.i.y.i.y.i.y.i.y.#..............", ".....#.i.y.i.y.#.#.#.#.#.#.#.#.#.#.#....", ".....#.y.i.y.#.s.s.s.s.s.s.s.s.s.#......", ".....#.i.y.#.s.s.s.s.s.s.s.s.s.#........", ".....#.y.#.s.s.s.s.s.s.s.s.s.#..........", ".....#.#.s.s.s.s.s.s.s.s.s.#............", ".....#.#.#.#.#.#.#.#.#.#.#..............", "........................................", "........................................", "........................................" }; ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/textbuffer-serialize.rb000077500000000000000000000120731511343406000257760ustar00rootroot00000000000000#!/usr/bin/env ruby =begin textbuffer_serialize.rb - Ruby/GTK sample script. Copyright (c) 2006-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" unless Gtk::Version.or_later?(3, 4, 2) puts "This sample requires GTK+ 3.4.2 or later: #{Gtk::Version::STRING}" exit end current_folder = ENV["HOME"] || "." file_name = "serialized.dat" textview = Gtk::TextView.new textview.set_size_request(600, 400) buffer = textview.buffer buffer.text = < nil, :label => "Deserialize from a file",:stock_id => Gtk::Stock::OPEN) button_open.signal_connect "clicked" do dialog = Gtk::FileChooserDialog.new(:title => "Deserialize from a file", :parent => window, :actions => :open, :buttons => [ [Gtk::Stock::CANCEL, Gtk::ResponseType::CANCEL], [Gtk::Stock::OPEN, Gtk::ResponseType::ACCEPT]]) dialog.filename = File.expand_path(file_name) if dialog.run == Gtk::ResponseType::ACCEPT file_name = dialog.filename File.open(file_name, "rb") {|io| buffer.delete(buffer.start_iter, buffer.end_iter) buffer.deserialize(buffer, deserialize_format, buffer.start_iter, io.read) } end dialog.destroy end button_save = Gtk::ToolButton.new(:icon_widget => nil, :label => "Serialize to a file",:stock_id => Gtk::Stock::SAVE) button_save.signal_connect "clicked" do dialog = Gtk::FileChooserDialog.new(:title => "Serialize to a file", :parent => window, :action => :save, #or Gtk::FileChooserAction::SAVE, :buttons => [ [Gtk::Stock::CANCEL, Gtk::ResponseType::CANCEL], [Gtk::Stock::OPEN, Gtk::ResponseType::ACCEPT] ]) dialog.current_name = file_name if dialog.run == Gtk::ResponseType::ACCEPT file_name = dialog.filename File.open(file_name, "wb") {|io| data = buffer.serialize(buffer, format, buffer.start_iter, buffer.end_iter) io.write(data) } end dialog.destroy end button_clear = Gtk::ToolButton.new(:icon_widget => nil, :label => "Clear all",:stock_id => Gtk::Stock::CLEAR) button_clear.signal_connect("clicked") { buffer.delete(buffer.start_iter, buffer.end_iter) } toolbar.insert(button_clear, 0) button_color = Gtk::ToolButton.new(:icon_widget => nil, :label => "Color the region",:stock_id => Gtk::Stock::SELECT_COLOR) 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] 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 end dialog.destroy end button_font = Gtk::ToolButton.new(:label => "Set a font to the region", :stock_id => Gtk::Stock::SELECT_FONT) 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 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 end dialog.destroy end button_quit = Gtk::ToolButton.new(:label => "Quit this application", :stock_id => Gtk::Stock::QUIT) button_quit.signal_connect("clicked") {Gtk.main_quit} toolbar.insert(button_font, 0) toolbar.insert(button_color,0) toolbar.insert(button_open, 0) toolbar.insert(button_save, 0) toolbar.insert(button_quit, -1) toolbar.set_style(Gtk::ToolbarStyle::BOTH) vbox.pack_start(toolbar, :expand => false, :fill => false) vbox.pack_start(textview, :expand => true, :fill => true) window.add(vbox) window.show_all window.set_default_size 400,600 window.signal_connect("destroy") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/threads.rb000077500000000000000000000040071511343406000232630ustar00rootroot00000000000000#!/usr/bin/env ruby =begin threads.rb - Ruby/GTK sample script. Copyright (c) 2003-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" require "thread" class GtkJobQueue def initialize @queue = Queue.new @worker_id = nil end def push(&job) @queue << job if @worker_id.nil? start_worker end end def stop return if @worker_id.nil? GLib::Source.remove(@worker_id) @worker_id = nil end private def start_worker @worker_id = GLib::Idle.add do job = @queue.pop job.call if @queue.empty? @worker_id = nil GLib::Source::REMOVE else GLib::Source::CONTINUE end end end end job_queue = GtkJobQueue.new label = Gtk::Label.new Thread.new do (0...1000).each do |cnt| p "A:" + cnt.to_s job_queue.push do label.label = "A:" + cnt.to_s end sleep(2) end end start_button = Gtk::Button.new(:label => "start") stop_button = Gtk::Button.new(:label => "stop") start_button.signal_connect("clicked") do start_button.sensitive = false @th = Thread.new do (0...10).each do |cnt| p "B:" + cnt.to_s job_queue.push do label.label = "B:" + cnt.to_s end sleep(2) end @th = nil job_queue.push do start_button.sensitive = true start_button.grab_focus stop_button.sensitive = false end end stop_button.sensitive = true stop_button.grab_focus end stop_button.signal_connect("clicked") do if @th @th.kill puts "killed" @th = nil start_button.sensitive = true start_button.grab_focus stop_button.sensitive = false end end stop_button.sensitive = false box = Gtk::Box.new(:vertical, 0) box.set_size_request(100, 100) box << label << start_button << stop_button win = Gtk::Window.new << box win.show_all.signal_connect("delete_event") do p "Exiting..." job_queue.stop Gtk.main_quit Thread.list.each { |t| t.kill if t != Thread.main } end Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/to-drawable.rb000077500000000000000000000015011511343406000240260ustar00rootroot00000000000000#!/usr/bin/env ruby =begin 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. =end require "gtk3" filename = "#{File.expand_path(File.dirname(__FILE__))}/gnome-logo-icon.png" window = Gtk::Window.new("Drawable sample") window.set_border_width(10) pixbuf = GdkPixbuf::Pixbuf.new(:file => filename) drawing_area = Gtk::DrawingArea.new window.add(drawing_area) drawing_area.set_size_request(pixbuf.width + 40, pixbuf.height + 40) drawing_area.signal_connect("draw") do |_widget, cr| cr.set_source_rgb(1, 1, 1) cr.paint cr.set_source_pixbuf(pixbuf, 20, 20) cr.paint false end window.show_all window.signal_connect("delete-event") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/togglebutton.rb000066400000000000000000000013221511343406000243400ustar00rootroot00000000000000#!/usr/bin/env ruby =begin togglebutton.rb - Ruby/GTK sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("Gtk::ToggleButton sample") window.border_width = 10 box = Gtk::Box.new(:vertical, 10) window.add(box) button1 = Gtk::ToggleButton.new(:label => "_button1", :use_underline => true) button2 = Gtk::ToggleButton.new(:label => "_button2", :use_underline => false) box.add(button1) box.add(button2) box.pack_start(Gtk::Separator.new(:horizontal)) close = Gtk::Button.new(:label => "close") close.signal_connect("clicked") do Gtk.main_quit end box.add(close) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/toolbar-menu.ui000066400000000000000000000011711511343406000242430ustar00rootroot00000000000000
_Open app.open _Save app.save
_Close app.close
ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/toolbar.rb000066400000000000000000000042521511343406000232720ustar00rootroot00000000000000#!/usr/bin/env ruby =begin toolbar.rb - Ruby/GTK3 sample script. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" test_xpm_file = "#{File.expand_path(File.dirname(__FILE__))}/test.xpm" window = Gtk::Window.new("Gtk::Toolbar sample") window.signal_connect("destroy") do Gtk.main_quit end window.set_default_size 600, 600 toolbar = Gtk::Toolbar.new button_horizontal = Gtk::ToolButton.new(:icon_widget => Gtk::Image.new(:file => test_xpm_file), :label => "Horizontal toolbar layout") button_horizontal.tooltip_text = "Toolbar/Horizontal" button_horizontal.signal_connect "clicked" do toolbar.orientation = :horizontal end button_vertical = Gtk::ToolButton.new(:icon_widget => Gtk::Image.new(:file => test_xpm_file), :label => "Vertical toolbar layout") button_vertical.tooltip_text = "Toolbar/Vertical" button_vertical.signal_connect "clicked" do toolbar.orientation = :vertical end button_icons_only = Gtk::ToolButton.new(:icon_widget => Gtk::Image.new(:file => test_xpm_file), :label => "Only show toolbar icons") button_icons_only.tooltip_text = "Toolbar/IconsOnly" button_icons_only.signal_connect "clicked" do toolbar.style = Gtk::ToolbarStyle::ICONS end button_text_only = Gtk::ToolButton.new(:icon_widget => Gtk::Image.new(:file => test_xpm_file), :label => "Only show toolbar text") button_text_only.tooltip_text = "Toolbar/TextOnly" button_text_only.signal_connect "clicked" do toolbar.style = Gtk::ToolbarStyle::TEXT end button_both = Gtk::ToolButton.new(:icon_widget => Gtk::Image.new(:file => test_xpm_file), :label => "Show toolbar icons and text") button_both.tooltip_text = "Toolbar/Both" button_both.signal_connect "clicked" do toolbar. style = Gtk::ToolbarStyle::BOTH end toolbar.insert(button_both, 0) toolbar.insert(button_text_only, 0) toolbar.insert(button_icons_only, 0) toolbar.insert(button_vertical, 0) toolbar.insert(button_horizontal, 0) window.add(toolbar) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/tooltips.rb000077500000000000000000000147071511343406000235160ustar00rootroot00000000000000#!/usr/bin/env ruby =begin tooltips.rb - Demonstrates the new tooltip API of Gtk+ 2.12; rg2 translation from gtk/tests/testtooltips.c. Copyright (c) 2007-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" unless Gtk::Version.or_later?(3, 4, 2) puts "This sample requires GTK+ 3.4.2 or later: #{Gtk::Version::STRING}" exit end def treeview_query_tooltip(treeview, keyboard_tip, x, y, tooltip) if keyboard_tip # Keyboard mode path, = treeview.cursor if not path return false end else bin_x, bin_y = treeview.convert_widget_to_bin_window_coords(x, y) # Mouse mode path, = treeview.get_path_at_pos(bin_x, bin_y) if not path return false end end data = treeview.model.get_value(treeview.model.get_iter(path), 0) tooltip.markup = "Path #{path}: #{data}" return true end def textview_query_tooltip(textview, keyboard_tip, x, y, tooltip, tag) if keyboard_tip iter = textview.buffer.get_iter_at_offset(textview.buffer.cursor_position) 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' return true else return false end end def drawingarea_query_tooltip(keyboard_tip, x, y, tooltip, rectangles) if keyboard_tip return false end for r in rectangles if r.x < x && x < r.x + 50 && r.y < y && y < r.y + 50 tooltip.markup = r.tooltip return true end end return false end window = Gtk::Window.new(:toplevel) window.title = 'Tooltips test' window.border_width = 10 window.signal_connect('delete-event') { Gtk.main_quit } box = Gtk::Box.new(:vertical, 3) window.add(box) # A check button using the tooltip-markup property button = Gtk::CheckButton.new('This one uses the tooltip-markup property') button.tooltip_text = 'Hello, I am a static tooltip.' box.pack_start(button, :expand => false, :fill => false, :padding => 0) raise if button.tooltip_text != 'Hello, I am a static tooltip.' raise if button.tooltip_markup != 'Hello, I am a static tooltip.' # A check button using the query-tooltip signal button = Gtk::CheckButton.new('I use the query-tooltip signal') button.has_tooltip = true button.signal_connect 'query-tooltip' do |widget, x, y, keyboard_tip, tooltip| tooltip.markup = widget.label tooltip.set_icon_from_icon_name(Gtk::Stock::DELETE, Gtk::IconSize::MENU) true end box.pack_start(button, :expand => false, :fill => false, :padding => 0) # A label label = Gtk::Label.new('I am just a label') label.selectable = false label.tooltip_text = 'Label & and tooltip' box.pack_start(label, :expand => false, :fill => false, :padding => 0) raise if label.tooltip_text != "Label & and tooltip" raise if label.tooltip_markup != "Label & and tooltip" # A selectable label label = Gtk::Label.new('I am a selectable label') label.selectable = true label.tooltip_markup = 'Another Label tooltip' box.pack_start(label, :expand => false, :fill => false, :padding => 0) raise if label.tooltip_text != 'Another Label tooltip' raise if label.tooltip_markup != 'Another Label tooltip' # Another one, with a custom tooltip window button = Gtk::CheckButton.new('This one has a custom tooltip window!') box.pack_start(button, :expand => false, :fill => false, :padding => 0) tooltip_window = Gtk::Window.new(:popup) tooltip_button = Gtk::Label.new('blaat!') tooltip_window.add(tooltip_button) tooltip_button.show button.tooltip_window = tooltip_window button.signal_connect('query-tooltip') { |widget, x, y, keyboard_tip, tooltip| widget.tooltip_window.override_background_color(Gtk::StateFlags::NORMAL, Gdk::RGBA.new(0, 1, 0, 1)) true } button.has_tooltip = true # An insensitive button button = Gtk::Button.new(:label => 'This one is insensitive') button.sensitive = false button.tooltip_text = 'Insensitive!' box.pack_start(button, :expand => false, :fill => false, :padding => 0) # Tree view store = Gtk::TreeStore.new(String) ["File Manager", "Gossip", "System Settings", "The GIMP", "Terminal", "Word Processor"].each do |value| iter = store.insert(nil, 0) store.set_value(iter,0, value) end treeview = Gtk::TreeView.new(store) treeview.set_size_request(200, 240) treeview.append_column(Gtk::TreeViewColumn.new('Test', Gtk::CellRendererText.new, { :text => 0 })) treeview.has_tooltip = true treeview.signal_connect('query-tooltip') { |widget, x, y, keyboard_tip, tooltip| treeview_query_tooltip(widget, keyboard_tip, x, y, tooltip) } treeview.selection.signal_connect('changed') { treeview.trigger_tooltip_query } # Set a tooltip on the column column = treeview.get_column(0) column.clickable = true #column.button.tooltip_text = 'Header' .button not available box.pack_start(treeview, :expand => false, :fill => false, :padding => 2) # Text view buffer = Gtk::TextBuffer.new buffer.insert(buffer.end_iter, 'Hello, the text ') tag = buffer.create_tag('bold', { 'weight' => Pango::WEIGHT_BOLD }) buffer.insert(buffer.end_iter, 'in bold', :tags => [tag]) buffer.insert(buffer.end_iter, ' has a tooltip!') textview = Gtk::TextView.new(buffer) textview.set_size_request(200, 50) textview.has_tooltip = true textview.signal_connect('query-tooltip') { |widget, x, y, keyboard_tip, tooltip| textview_query_tooltip(widget, keyboard_tip, x, y, tooltip, tag) } box.pack_start(textview, :expand => false, :fill => false, :padding => 2) # Drawing area Rectangle = Struct.new("Rectangle", :x, :y, :r, :g, :b, :tooltip) rectangles = [ Rectangle.new(10, 10, 0.0, 0.0, 0.9, "Blue box!"), Rectangle.new(200, 170, 1.0, 0.0, 0.0, "Red thing"), Rectangle.new(100, 50, 0.8, 0.8, 0.0, "Yellow thing") ] drawingarea = Gtk::DrawingArea.new drawingarea.set_size_request(320, 240) drawingarea.has_tooltip = true drawingarea.signal_connect('draw') do |_widget, cr| cr.rectangle(0, 0, drawingarea.allocation.width, drawingarea.allocation.height) cr.set_source_rgb(1.0, 1.0, 1.0) cr.fill rectangles.each { |r| cr.rectangle(r.x, r.y, 50, 50) cr.set_source_rgb(r.r, r.g, r.b) cr.stroke cr.rectangle(r.x, r.y, 50, 50) cr.set_source_rgba(r.r, r.g, r.b, 0.5) cr.fill } end drawingarea.signal_connect('query-tooltip') { |widget, x, y, keyboard_tip, tooltip| drawingarea_query_tooltip(keyboard_tip, x, y, tooltip, rectangles) } box.pack_start(drawingarea, :expand => false, :fill => false, :padding => 2) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/tree-combo.rb000066400000000000000000000040631511343406000236640ustar00rootroot00000000000000=begin tree_combo.rb - Gtk::TreeView and Gtk::CellRendererCombo sample script. Copyright (C) 2006-2015 Masao Mutoh Copyright (c) 2006-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" T_APPLICATION = 0 T_COMBO_TEXT_COLUMN = 1 T_COMBO_MODEL = 2 T_COMBO_HAS_ENTRY = 3 T_COMBO_EDITABLE = 4 T_COMBO_TEXT = 5 # The COMPUTER combo model combo_model = Gtk::ListStore.new(String) %w(Ruby Perl Python Java).each do |v| iter = combo_model.append iter[0] = v end # The table model. model = Gtk::ListStore.new(String, # T_APPLICATION Integer, # T_COMBO_TEXT_COLUMN Gtk::ListStore, # T_COMBO_MODEL TrueClass, # T_COMBO_HAS_ENTRY TrueClass, # T_COMBO_EDITABLE String) # T_COMBO_TEXT view = Gtk::TreeView.new(model) # 1st column(Text) trenderer = Gtk::CellRendererText.new tcol = Gtk::TreeViewColumn.new("Application", trenderer, :text => T_APPLICATION) view.append_column(tcol) # 2nd column(Combo) crenderer = Gtk::CellRendererCombo.new crenderer.signal_connect("edited") do |_renderer, path, text| model.get_iter(path)[T_COMBO_TEXT] = text end ccol = Gtk::TreeViewColumn.new("Language", crenderer, :text_column => T_COMBO_TEXT_COLUMN, :model => T_COMBO_MODEL, :has_entry => T_COMBO_HAS_ENTRY, :editable => T_COMBO_EDITABLE, :text => T_COMBO_TEXT) view.append_column(ccol) # Create rows. (1..2).each do |v| iter = model.append iter[T_APPLICATION] = "application #{v}" iter[T_COMBO_MODEL] = combo_model iter[T_COMBO_HAS_ENTRY] = false iter[T_COMBO_EDITABLE] = true iter[T_COMBO_TEXT] = combo_model.get_iter("0")[0] end win = Gtk::Window.new win.signal_connect("delete_event") { Gtk.main_quit } win.add(view) win.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/tree-progress.rb000066400000000000000000000021541511343406000244300ustar00rootroot00000000000000=begin tree_progress.rb - Gtk::TreeView and Gtk::CellRendererProgress sample script. Copyright (C) 2004-2015 Darren Willis, Masao Mutoh Copyright (c) 2004-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" win = Gtk::Window.new("Gtk::CellRendererProgress sample") win.set_default_size(300, 50) model = Gtk::ListStore.new(String, Float) view = Gtk::TreeView.new(model) prog = model.append prog[0] = "bar 1" prog[1] = 50 prog1 = model.append prog1[0] = "bar 2" prog1[1] = 5 prog2 = model.append prog2[0] = "bar 3" prog2[1] = 10 arenderer = Gtk::CellRendererText.new acol = Gtk::TreeViewColumn.new("words", arenderer, :text => 0) view.append_column(acol) prenderer = Gtk::CellRendererProgress.new pcol = Gtk::TreeViewColumn.new("Progress", prenderer, :value => 1) view.append_column(pcol) win.signal_connect("delete_event") do Gtk.main_quit end win.add(view) win.show_all dir = 1 GLib::Timeout.add(100) do value = prog2[1] + dir dir = - dir if value > 100 dir = - dir if value < 0 prog2[1] += dir GLib::Source::CONTINUE end Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/treemodelfilter.rb000077500000000000000000000023461511343406000250230ustar00rootroot00000000000000#!/usr/bin/env ruby =begin treemodelfilter.rb - Gtk::TreeModelFilter sample Copyright (c) 2004-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" ls = Gtk::ListStore.new(String, Integer) column1 = Gtk::TreeViewColumn.new("data1", Gtk::CellRendererText.new, :text => 0) column2 = Gtk::TreeViewColumn.new("data2", Gtk::CellRendererText.new, :text => 1) mf = ls.create_filter mf.set_visible_func do |_model, iter| /a/ =~ iter[0] end mf.set_modify_func(String, String) do |model, iter, column| child_iter = model.convert_iter_to_child_iter(iter) if column == 0 child_iter[0] else "#{child_iter[1]} * 2 = #{child_iter[1] * 2}" end end treeview = Gtk::TreeView.new(mf) treeview.append_column(column1) treeview.append_column(column2) [ ["aaa", 1], ["aab", 2], ["aac", 3], ["bba", 4], ["bbb", 5], ["bbc", 6] ].each do |str, num| iter = ls.append iter[0] = str iter[1] = num end win = Gtk::Window.new("Gtk::TreeModelFilter sample") win.signal_connect("destroy") { Gtk.main_quit } win.add(treeview) win.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/treestore.rb000066400000000000000000000037741511343406000236540ustar00rootroot00000000000000#!/usr/bin/env ruby =begin treestore.rb - Gtk::TreeStore sample Copyright (c) 2016 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. Based on https://developer.gnome.org/gtk3/stable/TreeWidget.html =end require "gtk3" TITLE_COLUMN = 0 AUTHOR_COLUMN = 1 CHECKED_COLUMN = 2 model = Gtk::TreeStore.new(String, String, TrueClass) iter = model.append(nil) iter[TITLE_COLUMN] = "The Principle of Reason" iter[AUTHOR_COLUMN] = "Martin Heidegger" iter[CHECKED_COLUMN] = false iter = model.append(nil) iter.set_values(["The Art of Computer Programming", "Donald E. Knuth", true]) # append child child_iter = model.append(iter) child_iter[TITLE_COLUMN] = "Volume 1: Fundamental Algorithms" # append another child child_iter = model.append(iter) child_iter.set_value(TITLE_COLUMN, "Volume 2: Seminumerical Algorithms") child_iter.set_value(CHECKED_COLUMN, true) # append another child child_iter = model.append(iter) child_iter.set_values(["Volume 3: Sorting and Searching", "Donald E. Knuth", true]) def treeview_widget_of(model) treeview = Gtk::TreeView.new(model) treeview.append_column(Gtk::TreeViewColumn.new("Title", Gtk::CellRendererText.new, :text => TITLE_COLUMN)) treeview.append_column(Gtk::TreeViewColumn.new("Author", Gtk::CellRendererText.new, :text => AUTHOR_COLUMN)) treeview.append_column(Gtk::TreeViewColumn.new("Author", Gtk::CellRendererToggle.new, :active => CHECKED_COLUMN)) treeview end def display_model(model) win = Gtk::Window.new(:toplevel) win.title = "Simple Gtk::TreeStore" win.add(treeview_widget_of(model)) win.show_all win.signal_connect("destroy") { Gtk.main_quit } Gtk.main end display_model(model) ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/treeview.rb000066400000000000000000000035301511343406000234600ustar00rootroot00000000000000#!/usr/bin/env ruby =begin treeview.rb - Gtk::TreeView sample Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("Gtk::TreeView sample") # Create data model = Gtk::TreeStore.new(String, String, Gdk::RGBA, Float, GdkPixbuf::Pixbuf) # column 1 root_iter = model.append(nil) root_iter[0] = "Root" root_iter[1] = "red" root_iter[2] = Gdk::RGBA.new(0, 1, 0, 1) root_iter[3] = 5.0 # column 2 root_iter[4] = window.render_icon_pixbuf(Gtk::Stock::NEW, Gtk::IconSize::DIALOG) child_iter1 = model.append(root_iter) child_iter1[0] = "Child_Iter1" child_iter1[1] = "green" child_iter1[2] = Gdk::RGBA.new(1, 0, 0, 1) child_iter1[3] = 3.0 # column 2 child_iter1[4] = window.render_icon_pixbuf(Gtk::Stock::OPEN, Gtk::IconSize::MENU) child_iter2 = model.append(root_iter) child_iter2[0] = "Child_Iter2" child_iter2[1] = "yellow" child_iter2[2] = Gdk::RGBA.new(0, 0, 1, 1) child_iter2[3] = 0.9 # column 2 child_iter2[4] = window.render_icon_pixbuf(Gtk::Stock::QUIT, Gtk::IconSize::BUTTON) # Create view tv = Gtk::TreeView.new(model) # column 1 renderer = Gtk::CellRendererText.new column = Gtk::TreeViewColumn.new("Gtk::CellRenderText", renderer, { :text => 0, :background => 1, :foreground_rgba => 2, :scale => 3 }) tv.append_column(column) # column 2 renderer = Gtk::CellRendererPixbuf.new column = Gtk::TreeViewColumn.new("Gtk::CellRenderPixbuf", renderer, { :pixbuf => 4 }) tv.append_column(column) window.add(tv) window.set_default_size(300, 300) window.show_all window.signal_connect("destroy") { Gtk.main_quit } Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/window.rb000066400000000000000000000007251511343406000231400ustar00rootroot00000000000000#!/usr/bin/env ruby =begin window.rb - Gtk::Window sample. Copyright (c) 2002-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("Gtk::Window sample") window.signal_connect("destroy"){Gtk.main_quit} button = Gtk::Button.new(:label => "Hello World") button.signal_connect("clicked") do puts "hello world" Gtk.main_quit end window.add(button) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/misc/xbm-cursor.rb000066400000000000000000000052241511343406000237310ustar00rootroot00000000000000=begin xbm_cursor.rb - Gdk::Cursor sample script. Copyright (C) 2001-2006 Masao Mutoh Copyright (c) 2001-2015 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. =end require "gtk3" window = Gtk::Window.new("xbm Cursor example") window.signal_connect("destroy") { Gtk.main_quit } width = 19 height = 19 format = Cairo::FORMAT_A1 stride = Cairo::Format.stride_for_width(format, width) cursor_xbm_data = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x78, 0x00, 0xe0, 0x70, 0x00, 0xe0, 0x70, 0x00, 0xe0, 0x38, 0x00, 0xe0, 0x1f, 0x00, 0xe0, 0x1d, 0x00, 0xe0, 0x38, 0x00, 0xe0, 0x78, 0x00, 0xe0, 0xf0, 0x00, 0xf0, 0xf3, 0x01, 0xf0, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ].pack("C*") cursor_mask_xbm_data = [ 0x63, 0x8e, 0x0f, 0x67, 0x8e, 0x0f, 0x06, 0xc6, 0x07, 0x04, 0x00, 0x00, 0xf0, 0x3f, 0x08, 0xe7, 0x78, 0x0e, 0xe7, 0x70, 0x0f, 0xe4, 0x70, 0x03, 0xe0, 0x38, 0x00, 0xe7, 0x1f, 0x0c, 0xe7, 0x1d, 0x0f, 0xe0, 0x38, 0x0e, 0xe0, 0x78, 0x08, 0xe7, 0xf0, 0x00, 0xf7, 0xf3, 0x01, 0xf0, 0xe3, 0x01, 0x04, 0x00, 0x00, 0x46, 0x24, 0x06, 0x67, 0x66, 0x0e, 0x67, 0x66, 0x0e ].pack("C*") background_color = [0, 1, 0, 1] foreground_color = [1, 0, 0, 1] def xbm_data_to_cairo_data(data, width, stride) n_bytes_per_row = (width / 8.0).ceil cairo_data_bytes = [] data.unpack("C*").each_slice(n_bytes_per_row) do |row| row.each do |byte| cairo_data_bytes << byte end (stride - n_bytes_per_row).times do cairo_data_bytes << 0b0 end end cairo_data_bytes.pack("C*") end cursor_data = xbm_data_to_cairo_data(cursor_xbm_data, width, stride) cursor_mask_data = xbm_data_to_cairo_data(cursor_mask_xbm_data, width, stride) source = Cairo::ImageSurface.new(cursor_data, format, width, height, stride) mask = Cairo::ImageSurface.new(cursor_mask_data, format, width, height, stride) # Append mask on the source Cairo::Context.new(source) do |context| context.mask(mask, 0, 0) end # Convert the xbm FORMAT_A1 to FORMAT_ARGB32 cursor_surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, width, height) Cairo::Context.new(cursor_surface) do |context| context.set_source(*background_color) context.paint context.set_source(*foreground_color) context.mask(source, 0, 0) end offset_x = 10 offset_y = 10 cursor = Gdk::Cursor.new(cursor_surface, offset_x, offset_y) window.realize window.window.set_cursor(cursor) window.add(Gtk::Label.new("Put your cursor on this window.")) window.set_default_size(200, 100) window.show_all Gtk.main ruby-gnome-ruby-gnome-25972cb/gtk3/sample/tutorial/000077500000000000000000000000001511343406000222105ustar00rootroot00000000000000ruby-gnome-ruby-gnome-25972cb/gtk3/sample/tutorial/README.md000066400000000000000000001475621511343406000235060ustar00rootroot00000000000000# Getting started with GTK+ with the ruby-gnome2 Gtk3 module. This is a ruby adaptation of the official tutorial for the C language that you can find at https://developer.gnome.org/gtk3/stable/gtk-getting-started.html. GTK+ is a widget toolkit. Each user interface created by GTK+ consists of widgets. The Gtk3 module of the ruby-gnome2 project is an implementation of the ruby bindings for GTK+. With Gtk3, Widgets are organized in a hierachy. The Gtk::Window widget is the main container. The user interface is then built by adding buttons, drop-down menus, input fields, and other widgets to the window. If you are creating complex user interfaces it is recommended to use Gtk::Builder and its GTK-specific markup description language, instead of assembling the interface manually. You can also use a visual user interface editor, like Glade. GTK+ is event-driven. The toolkit listens for events such as a click on a button, and passes the event to your application. Here is the most basic example that illustrate the principles of widget hierarchy and events management: ```ruby require "gtk3" window = Gtk::Window.new("First example") window.set_size_request(400, 400) window.set_border_width(10) button = Gtk::Button.new(:label => "Say hello") button.signal_connect "clicked" do |_widget| puts "Hello World!!" end window.add(button) window.signal_connect("delete-event") { |_widget| Gtk.main_quit } window.show_all Gtk.main ``` This tutorial will mainly be focused on the use of Gtk::Application, which is the best way to create an application. ## Table of Contents * [Basics](#basics) * [Packing](#packing) * [Building user interfaces](#building-user-interfaces) * [Building Applications](#building-applications) * [A trivial application](#a-trivial-application) * [Populating the window](#populating-the-window) * [Link a template to a custom class widget](#link-a-template-to-a-custom-class-widget) * [Load a resource file](#load-a-resource-file) * [Opening files](#opening-files) * [An application menu](#an-application-menu) * [Adding the menu interface](#adding-the-menu-interface) * [Linking menu items to actions](#linking-menu-items-to-actions) * [Add accelerators for an action](#add-accelerators-for-action) * [A preference dialog](#a-preference-dialog) * [Define and store settings for an application with gschemas](#define-and-store-settings-for-an-application-with-gschemas) * [Configure the settings with a dialog window](#configure-the-settings-with-a-dialog-window) * [Adding a search bar](#adding-a-search-bar) * [Adding a sidebar](#adding-a-sidebar) * [Properties](#properties) * [Header Bar](#header-bar) ## Basics https://developer.gnome.org/gtk3/stable/gtk-getting-started.html#id-1.2.3.5 To begin our introduction to GTK, we'll start with a simple signal-based Gtk application. This program will create an empty 200 × 200 pixel window. * example-0.rb ```ruby require "gtk3" app = Gtk::Application.new("org.gtk.example", :flags_none) app.signal_connect "activate" do |application| window = Gtk::ApplicationWindow.new(application) window.set_title("Window") window.set_default_size(200, 200) window.show_all end puts app.run ``` When creating a Gtk::Application you need to pick an application identifier (a name) and input to `Gtk::Application#new` as parameter. For this example *org.gtk.example* is used but for choosing an identifier for your application see this [guide](https://wiki.gnome.org/HowDoI/ChooseApplicationID). Lastly `Gtk::Application#new` takes a `Gio::ApplicationFlags` constants as input for your application, if your application would have special needs (those constants can be replaced by theirs respective symbol ie. `Gio::ApplicationFlags::NONE` == `:flags_none`). You must know that `GApplication` ignores arguments passed to `g_application_run()` on the Windows systems. It always uses command line arguments even when we pass an empty array to g_application_run(). If you plan to create a cross-platform application, it is recommanded to use the `:handles_command_line` flags and the *command-line* signal. (reference : https://github.com/ruby-gnome2/ruby-gnome2/issues/721 ). Next we add instructions for the "activate" event of the `Gtk::Application` instance we created. The activate signal will be sent when your application is launched with the method `Gtk::Application#run` on the line below. This method also takes as arguments a ruby array of string. This allows GTK+ to parse specific command line arguments that control the behavior of GTK+ itself. The parsed arguments will be removed from the array, leaving the unrecognized ones for your application to parse. Inside the "activate" event block, we want to construct our GTK window, so that a window is shown when the application is launched. The call to `Gtk::ApplicationWindow#new` will create a new `Gtk::Window`. The window will have a frame, a title bar, and window controls depending on the platform. A window title is set using `Gtk::Window#set_title`. This function takes a string as input. Finally the window size is set using `Gtk::Window#set_default_size` and the window is then shown by GTK via `Gtk::Widget#show_all`. When you exit the window, by for example pressing the X, the `Gtk::Application#run` in the main loop returns with a number which is the exit status. While the program is running, GTK+ is receiving *events*. These are typically input events caused by the user interacting with your program, but also things like messages from the window manager or other applications. GTK+ processes these and as a result, signals may be emitted on your widgets. Connecting handlers for these signals is how you normally make your program do something in response to user input. The following example is slightly more complex, and tries to showcase some of the capabilities of GTK+. In the long tradition of programming languages and libraries, it is called *Hello, World*. * example-1.rb ```ruby require "gtk3" app = Gtk::Application.new("org.gtk.example", :flags_none) app.signal_connect "activate" do |application| window = Gtk::ApplicationWindow.new(application) window.set_title("Window") window.set_default_size(200, 200) button_box = Gtk::ButtonBox.new(:horizontal) window.add(button_box) button = Gtk::Button.new(label: "Hello World") button.signal_connect "clicked" do |widget| puts "Hello World" window.destroy end button_box.add(button) window.show_all end # Gtk::Application#run need C style argv ([prog, arg1, arg2, ...,argn]). # The ARGV ruby variable only contains the arguments ([arg1, arg2, ...,argb]) # and not the program name. We have to add it explicitly. puts app.run([$0] + ARGV) ``` As seen above, example-1.rb builds further upon example-0.rb by adding a button to our window, with the label "Hello World". Two new variables are created to accomplish this, button and button_box. The button_box variable stores a `Gtk::ButtonBox` object, which is GTK+'s way of controlling the size and layout of buttons. The `Gtk::ButtonBox` is created with the method `Gtk::ButtonBox#new` which takes a `Gtk::Orientation `constant as parameter or the related symbols (`:vertical` or `:horizontal`). The buttons which this box will contain can either be stored horizontally or vertically but this does not matter in this particular case as we are dealing with only one button. After initializing button_box with horizontal orientation, the code adds the button_box widget to the window widget using `Gtk::ButtonBox#add`. Next the button variable is initialized in similar manner. The method `Gtk::Button#new` is called which returns a GtkButton to be stored inside button. A label is set using a ruby hash as argument :`:label => "Hello World"`. Afterwards button is added to our button_box. Using the method "Gtk::Button#signal_connect" we add instructions, so that when the button is clicked, a message will be displayed in the terminal if the GTK application was started from one. After that, `Gtk::Window#destroy` is called. This method is herited from `Gtk::Widget`. This has the effect that when the button is clicked, the whole GTK window is destroyed. More information about creating buttons can be found [here](https://wiki.gnome.org/HowDoI/Buttons). The rest of the code in example-1.rb is identical to example-0.rb. Next section will elaborate further on how to add several GtkWidgets to your GTK application. ## Packing https://developer.gnome.org/gtk3/stable/ch01s02.html When creating an application, you'll want to put more than one widget inside a window. When you want to put more than one widget into a window, it it becomes important to control how each widget is positioned and sized. This is where packing comes in. GTK+ comes with a large variety of layout containers whose purpose it is to control the layout of the child widgets that are added to them. See [Layout Containers](https://developer.gnome.org/gtk3/stable/LayoutContainers.html) for an overview. The following example shows how the `Gtk::Grid` container lets you arrange several buttons: * example-2.rb ```ruby require "gtk3" app = Gtk::Application.new("org.gtk.example", :flags_none) app.signal_connect "activate" do |application| # create a new window, and set its title window = Gtk::ApplicationWindow.new(application) window.set_title("Window") window.set_border_width(10) # Here we construct the container that is going pack our buttons grid = Gtk::Grid.new # Pack the container in the window window.add(grid) button = Gtk::Button.new(:label => "Button 1") button.signal_connect("clicked") { puts "Hello World" } # Place the first button in the grid cell (0, 0), and make it fill # just 1 cell horizontally and vertically (ie no spanning) grid.attach(button, 0, 0, 1, 1) button = Gtk::Button.new(:label => "Button 2") button.signal_connect("clicked") { puts "Hello World" } # Place the second button in the grid cell (1, 0), and make it fill # just 1 cell horizontally and vertically (ie no spanning) grid.attach(button, 1, 0, 1, 1) button = Gtk::Button.new(:label => "Quit") button.signal_connect("clicked") { window.destroy } # Place the Quit button in the grid cell (0, 1), and make it # span 2 columns. grid.attach(button, 0, 1, 2, 1) # Now that we are done packing our widgets, we show them all # in one go, by calling Gtk::Widget#show_all on the window. # This call recursively calls Gtk::Widget#show on all widgets # that are contained in the window, directly or indirectly window.show_all end # Gtk::Application#run need C style argv ([prog, arg1, arg2, ...,argn]). # The ARGV ruby variable only contains the arguments ([arg1, arg2, ...,argb]) # and not the program name. We have to add it explicitly. status = app.run([$0] + ARGV) puts status ``` ## Building user interfaces https://developer.gnome.org/gtk3/stable/ch01s03.html When construcing a more complicated user interface, with dozens or hundreds of widgets, doing all the setup work in code is cumbersome, and making changes becomes next to impossible. Thankfully, GTK+ supports the separation of user interface layout from your business logic, by using UI descriptions in an XML format that can be parsed by the `Gtk::Builder` class. * example-4.rb : Packing buttons with GtkBuilder ```ruby require "gtk3" builder_file = "#{File.expand_path(File.dirname(__FILE__))}/builder.ui" # Construct a Gtk::Builder instance and load our UI description builder = Gtk::Builder.new(:file => builder_file) # Connect signal handlers to the constructed widgets window = builder.get_object("window") window.signal_connect("destroy") { Gtk.main_quit } button = builder.get_object("button1") button.signal_connect("clicked") { puts "Hello World" } button = builder.get_object("button2") button.signal_connect("clicked") { puts "Hello World" } button = builder.get_object("quit") button.signal_connect("clicked") { Gtk.main_quit } Gtk.main ``` Here is the "builder.ui" file that describes the interface: ```xml True Grid 10 True True Button 1 0 0 True Button 2 1 0 True Quit 0 1 2 ``` 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/). ## Building applications ### A trivial application https://developer.gnome.org/gtk3/stable/ch01s04.html#id-1.2.3.12.5 * exampleapp1/exampleapp.rb ```ruby require "gtk3" class ExampleAppWindow < Gtk::ApplicationWindow def open(file) end end class ExampleApp < Gtk::Application def initialize super("org.gtk.exampleapp", :handles_open) signal_connect "activate" do |application| window = ExampleAppWindow.new(application) window.present end signal_connect "open" do |application, files, hin| windows = application.windows win = nil unless windows.empty? win = windows.first else win = ExampleAppWindow.new(application) end files.each { |file| win.open(file) } win.present end end end app = ExampleApp.new puts app.run([$0]+ARGV) ``` In this example we create a subclass of `Gtk::Application` called ExampleApp. In the `ExampleApp#initialize` method, we add instructions for two signals *activate* and *open*. Every `Gtk::Application` object or its subclass object can react to 4 signals: * startup : sets up the application when it first start * shutdown : preforms shutdown tasks * activate : shows the default first window of the application * open : opens files and shows them in a new window For more informations, see [here](https://wiki.gnome.org/HowDoI/GtkApplication). In this case, the signal "*activate*" will be triggered if no arguments are given to the `ExampleApp#run` method. And a default window will be created and will be presented to the user ( [`Gtk::Widget#present`](https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk-window-present)). If file names are given to the `ExampleApp#run` method, then it is the "*open*" signal that is called. Trought this event, you can manage the files that are stored in an array of `Gio::File` objects. In this example, each files are used by an `ExampleAppWindow#open` method. The `ExampleAppWindow` class is derived from the `Gtk::ApplicationWindow`. This does not look very impressive yet, but our application is already presenting itself on the session bus, and it accepts files as commandline arguments. ### Populating the window https://developer.gnome.org/gtk3/stable/ch01s04.html#id-1.2.3.12.6 * exampleapp2/exampleapp.rb In this step, we use a [`Gtk::Builder`](https://developer.gnome.org/gtk3/stable/GtkBuilder.html) template to associate a [`Gtk::Builder`](https://developer.gnome.org/gtk3/stable/GtkBuilder.html) ui file with our application window class. Our simple ui file puts a [`Gtk::HeaderBar`](https://developer.gnome.org/gtk3/stable/GtkHeaderBar.html) on top of a [`Gtk::Stack`](https://developer.gnome.org/gtk3/stable/GtkStack.html) widget. The header bar contains a [`Gtk::StackSwitcher`](https://developer.gnome.org/gtk3/stable/GtkStackSwitcher.html), which is a standalone widget to show a row of 'tabs' for the pages of a [`Gtk::Stack`](https://developer.gnome.org/gtk3/stable/GtkStack.html) . Here is the "window.ui" file that contains the template of the window: ```xml ``` Unlike regular interface descriptions, in template XML descriptions, a`